如果被调用的子调用“退出子”,则退出主子

我有一个调用另一个子程序的子程序,通常我需要退出被调用的子程序并停止执行调用它的子程序的其余部分。

所以我有Add_Format_Button_Click调用另一个子程序的子程序:

call CheckEmptyComboboxValues

大多数情况下CheckEmptyComboboxValues最终会

Exit sub

但是Add_Format_Button_Click将继续执行它的其余部分。这是我需要帮助的地方,因为CheckEmptyComboboxValues退出时,我也需要Add_Format_Button_Click 退出。

有人能帮我解决这个看似简单的问题吗?

编辑:CheckEmptyComboboxValues包含数十个如果不是数百个遵循以下结构的 if 语句:

If Format_Layout.FilmType.Value = "" Then
    MsgBox "Specify a film type!", , ("Film Type"): Exit sub
End If

所以我想我需要将该exit sub值转换为我可以使用 if 语句在主子中检查的值

if CheckEmptyComboboxValues .value = "Exit sub" Then
exit sub

回答

3 种解决方案,每一种都适用于您的情况。我会选择第一个或最后一个解决方案。取决于项目其余部分的设计:

1. 功能

Function CheckEmptyComboboxValues() As Boolean
    If AnythingOddHappens Then
        Exit Function 
    End If

    CheckEmptyComboboxValues = True
End Function

这个函数的结果只有True当它运行到最后,无论何时你在它之前退出它False

Sub Example()
    If Not CheckEmptyComboboxValues Then Exit Sub

    'instead of 
    'Call CheckEmptyComboboxValues 
End Sub

2. 取消程序

Sub CheckEmptyComboboxValues(ByRef Cancel As Boolean)
    If AnythingOddHappens Then
        Cancel = True
        Exit Sub 
    End If

End Sub 


Sub Example()
    Dim Cancel As Boolean
    Call CheckEmptyComboboxValues(Cancel)  

    If Cancel Then Exit Sub
End Sub

这可以使用,但在这里我看不到任何优势,并且更喜欢上面的功能。如果您已经有一个带有返回值的函数并想要额外的取消,或者您为事件编写代码,则此方法很有用。

3. 抛出错误

Sub CheckEmptyComboboxValues()
    If AnythingOddHappens Then
        Err.Raise vbObjectError + 513, "CheckEmptyComboboxValues", "Something odd happened"
        Exit Sub
    End If
End Sub 

Sub Example()
    On Error Goto ERR_HANDLER
    Call CheckEmptyComboboxValues  

    Exit Sub
ERR_HANDLER:
    MsgBox "check failed"
End Sub

如果您有多个可能引发错误的检查过程/函数,这可能是一个优势。与您需要检查每个检查过程/函数的结果的第一个或第二个解决方案相比,该解决方案只需要一个错误处理程序,因此带有超薄代码。

这还有一个优点,即检查过程现在可以返回不同类型的错误,您的调用子可以使用这些错误为用户提供进一步的帮助。虽然前两个解决方案更像是“它没有通过检查”,但最后一个解决方案可以提供更详细的信息,例如“由于 A/B/C 发生而没有通过检查”,具体取决于引发的错误。

Sub CheckEmptyComboboxValues()
    If AnythingOddHappens Then
        Err.Raise vbObjectError + 513, "CheckEmptyComboboxValues", "Something odd happened"
        Exit Sub
    End If

    ' more code here …
    If AnythingDifferentOddHappens Then
        Err.Raise vbObjectError + 514, "CheckEmptyComboboxValues", "Something different odd happened"
        Exit Sub
    End If
End Sub 

现在,您可以使用不同的错误数字,以提供更detailde信息来源对关于用户的什么地方出了错,而不仅仅是什么地方出了错。

Sub Example()
    On Error Goto ERR_HANDLER
    Call CheckEmptyComboboxValues  

    Exit Sub
ERR_HANDLER:  'possibility to give a more detailed information
    Select Case Err.Number
    Case vbObjectError + 513
        MsgBox "check A failed"
    Case vbObjectError + 514
        MsgBox "check B failed"
    Case Else
        MsgBox "Undefined fail"
    End Select
End Sub


以上是如果被调用的子调用“退出子”,则退出主子的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>