如何在 VBA 中访问*未保存的* Excel 工作簿?

如何在 VBA 中访问*未保存的* Excel 工作簿?

我有一个生成多个工作表的外部过程。该过程无法修改。生成这些工作表的过程不会保存它们。然后,它们会作为单独的 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

相关内容