【问题标题】:Workbook_Open handler not firing in add-in when opening workbooks打开工作簿时,Workbook_Open 处理程序未在加载项中触发
【发布时间】:2018-03-22 22:36:47
【问题描述】:

我有一个 Excel 加载项,我尝试使用该加载项插入代码,以便在满足某些条件时自动重命名工作簿。从我们的存储库导出时,所有工作簿都具有相同的名称,这导致“Excel 无法同时打开两个具有相同名称的工作簿”错误一遍又一遍地发生。当用户单击加载项中的按钮时,我已经让代码工作,但我尝试通过将代码放在加载项的“ThisWorkbook”部分来做同样的事情似乎不起作用。有没有办法通过插件做到这一点?

请在下面找到我的代码。

Private Sub Workbook_Open()
  Dim wbPath As Variant, wbNewname As Variant, newPath As Variant, wbname As Variant
  Dim fileExtension As Variant

  If ActiveWorkbook.Name Like "SR.*" Or ActiveWorkbook.Name Like "SR (#).*" And Application.ActiveWorkbook.Path Like "*Content.IE5*" Then

    Excel.Application.DisplayAlerts = False

    wbname = ActiveWorkbook.Name

    fileExtension = Right(wbname, Len(wbname) - InStrRev(wbname, ".") + 1)

    wbPath = Application.ActiveWorkbook.Path

    wbNewname = "SR" & Int((465480 - 1 + 1) * Rnd + 838588)

    newPath = wbPath & "\" & wbNewname & fileExtension

    ActiveWorkbook.SaveAs Filename:=newPath

    Excel.Application.DisplayAlerts = True

    Set wbPath = Nothing
    Set wbNewname = Nothing
    Set newPath = Nothing
    Set wbname = Nothing
    Set fileExtension = Nothing

  End If

End Sub

【问题讨论】:

  • 由于您必须在打开工作簿之前重命名它并且 Workbook_Open 子在您打开它之后运行,所以我认为这不会起作用
  • @CallumDA 就算是在工作簿打开之后发生也很够了
  • 如果你确定,那我一定是误解了你的问题
  • @CallumDA 即使打开后重命名工作簿,它仍然可以解决问题,因为任何跟随它的专家都不会有相同的工作簿名称
  • 您无法重命名已打开的文件。你能做的最好的就是用不同的名字保存一个副本......这就是你的代码似乎正在做的事情。

标签: vba excel


【解决方案1】:

ThisWorkbook 是您的加载项 - 它的 Open 事件在 加载项 文件打开时触发,而不是在 any 工作簿打开超过该点时触发.

您想要的是处理应用程序级事件,更具体地说是WorkbookOpen 事件。将私有 WithEvents 字段添加到您的 ThisWorkbook 模块:

Private WithEvents App As Excel.Application

Workbook_Open 处理程序中(即在启动时),Set 那个对象引用:

Private Sub Workbook_Open()
    Set App = Application
End Sub

现在,查看代码窗格顶部附近 - 有两个下拉菜单。左侧的下拉列表列出了所有可用的事件提供程序和接口(即Workbook,因为ThisWorkbook 是一个Workbook 对象,还有您在该模块中定义的任何WithEvents 字段和Implements 接口);选择您的 App 字段。

然后,右侧的下拉列表将列出您可以为App 处理的所有可用事件。选择WorkbookOpen 事件,VBE 将自动为您创建一个带有正确签名的过程存根:

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

End Sub

在该处理程序过程中,您可以放置​​在 Excel 中打开工作簿时要运行的代码。

【讨论】:

  • 嗨,Mathieu,感谢您的见解。也许您可以帮我找出我在代码中做错了什么:我现在收到“对象块或未设置块”错误。我使用与上面完全相同的代码
  • 我假设这意味着您的代码现在位于 WorkbookOpen 下,并且仍在针对 ActiveWorkbook 工作 - 将您的代码更改为针对 Wb 参数而不是(这是打开的工作簿);该事件可能在工作簿被激活之前触发。如果是别的什么,恐怕我的心灵感应调试技能是无与伦比的;-)
  • 你说得对...但是现在,一个新问题进入(dun dun):“隐藏模块中的编译错误:ThisWorkbook。此错误通常发生在代码与版本,平台不兼容时,或此应用程序的体系结构。” help file 似乎没有解决它。我将每个模块都更新为公共模块,结果没有变化。
  • 明确一点:ThisWorkbook 是 VBE Project Explorer 中“Microsoft Excel 对象”下列出的Workbook 模块,对吧?不确定那里的“公共模块”是什么意思......我不知道你在做什么,但我可以向你保证,我提供的解决方案没有这样的问题。如果您无法解决,也许可以发布一个新问题?确保包含足够的详细信息(以及屏幕截图,如果需要),以便查看者能够可靠地重现问题。
  • 哦。因此,在打开加载项时也会调用处理程序.... 好的,尝试将 If wb.FullName = ThisWorkbook.FullName Then Exit Sub 放在 WorkbookOpen 处理程序的顶部 - 如果处理程序正在为加载项本身运行,则应该退出。
猜你喜欢
  • 2015-04-04
  • 2018-09-21
  • 1970-01-01
  • 2021-10-26
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多