Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xlam Excel加载项是否可以覆盖工作簿中的子项?_Excel_Vba - Fatal编程技术网

xlam Excel加载项是否可以覆盖工作簿中的子项?

xlam Excel加载项是否可以覆盖工作簿中的子项?,excel,vba,Excel,Vba,我正在构建的xlam Excel加载项正在与外部来源的电子表格交互。问题在于,除了工作簿更改事件中的其他事件外,工作表还包含抛出MsgBox弹出窗口的代码,在等待用户输入时会影响自动化。不会直接调用弹出窗口-工作簿更改事件正在调用名为ShowPopup的自定义子项。然后在ShowPopup中,我们有MsgBox调用 我的想法是,如果我可以覆盖ShowPopup sub,我就可以阻止它创建MsgBox。有可能吗 潜在解决方案的制约因素: 完全覆盖工作簿更改事件是不可能的,实际上需要一些东西。 我无

我正在构建的xlam Excel加载项正在与外部来源的电子表格交互。问题在于,除了工作簿更改事件中的其他事件外,工作表还包含抛出MsgBox弹出窗口的代码,在等待用户输入时会影响自动化。不会直接调用弹出窗口-工作簿更改事件正在调用名为ShowPopup的自定义子项。然后在ShowPopup中,我们有MsgBox调用

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

潜在解决方案的制约因素:

完全覆盖工作簿更改事件是不可能的,实际上需要一些东西。 我无法对xlam Excel加载项正在与之交互的外部源表的代码进行任何修改 Application.DisplayAlerts=False不适用于显式调用的MsgBox
我设法解决了我的问题,尽管不是按照我最初计划的方式。最后,它涉及重写MsgBox函数

以下是步骤供将来参考

在任何.xlam addin模块中,创建一个全局变量global macroRunning作为布尔值 在自动化循环所在的子循环中,我们将其放在循环之前: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时,您将不会看到任何MsgBox
缺点-在Excel中启用加载项时,此重写的MsgBox函数将在您使用的所有工作簿上运行。

在运行时,您可能会通过VBA扩展性库从其他工作簿中删除MsgBox调用,但这可能很难管理。如果没有这些或Windows API调用来监视和关闭Messagebox,我不确定您能做多少。@TimWilliams您能告诉我如何使用VBA扩展性库删除ShowPopup Sub的正确方向吗?是一个很好的参考如果这不是一个外接程序并且可以从IDE调用,那么RuberDuck的单元测试Fakes API可能会被滥用来实现这一点。。。但是,在常规VBA代码中调用Rubberduck测试方法不会挂起假代码,测试引擎会挂起假代码。我们使用钩子连接到VBA库,并且-是的,重写MsgBox调用。所以这在技术上是可能的,是的。@MathieuGuindon我不想覆盖MsgBox,我想覆盖名为ShowPopup的自定义子项,该子项内部有一个对MsgBox的调用。我无法编辑文件本身的VBA,但我有.xlam加载项,用于帮助与该文件交互。理想情况下,我希望将文件中的ShowPopup子文件替换为.xlam addin中的子文件。