gpt4 book ai didi

VBA 插件 ActiveWorkBook 何时变为事件状态?

转载 作者:行者123 更新时间:2023-12-02 16:12:13 24 4
gpt4 key购买 nike

上下文: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”(如预期在消息框中),然后如预期“Cell OK”。
但随后出现错误“Object required”,引用了 MsgBox“ActiveWorkBook.Name”行,因此此时 Book1 还不是 ActiveWorkBook。什么时候变成这样了?或者我怎样才能做到这一点? (MsgBox 之前的“Wb.Activate”之类的内容没有帮助)

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

最佳答案

您没有处理没有事件工作簿的情况Workbook_Open 在打开的工作簿被激活之前被调用,因此当该代码运行时,Application.ActiveWorkbook 很可能是Nothing - Excel 实际启动的任何时间。

简单的解决方案是在 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

加载项启动时,您将看到“已打开”消息框(而背景仍然显示没有任何工作簿的空工作区) - 然后弹出“已激活”消息框一旦 Excel 实际显示工作表,就会启动。

关于VBA 插件 ActiveWorkBook 何时变为事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30195510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com