2017-04-07 55 views
-1

我有一个VBA功能,用于从活动工作簿中复印工作表的列表并将其保存。我得到下标超出范围错误。任何帮助,将不胜感激?复制多个工作表时,下标超出范围错误VBA

Private Sub exporttoexcel(excelFileName) 
excelFileName = 'File in my local' 
Dim mySheetList() As String 
Dim WS As Worksheets 
Dim WB As Workbook 
MsgBox excelFileName 
'Dim sourceWB As Workbook 
'Dim destWB As Workbook 
' 
'Set sourceWB = ActiveWorkbook 
'sourceWB.Sheets.Copy 
' 
'Set WB = Workbooks(excelFileName) 
    ReDim mySheetList(0 To (ThisWorkbook.Sheets.Count) - 1) 
    Dim a As Integer 
     a = 0 

     For Each WS In ActiveWorkbook.Worksheets 
      mySheetList(a) = WS.Name 
      a = a + 1 
     Next 

Dim Fileobj 
Set Fileobj = CreateObject("Scripting.FileSystemObject") 
If Fileobj.FileExists(excelFileName) Then 
    Fileobj.DeleteFile excelFileName 
End If 

'  'actually save 
    Worksheets(mySheetList).Copy '<<<<<<< RUN-TIME ERROR 9 RAISED HERE 
    ActiveWorkbook.SaveAs FileName:=excelFileName 
    'MsgBox excelFileName 

    'ThisWorkbook.SaveAs FileName:=excelFileName, FileFormat:=xlXMLSpreadsheet 
    Application.Wait (Now + TimeValue("0:00:15")) 
    WB.Close 

End Sub 
+1

错误发生在哪里?在哪一行? – Lowpar

+0

另请参阅[运行时错误9:下标超出范围](http://stackoverflow.com/documentation/vba/8917/vba-run-time-errors/27748/run-time-error-9-subscript-超出范围#t = 20170407145205001556)的文件。 –

+1

'昏暗的WS作为工作表'应该'昏暗的WS作为工作表' - '工作表“是一个集合类,没有一个'名称'属性,所以我不知道你的'For Each WS In ActiveWorkbook.Worksheest '循环可以迭代一次而不会导致运行时错误13 /类型不匹配。 –

回答

0

我想你已经通过了片表的名称列表,即“工作表Sheet1”,“Sheet2的”,等等。但是,在传递数组时,必须使用函数Sheets(Array(mySheetList))

'Worksheets(mySheetList).Copy 
Sheets(Array(mySheetList)).Copy 
+0

对不起,我正在工作中用完了门 – Lowpar

+0

对不起。该错误出现在Worksheets(mySheetList).Copy中。 – Kavinathan

+1

无论何时提及*工作表*,“工作表”集合应优先于“表格”集合。 “表格”集合可以包含非工作表项目,例如图表。此外,OP的'mySheetList'已经是一个字符串数组了,所以我不确定将它包装在另一个数组中实际上会有所帮助。 –

0

这适用于我,我会尝试适应你的excelfilename。 ws作为工作表变暗也存在问题。我将来会使用Option Explicit。

Private Sub exporttoexcel() 
'excelFileName = 'File in my local' 
Dim mySheetList() As String 
Dim WS 
Dim WB As Workbook 
MsgBox excelFileName 
'Dim sourceWB As Workbook 
'Dim destWB As Workbook 
' 
'Set sourceWB = ActiveWorkbook 
'sourceWB.Sheets.Copy 
' 
'Set WB = Workbooks(excelFileName) 
    ReDim mySheetList(0 To (ThisWorkbook.Sheets.count) - 1) 
    Dim a As Integer 
     a = 0 

     For Each WS In ThisWorkbook.Worksheets 
      mySheetList(a) = WS.Name 
      a = a + 1 
     Next 

Dim Fileobj 
Set Fileobj = CreateObject("Scripting.FileSystemObject") 
If Fileobj.FileExists(excelFileName) Then 
    Fileobj.DeleteFile excelFileName 
End If 

'  'actually save 
    Sheets(mySheetList).Copy 
    ActiveWorkbook.SaveAs Filename:=excelFileName 
    'MsgBox excelFileName 

    'ThisWorkbook.SaveAs FileName:=excelFileName, FileFormat:=xlXMLSpreadsheet 
    Application.Wait (Now + TimeValue("0:00:15")) 
    WB.Close 

End Sub 
+0

为什么要将'WS'隐式的'Variant'而不是将其声明为'Worksheet'? –

+0

它在我的版本上导致错误。当我暗示它的工作,通常我没有这个问题 – Lowpar

+0

可能只是因为一个错字。你绝对可以将它声明为'Worksheet' - 我只是自己测试它。 OP的'作为工作表'抛出一个*类型不匹配*错误。 –

相关问题