Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Vba 如何停止调用多个sub的sub_Vba_Excel - Fatal编程技术网

Vba 如何停止调用多个sub的sub

Vba 如何停止调用多个sub的sub,vba,excel,Vba,Excel,我一直在创建一个工具,从其他Excel文件中提取数据,并进行各种类型的分析。由于这些不同的分析,我不得不创建多个sub,然后在一个“master”sub中调用这些sub,当用户按下按钮时,该sub被激活 我遇到的问题是在出现问题或用户试图自己停止代码时停止宏的错误处理-例如,出现一个带有“继续或停止”类型场景的弹出框。然而,我不知道如何使宏停止!使用Exit Sub不起作用,因为主Sub将跳转到队列中的下一个子节点 参见下面的示例-用户按下按钮激活master_sub。如果在sub1阶段中,用户

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

我遇到的问题是在出现问题或用户试图自己停止代码时停止宏的错误处理-例如,出现一个带有“继续或停止”类型场景的弹出框。然而,我不知道如何使宏停止!使用
Exit Sub
不起作用,因为主Sub将跳转到队列中的下一个子节点

参见下面的示例-用户按下按钮激活master_sub。如果在sub1阶段中,用户在MsgBox中选择“否”或“取消”,sub1将结束(如果使用
退出sub
),但master_sub将继续执行sub2和sub3。如何根据sub1中的输入/操作设置master_子站

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

不要使用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
“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

我保持了它的简单性,但基本上通过将a改为a,您可以让每个方法返回一个值,并在主例程(
master\u sub
)中根据返回的值决定要做什么。

如果您编写宏,您不使用VB.NETYeah,不确定VB.net标记来自何处。现在已修改。注意:此答案是在问题带有[vb.net]标记时发布的。答案不适用于[vba]。