调用/从子运行子时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 FunctionExit Subfunction不会有所作为。

这里开始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