我有一个生成多个工作表的外部过程。该过程无法修改。生成这些工作表的过程不会保存它们。然后,它们会作为单独的 Excel 2010 工作簿保留:Book1、Book2、...、Book14。
我想让宏按顺序打开每一个,但无法让我的宏看到它们。
这不会起作用:
excel.application.Workbooks("Bookx").Activate
这不管用
excel.application.Workbooks(x).sheets(1).Activate
我的宏似乎只能看到活动工作簿;它没有意识到其他工作簿的存在。
打开未保存到文件的外部工作簿/工作表的正确方法是什么?
答案1
在 Visual Basic for Applications (VBA) 编辑器中打开一个立即窗口。
输入?excel.Application.Workbooks.Count 如果它正确打印出您打开的工作簿数量,您将能够使用excel.application.Workbooks("Bookx").Activate
(我刚刚在 2010 上尝试过)。(excel.Application.Workbooks(2).sheets(2).activate
也有效。)
但是,如果此外部进程在单独的实例中打开新工作簿,则它将不起作用。如果是这种情况,它们(根据设计)完全彼此独立,您将无法使用 VBA 来引用它们。
进入正确的工作簿后,在调试窗口中使用
?excel.Application.ActiveWorkbook.Sheets.Count
确定报告的纸张数量是否正确。如果正确,只需使用 引用每个纸张即可activeworkbook.sheets(x)
。如果调试窗口报告了错误的纸张数量,我认为您遇到了其他问题。
答案2
最好的解决方案似乎是使用获取对象方法。这对我来说非常有效:
Number_of_Books = 10
For PTR = 1 To Number_of_Books
Application.DisplayAlerts = False
Set xlApp = GetObject("Book" & PTR).Application
xlApp.Application.Workbooks("Book" & PTR).Sheets("Table").Activate
xlApp.Application.WindowState = xlMaximized
xlApp.Application.Workbooks("Book" & PTR).Sheets("Table").Select
xlApp.Application.ActiveWorkbook.SaveAs Filename:=DIRNAME_DATA & "Book" & PTR & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
xlApp.Application.ActiveWorkbook.Close
x = x + 1
Next