xlam Excel 插件是不是可以覆盖工作簿中的子项?

Posted

技术标签:

【中文标题】xlam Excel 插件是不是可以覆盖工作簿中的子项?【英文标题】:Is it possible for xlam Excel addin to override a sub from a workbook?xlam Excel 插件是否可以覆盖工作簿中的子项? 【发布时间】:2019-03-29 03:25:27 【问题描述】:

我正在构建的 xlam Excel 插件正在与外部来源的电子表格进行交互。问题在于,工作簿更改事件中的工作表以及其他内容中的代码会引发 MsgBox 弹出窗口,在等待用户输入时会干扰自动化。不直接调用弹出窗口 - Workbook Change 事件正在调用名为“ShowPopup”的自定义 Sub。然后在“ShowPopup”里面我们有 MsgBox 调用。

我的想法是,如果我可以覆盖 ShowPopup 子,我可以阻止它创建 MsgBox。有可能吗?

对潜在解决方案的限制:

完全覆盖 Workbook Change 事件是行不通的,那里确实需要一些东西。 我无法对 xlam Excel 插件与之交互的外部来源工作表的代码进行任何修改 Application.DisplayAlerts = False 不适用于显式调用的 MsgBox'es

【问题讨论】:

可能您可以(在运行时)从其他工作簿中删除 Msgbox 调用(通过 VBA 扩展库),但这可能很难管理。缺少这些(或用于监视和关闭消息框的 Windows API 调用)我不确定您能做多少。 @TimWilliams 你能指出我如何使用 VBA 扩展库删除“ShowPopup”子的正确方向吗? cpearson.com/excel/vbe.aspx 是一个很好的参考 如果这不是一个插件并且可以从 IDE 调用,Rubberduck 的单元测试Fakes API 可能会被滥用...但是在常规 VBA 中调用 Rubberduck 测试方法代码不会连接假货 - 测试引擎会。我们使用EasyHook 挂钩到VBA 库和-是的,覆盖MsgBox 调用。所以......这在技术上是可能的,是的。 @MathieuGuindon 我不想覆盖 MsgBox,我想覆盖一个名为“ShowPopup”的自定义子,它里面有一个对 MsgBox 的调用。我无法编辑文件本身的 VBA,但我有用于协助与该文件交互的 .xlam 插件。理想情况下,我想将文件中的“ShowPopup”子替换为 .xlam 插件中的子。 【参考方案1】:

我设法解决了我的问题,尽管不是按照我最初计划的方式。最后,它涉及覆盖 MsgBox 函数。

以下是步骤供将来参考。

    在任何 .xlam 插件模块中,创建一个全局变量 Global macroRunning As Boolean 在自动化循环所在的 sub 中,我们将其放在循环之前:macroRunning = True 并在循环之后相反。

    新建一个模块,我叫它MsgBoxHack,把这段代码放进去:

    Public Function MsgBox( _
    Prompt, _
    Optional Buttons As VbMsgBoxStyle = vbOKOnly, _
    Optional Title, _
    Optional HelpFile, _
    Optional Context _
    ) _
    As VbMsgBoxResult
    
      If IsMissing(Title) Then
          Title = "Overriden MsgBox"
      End If
    
      If macroRunning = False Then
          MsgBox = VBA.Interaction.MsgBox(Prompt, Buttons, Title, HelpFile, Context)
      End If
    
    End Function
    
      就是这样,当您的全局变量 macroRunning 设置为 True 时,您将看不到任何 MsgBoxes

缺点 - 当在 Excel 中启用插件时,此覆盖的 MsgBox 函数将在您处理的所有工作簿上运行。

【讨论】:

以上是关于xlam Excel 插件是不是可以覆盖工作簿中的子项?的主要内容,如果未能解决你的问题,请参考以下文章

从 Personal.xlam 工作簿调用函数

尽管已安装证书,但签名的 Excel VBA 插件 (*.xlam) 无法正常运行

如何使 XLAM UDF 调用可移植?

Excel VBA在生成副本的工作表中插入本工作簿中的VBA模块代码

excel里面我想 用VBA实现调用另一个工作簿中的数据怎么解决

Excel VBA - 循环遍历多个文件夹中的文件,复制范围,粘贴到此工作簿中