我正在尝试以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
答案 0 :(得分:0)
您正在使用ThisWorkbook.Sheets调整数组大小,但循环使用ActiveWorkbook.Worksheets。您需要相同的参考,以避免在打开多个工作簿时出现问题。
答案 1 :(得分:0)
您使用了4种不同的工作簿参考:
wb
,ThisWorkbook
和ActiveWorkbook
不一定是一回事。此外,当您使用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()
方法会更有效。
正如其他答案所述,您的问题似乎与wb
,ActiveWorkbook
和ThisWorkbook
在实际上是不同的事情时可以互换使用。
wb
是一个已设置为“C:\ original.xlsm”的工作簿对象。除非您关闭工作簿,清空对象或为其分配新对象,否则它将始终引用该工作簿。ActiveWorkbook
是指Excel前端窗口中当前活动的工作簿。 (即您可以在屏幕上看到的工作簿) ThisWorkbook
指的是当前正在执行的代码所属的工作簿。要快速解释差异:工作簿A是唯一打开的工作簿,并且有一些代码可以打开另一个工作簿(我们称之为工作簿B)。
目前,工作簿A是ActiveWorkbook
。
工作簿A中的代码开始运行,工作簿A现在是ActiveWorkbook
和 ThisWorkbook
(因为正在运行的代码位于 此工作簿< / EM> 强>)
代码打开工作簿B,它自然会在Excel的最前端打开。现在,工作簿B是ActiveWorkbook
,工作簿A仍然是ThisWorkbook
希望能为你清理一下......