当一个嵌套的子程序输出一个Msgbox时,我该如何从一个子程序中退出?

5
在一个子程序(“Sensitivities”)中,我正在调用另一个子程序(“MVE_NIM_Subs.MVE_Main”),如果这个子程序输出一个MsgBox,我想结束这个子程序并去到定义的“Jump”,而不是继续执行该子程序。我该怎么做呢?
谢谢。
Public Sub Sensitivities() 
Application.Run "MVE_NIM_Subs.MVE_Main" 
........ 
Jump: 
End Sub

“MVE_NIM_Subs.MVE_Main”有多少个使用者?如果这是唯一的调用,为什么不将其包含在“Public Sub Sensitivities()”中?如果有多个调用者,您可以在显示MsgBox之前测试它是否会被显示,并退出“MVE_NIM_Subs.MVE_Main”。 - Mark Fitzgerald
让我猜猜,这是一家银行的财务模型,现在是进行压力测试的时候了 :). 太多的顾问进进出出,现在你被困在别人的代码中。MacroMan和Michal都有有效的方法。 - cyboashu
3个回答

3

您可以使用公共布尔变量来捕获Msgbox。在子程序MVE_NIM_Subs.MVE_Main中,修改代码以设置一个公共布尔变量为真,如果出现msgbox。

在此子程序结束后,执行将返回执行子Sensitivities内部的代码。然后只需检查公共布尔变量的值。如果是true,则转到Jump。

像这样:

Option Explicit
Public DidMsg As Boolean

Sub Sensitivities()

DidMsg = False
Application.Run "MVE_NIM_Subs.MVE_Main"

If DidMsg = True Then GoTo Jump
'rest of your code
'
'
'
'


Jump:
'rest of your code after point Jump
'
'
'
'
End Sub

Sub MVE_Main()

'your code whatever it is
'right after using the msgbox type:
DidMsg = True


End Sub

2

MsgBox是一种模态元素,因此代码执行会暂停,直到用户处理完它。这将留下两个选择:

  1. 不显示MsgBox(如果您只想在发生这种情况时停止代码,那么我不确定它的意义是什么?)

  2. 创建一个非模态用户窗体来模拟MsgBox。


1
我认为你有两个选择:
1. 将 `MVE_NIM_Subs.MVE_Main` 设为返回 `Bool` 类型的函数。当你在 `MVE_NIM_Subs.MVE_Main` 中显示消息框时,将返回值设置为 `True`。然后在调用子程序中,你可以写:
```If returnValue Then GoTo Jump```
2. 将 `MVE_NIM_Subs.MVE_Main` 保留为子程序,并声明一些全局的 `Bool` 变量,可以在两个子程序中使用。在外部子程序中,在调用 `MVE_NIM_Subs.MVE_Main` 之前将其设置为 `False`,并在 `MVE_NIM_Subs.MVE_Main` 中每当显示消息框时将其设置为 `True`。然后你可以在外部子程序中使用它来决定是否跳转,就像第一个选项一样 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接