如何停止调用多个子的子

时间:2014-11-17 10:02:05

标签: vba excel-vba excel

我一直在创建一个工具,从其他Excel文件中提取数据并进行各种类型的分析。由于这些众多不同的分析,我不得不创建多个潜艇,然后所有潜艇都被召唤在一个" master" sub,当用户按下按钮时激活。

我遇到的问题是在出现问题或用户试图自行停止代码时停止宏的错误处理 - 例如出现一个弹出框,其中包含"继续或停止"类型场景。但是,我无法解决如何使宏停止的问题!使用Exit Sub不起作用,因为master sub会跳转到队列中的下一个sub。

参见下面的示例 - 用户按下按钮以激活master_sub。如果在sub1阶段内,用户选择" No"或"取消"在MsgBox中,sub1将结束(如果使用Exit Sub),但master_sub将继续执行sub2和sub3。如何根据sub1中的输入/操作使master_sub停止?

Sub sub1()
    Dim MyMsg as Variant
    MyMsg = msgbox("Do you wish to continue?", vbYesNo)
    If MyMsg = 7 then 'If user clicks "No"
        Exit Sub
    Else
        'Do stuff
    End if
End Sub

Sub sub2()
    'More stuff
End Sub

Sub sub3()
    'Other stuff
End Sub

master_sub()
    call sub1
    call sub2
    call sub3
End Sub

2 个答案:

答案 0 :(得分:0)

而不是使用Exit Sub抛出自定义异常并在master_sub中捕获它。

这样的东西
Sub sub1()
    Dim MyMsg as Variant
    MyMsg = msgbox("Do you wish to continue?", vbYesNo)
    If MyMsg = 7 then 'If user clicks "No"
       Throw new MyException
    Else
        'Do stuff
    End if
End Sub

master_sub()
 Try
    call sub1
    call sub2
    call sub3
 Catch ex as MyException
'Do something if you want
 End Try
End Sub

答案 1 :(得分:0)

" master_sub"检测其中一个子方法被取消时可以解决这个问题:

Sub master_sub()
    Dim result As Boolean

    result = Sub1()
    If (result = False) Then
        Exit Sub
    End If

    result = Sub2()
    If (result = False) Then
        Exit Sub
    End If

    result = Sub3()
    If (result = False) Then
        Exit Sub
    End If
End Sub

Function Sub1() As Boolean
    Return True
End Function

Function Sub2() As Boolean
    Return False
End Function

Function Sub3() As Boolean
    Return True
End Function

我保持简单,但基本上从Sub更改为Function,您可以让每个方法返回一个值并在您的主例程中决定({{1} })根据返回的值做什么。