从sub调用/运行sub时Excel VBA错误处理
让一些问题了解当您从sub调用/运行sub或函数时,errorhandling的作用从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的错误处理是否适用
- 如果被调用子系统中的错误处理具有“退出子系统”或“退出功能”,源子系统是否会继续运行
要回答第一个问题,请看下面的代码片段。
另一个子系统
中没有错误处理,因此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