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 插件是不是可以覆盖工作簿中的子项?的主要内容,如果未能解决你的问题,请参考以下文章
尽管已安装证书,但签名的 Excel VBA 插件 (*.xlam) 无法正常运行
Excel VBA在生成副本的工作表中插入本工作簿中的VBA模块代码