从 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 部分中使用变量并访问它们以在另一个子例程中进行系统调用