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实际上有工作表显示。