从 VBA 中的另一个子例程中抑制 MsgBox

Posted

技术标签:

【中文标题】从 VBA 中的另一个子例程中抑制 MsgBox【英文标题】:Suppress MsgBox from another Subroutine in VBA 【发布时间】:2012-11-29 22:04:13 【问题描述】:

我有一个 VBA 子程序调用其他人编写的子程序。偶尔,另一个子会打开一个带有 OK 按钮的 MsgBox。另一个 sub 需要很长时间才能运行,我调用了数百次,所以我希望能够在一夜之间运行它。不幸的是,我想不出一种方法来自动单击 MsgBox 上的 OK。

我试过了

Application.DisplayAlerts = False

但这不会抑制消息框。

有什么办法吗?

谢谢

【问题讨论】:

这个类似问题的答案可能会让你到达那里:***.com/a/682732/493055 你不能编辑另一个子以删除 msgbox 调用吗? 它受密码保护。我想我可以四处打听一下,看看是谁写的。 【参考方案1】:

一种方法是稍微修改原始 sub 的代码。您将需要获得必要的权限...

通过在末尾添加一个额外的可选参数来修改原始子的标题,将默认值设置为True。这将导致类似Sub OriginalSubName(original set of parameters, Optional ShowMessages = True)

在调用msgbox的地方,这样修改代码:

If showMessages = True Then 'The = True part is important here - see below.
showMessages is a Variant type
    'The original statement that calls the msgBox
End If

原sub的其余代码保持不变

通过添加False 作为额外参数来修改调用原始sub 的行。这导致OriginalSubName您的参数集, False。这样,默认情况下您不会禁止显示该对话框,但在您的子程序中使用它时会这样做。

想知道为什么我使用可选的 Variant 类型参数吗?

可选部分:这可以防止其他现有的 sub 在调用修改后的 sub 时崩溃 Variant 类型部分:可选参数始终是 Variant 类型。这也是为什么您需要使用If showMessages = True Then 而不仅仅是If showMessages Then

【讨论】:

@Bart:可选参数并不总是必须是Variant类型。它们通常是变体的原因是因为您可以使用 ISMISSING() 函数来测试调用过程是否已传递了可选参数的值。如果可选参数的类型不是 Variant,则不能使用 ISMISSING()(它将始终返回 FALSE)。

以上是关于从 VBA 中的另一个子例程中抑制 MsgBox的主要内容,如果未能解决你的问题,请参考以下文章

在 GAS 中进行系统调用并在 .data 部分中使用变量并访问它们以在另一个子例程中进行系统调用

在子例程中保留 VBA 函数值

Excel VBA - 将类方法的名称传递给另一个子例程以调用该方法

如何在 Perl 子例程中处理已捕获和未捕获的错误?

如何从位于访问中的另一个子窗体中的组合框中过滤子窗体?

如何从Oracle中的另一个子查询中选择具有最大列的行