从sub调用/运行sub时Excel VBA错误处理

从sub调用/运行sub时Excel VBA错误处理,vba,excel,Vba,Excel,让一些问题了解当您从sub调用/运行sub或函数时,errorhandling的作用 如果调用的sub中没有错误处理,源sub的错误处理是否适用 如果被调用子系统中的错误处理具有“退出子系统”或“退出功能”,源子系统是否会继续运行 自闭症 自闭症 要回答第一个问题,请看下面的代码片段。另一个子系统中没有错误处理,因此SourceSub的错误处理起作用: Sub SourceSub() On Error GoTo Err: Call AnotherSub MsgBox "Source c

让一些问题了解当您从sub调用/运行sub或函数时,errorhandling的作用

  • 如果调用的sub中没有错误处理,源sub的错误处理是否适用

  • 如果被调用子系统中的错误处理具有“退出子系统”或“退出功能”,源子系统是否会继续运行

自闭症 自闭症


要回答第一个问题,请看下面的代码片段。
另一个子系统
中没有错误处理,因此
SourceSub
的错误处理起作用:

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”
没有执行

要回答第二个问题,如果您取消注释另一个子系统的错误处理(
On error Goto Err:
另一个子系统将处理错误,因此,
SourceSub
将运行到完成,这由显示源代码已完成的消息框所指示


这意味着只要在相关过程中处理错误,
Exit函数
Exit子函数
就不会产生任何影响。

非结构化异常处理-正如Microsoft定义的那样(与结构化异常处理相反),不是最好的方法,可能会变得非常复杂

因此,在本例中,如果从某个调用站点调用sub

1。无错误 调用TestMinorSub后,sub继续前进,直到通过exit sub退出

2。TestMinorSub中有一个错误,TestMinorSub有一个错误处理程序。 这将根据其在此函数中的定义来处理错误。这 函数可以吞下错误,也可以使用Err.raise将其提升回测试子系统

3。TestMinorSub中有错误,TestMinorSub没有错误处理程序。 这将遍历处理程序的调用堆栈,并跳回将处理它的测试函数。它将跳转到ErrorHandling标签(这是此函数的偶数处理程序),在该标签中通过messagebox显示错误。然后,它将继续到标签ExitHandling,在那里它将在退出函数之前执行剩余的代码


这种类型的代码路径在VBA中非常常见,并且可能比您的示例复杂得多。基本上,开发人员试图捕获错误,在错误发生后,在例程结束之前执行一些清理代码。

这里开始错误处理

  On Error GoTo ErrorHandling 
如果出现错误,则转到错误处理
如果没有错误,将运行下一个代码。 如果没有错误,sub将在“退出sub”之前退出

如果出现错误,代码将转到此处,并将运行这些行并转到“ExitHandling”:
错误处理: MsgBox错误说明 恢复出境

End Sub
ExitHandling:
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
  Application.EnableEvents = True
  Exit Sub
End Sub