VBA错误'下标超出范围'

时间:2016-03-18 05:37:50

标签: vba excel-vba excel

我正在尝试以xlsx格式创建一个支持大型宏(xlsm)文件的副本。

Sub Button1_Click()

    Dim wb As Workbook

    Set wb = Workbooks.Open("C:\original.xlsm")

    Dim mySheetList() As String
    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 ws

    'actually save
    Worksheets(mySheetList).Copy
    ActiveWorkbook.SaveAs Filename:="ORIGINAL_COPY.xlsx" 'default ext
    wb.Close

End Sub

我在下一行得到下标超出范围错误:

mySheetList(a) = ws.Name

3 个答案:

答案 0 :(得分:0)

您正在使用ThisWorkbook.Sheets调整数组大小,但循环使用ActiveWorkbook.Worksheets。您需要相同的参考,以避免在打开多个工作簿时出现问题。

答案 1 :(得分:0)

您使用了4种不同的工作簿参考:

wbThisWorkbookActiveWorkbook不一定是一回事。此外,当您使用Worksheets而不为工作簿引用添加前缀时,您将隐式引用Activeworkbook。并且,当您使用不带任何参数的Worksheets.Copy时,您将隐含地创建新工作簿。

目前,如果ThisWorkbook 更少的工作表比original.xlsm更少,那么您的数组将不会大到足以容纳大于ThisWorkbook中工作表数量的索引。这就是造成你越界错误的原因。

我调整了代码。这将打开XLSM,复制工作表,保存新的XLSX工作簿,并关闭原始XLSM,使新的XLSX工作簿保持打开状态。

Sub Button1_Click()

    Dim wbOriginal As Workbook
    Dim wbOutput As Workbook

    Set wbOriginal = Workbooks.Open("C:\original.xlsm")

    Dim mySheetList() As String
    ReDim mySheetList(0 To (wbOriginal.Sheets.Count) - 1)
    Dim a As Integer
    a = 0

    For Each ws In wbOriginal.Worksheets
        mySheetList(a) = ws.Name
        a = a + 1
    Next ws

    'Unfortunately, Worksheets.Copy isn't a function, so it doesn't
    'return the workbook that it creates, so we have to execute the
    'copy, then find the activeworkbook
    Worksheets(mySheetList).Copy

    Set wbOutput = ActiveWorkbook
    'actually save
    wbOutput.SaveAs Filename:="ORIGINAL_COPY.xlsx" 'default ext
    wbOriginal.Close

End Sub

答案 2 :(得分:0)

为什么要烦恼所有的循环?

Sub MM()

    Dim sourceWB As Excel.Workbook

    Set sourceWB = Workbooks.Open("C:\Original.xlsm")
    sourceWB.SaveAs "C:\ORIGINAL_COPY.xlsx", FileFormat:=xlOpenXMLWorkook
    sourceWB.Close False '// Optional

End Sub

.SaveAs()方法会更有效。

正如其他答案所述,您的问题似乎与wbActiveWorkbookThisWorkbook在实际上是不同的事情时可以互换使用。

  • wb是一个已设置为“C:\ original.xlsm”的工作簿对象。除非您关闭工作簿,清空对象或为其分配新对象,否则它将始终引用该工作簿。
  • ActiveWorkbook是指Excel前端窗口中当前活动的工作簿。 (即您可以在屏幕上看到的工作簿)
  • ThisWorkbook指的是当前正在执行的代码所属的工作簿。要快速解释差异:

工作簿A是唯一打开的工作簿,并且有一些代码可以打开另一个工作簿(我们称之为工作簿B)。

目前,工作簿A是ActiveWorkbook

工作簿A中的代码开始运行,工作簿A现在是ActiveWorkbook ThisWorkbook(因为正在运行的代码位于 此工作簿< / EM>

代码打开工作簿B,它自然会在Excel的最前端打开。现在,工作簿B是ActiveWorkbook,工作簿A仍然是ThisWorkbook

希望能为你清理一下......