VBA加载项ActiveWorkBook何时激活?

上下文:Excel 2013 VBA。 当使用加载项时,术语“ActiveWorkBook”应该是指正在编辑的文档,而“ThisWorkBook”是指在后台加载项。 考虑代码

在加载项的ThisWorkBook模块中

Private WithEvents App As Application Private Sub Workbook_Open() Set App = Application End Sub Private Sub App_WorkBookOpen(ByVal Wb As Workbook) MsgBox Wb.Name & " " & Wb.Worksheets(1).Cells(1, 1) If Wb.Worksheets(1).Cells(1, 1) = "AAA" Then MsgBox "Cell OK", MsgBox ActiveWork.Name End If End Sub 

加载项已启用,并启动了Excel。 到现在为止还挺好。 现在,如果我在Sheet1的单元格(1,1)中打开包含“AAA”的文件“Book1”,我将收到:

“Book1.xlsm AAA”(在消息框中按预期),然后按预期的“单元格确定”。
但是那么引用MsgBox“ActiveWorkBook.Name”行的错误“Object Required”所以​​在那一点Book1还不是ActiveWorkBook。 什么时候变成这样? 或者我怎么做到这一点? (在MsgBox之前没有任何帮助,就像“Wb.Activate”一样)

这个问题出现在一个更为复杂的现实世界中,而且这个问题似乎与安全问题有关。 我试图用一个简单的例子来理解这个行为

您不处理没有工作簿处于活动状态的情况Workbook_Open在打开工作簿被激活之前被调用,所以当代码运行时, Application.ActiveWorkbook很可能是Nothing – 任何时候Excel实际启动。

简单的解决scheme是在Workbook_Open使用wb引用 – 只有事件完成之后 ,才会设置ActiveWorkbook 。 如果设置了,那么它就不是你认为的工作簿:这是当wb开始打开时工作簿激活的工作簿。

看看你自己(在插件的ThisWorkbook代码隐藏):

 Private WithEvents app As Application Private Sub app_WorkbookActivate(ByVal Wb As Workbook) MsgBox "activated" End Sub Private Sub app_WorkbookOpen(ByVal Wb As Workbook) MsgBox "opened" End Sub Private Sub Workbook_Open() Set app = Excel.Application End Sub 

当插件开始时,你会看到“打开”的消息框(而背景仍然显示一个空的工作空间没有任何工作簿) ,然后popup“激活”消息框一旦Excel实际上有工作表显示。