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

问题描述 投票:0回答:1

我正在构建的xlam Excel插件正在与外部源代码的电子表格进行交互。麻烦的是,工作簿更改事件中的工作表具有抛出MsgBox弹出窗口的代码,在等待用户输入时弄乱自动化。弹出窗口不是直接调用的 - Workbook Change事件正在调用名为“ShowPopup”的自定义Sub。然后在“ShowPopup”里面我们有MsgBox调用。

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

对潜在解决方案的限制:

  • 完全覆盖Workbook Change事件是不行的,那里有实际需要的东西。
  • 我不能对xlam Excel插件正在与之交互的外部源表单的代码进行任何修改
  • Application.DisplayAlerts = False对于显式调用的MsgBox'es不起作用
excel vba
1个回答
1
投票

我设法解决了我的问题,虽然不是我原先计划的方式。最后它涉及覆盖MsgBox函数。

以下是步骤。

  1. 在任何.xlam插件模块中,创建一个全局变量Global macroRunning As Boolean
  2. 在自动化循环所在的子区域中,我们将它放在循环之前:macroRunning = True和循环之后相反。
  3. 创建一个新模块,我称之为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函数将在您处理的所有工作簿上运行。

© www.soinside.com 2019 - 2024. All rights reserved.