【问题标题】:VBA Add-in When does ActiveWorkBook become active?VBA 插件 ActiveWorkBook 何时激活?
【发布时间】:2015-05-13 00:32:26
【问题描述】:

上下文: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”没有帮助)

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

【问题讨论】:

  • 你试过App.ActiveWorkbook.Name吗?
  • 您的代码还显示“ActiveWork”,而不是“ActiveWorkbook”
  • 为什么不MsgBox Wb.Name

标签: vba excel


【解决方案1】:

您没有处理没有工作簿处于活动状态的情况。 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 实际显示了工作表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2016-08-26
    • 2012-07-16
    • 2017-11-11
    相关资源
    最近更新 更多