调用/从子运行子时Excel VBAerror handling
有一些问题明白什么时候调用/从子运行子function或function。
-
如果在调用子程序中没有error handling,那么源子程序的error handling是否适用?
-
如果error handling在被调用的sub有“退出子”或“退出function”将源代码子继续运行?
asd asd
Sub Testing() On Error GoTo ErrorHandling Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Call TestMinorSub ExitHandling: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Exit Sub ErrorHandling: MsgBox Err.Description Resume ExitHandling End Sub
非结构化的exception处理 – 正如微软定义它(而不是结构化的exception处理)不是最好的,可能会变得相当复杂。
所以在这个例子中,如果从某个调用站点调用子…
1.没有错误在调用TestMinorSub之后,子继续执行直到它通过exit sub退出。
2. TestMinorSub中有一个错误,而TestMinorSub有一个error handling程序。 这将根据如何在此函数中定义的错误来处理错误。 这个函数可以吞下错误,或者使用Err.Raise将其重新提交给Testing sub。
3. TestMinorSub中有错误,TestMinorSub没有error handling程序。 这将处理一个处理程序的调用堆栈,并跳回到将处理它的testingfunction。 它将跳转到ErrorHandling标签(这是这个函数的偶数句柄),它通过一个消息框显示错误。 然后继续到ExitHandling标签,在退出函数之前它将执行剩余的代码。
这种types的代码path对于VBA来说是相当普遍的,并且可以比你的例子复杂得多。 基本上开发人员试图捕捉错误,并在例程结束之前,错误执行一些清理代码。
要回答第一个问题,请看下面的代码片段。 AnotherSub
没有error handling,因此SourceSub
的error handling在:
Sub SourceSub() On Error GoTo Err: Call AnotherSub MsgBox "Source completed" Exit Sub Err: MsgBox "An error occurred in source" End Sub Sub AnotherSub() 'On Error GoTo Err: MsgBox Application.WorksheetFunction.Match("1", "abcd", 0) Exit Sub Err: MsgBox "An error occurred in ANotherSub" End Sub
因此, SourceSub
没有完成,因为您可以看到MsgBox "Source completed"
行未执行。
要回答第二个问题,如果取消注释来自AnotherSub
的error handling( On Error Goto Err:
AnotherSub
将处理该错误,结果SourceSub
将运行到完成,显示已完成消息框显示源已完成。
这意味着只要您处理相关程序中的错误, Exit Function
或Exit Sub
function不会有所作为。
这里开始error handling。
On Error GoTo ErrorHandling
如果错误,然后去ErrorHandling
如果没有错误,下一个代码将运行。 如果没有错误,子将退出“退出子”
ExitHandling: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Exit Sub
如果出现错误代码goea到这个地方,将运行这些行,并进入“ExitHandling”:
ErrorHandling:MsgBox Err.Description恢复ExitHandling
End Sub