[英]Excel VBA: array of Sheets, Copy from one Workbook to another
我正在尝试编写一个简单的 VBA 子程序:
这是我目前所拥有的:
Sub export()
Dim myPath, folderPath, fileName, exportFileFullPath As String
Dim arrayOfSheetsToCopy As Variant
folderPath = Application.ActiveWorkbook.Path
fullPath = Application.ActiveWorkbook.FullName
fileName = Replace(Application.ActiveWorkbook.Name, ".xlsm", "")
exportFileFullPath = folderPath & "\" & fileName & "_export.xlsx"
Workbooks.Add
ActiveWorkbook.SaveAs fileName:=exportFileFullPath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
arrayOfSheetsToCopy = Array("originalSheet1", "originalSheet2", "originalSheet3")
Workbooks(fullPath).Sheets(arrayOfSheetsToCopy).Copy After:=Workbooks(exportFileFullPath).Sheets(Sheets.Count)
End Sub
代码似乎一直在运行,直到 Sheets(arrayOfSheetsToCopy).Copy 出现“下标超出范围”错误...最初我虽然在工作表数组的定义中出现了某种语法错误,所以我尝试单独编写一个。复制每张工作表的说明。 相同的代码在相同的点以相同的错误中断。
任何想法? 谢谢!
Workbook.FullName
不返回Workbooks
集合的有效参数。
您可以通过在即时 Window 中运行?Workbooks(ActiveWorkbook.FullName).FullName
来测试它 - 它会出错。 另一方面, Workbook.Name
确实有效,所以?Workbooks(ActiveWorkbook.Name).FullName
不会出错。 换句话说Workbooks("C:\Users\fabbius\Documents\SomeFile.xlsx")
是无效的,而Workbooks("SomeFile.xlsx")
是有效的,只要该名称的文件是打开的。
但是,我看不到使用FullName
比使用正确定义的工作簿对象的好处:
Sub export()
Dim exportFileFullPath As String, arrayOfSheetsToCopy As Variant
Dim wsExportFrom As Workbook, wsExportTo As Workbook
Set wsExportFrom = ActiveWorkbook
Set wsExportTo = Workbooks.Add
exportFileFullPath = Replace(wsExportFrom.FullName, ".xlsm", "_export.xlsx", Len(wsExportFrom.Path))
'The Len() is in case the File Path contains ".xlsm" for some reason
wsExportTo.SaveAs fileName:=exportFileFullPath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
arrayOfSheetsToCopy = Array("originalSheet1", "originalSheet2", "originalSheet3")
wsExportFrom.Sheets(arrayOfSheetsToCopy).Copy after:=wsExportTo.Sheets(wsExportTo.Sheets.Count)
End Sub
当然,如果这个宏是从您打算从中导出的工作簿中运行的,那么With
和ThisWorkbook
会使事情变得更简单:
Sub export()
Dim exportFileFullPath As String, arrayOfSheetsToCopy As Variant
exportFileFullPath = Replace(ThisWorkbook.FullName, ".xlsm", "_export.xlsx", Len(ThisWorkbook.Path))
'The Len() is in case the File Path contains ".xlsm" for some reason
arrayOfSheetsToCopy = Array("originalSheet1", "originalSheet2", "originalSheet3")
With Workbooks.Add
.SaveAs fileName:=exportFileFullPath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
ThisWorkbook.Sheets(arrayOfSheetsToCopy).Copy after:=.Sheets(.Sheets.Count)
End With
End Sub
最后一点:在将工作表添加到文件之前,您正在保存文件。 这些线应该反过来吗?
这对我有用
Sub export()
Dim myPath, folderPath, fileName, exportFileFullPath As String
Dim arrayOfSheetsToCopy As Variant
Dim sht As Worksheet
Dim newWorkBook As Workbook
folderPath = Application.ActiveWorkbook.Path
fullPath = Application.ActiveWorkbook.FullName
fileName = Replace(Application.ActiveWorkbook.Name, ".xlsm", "")
fileName = Replace(fileName, ".xlsx", "")
exportFileFullPath = folderPath & "\" & fileName & "_export.xlsx"
Set newWorkBook = Workbooks.Add
Call newWorkBook.SaveAs(fileName:=exportFileFullPath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False)
For Each sht In ThisWorkbook.Sheets
Call sht.Copy(after:=newWorkBook.Sheets(Sheets.Count))
Next sht
Call newWorkBook.Close(saveChanges:=True)
End Sub
或者如果您想使用预定义的工作表名称
For Each sheetName In Array("originalSheet1", "originalSheet2", "originalSheet3")
Call ThisWorkbook.Sheets(sheetName).Copy(after:=newWorkBook.Sheets(Sheets.Count))
Next sheetName
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.