如果被调用的子调用“退出子”,则退出主子
我有一个调用另一个子程序的子程序,通常我需要退出被调用的子程序并停止执行调用它的子程序的其余部分。
所以我有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