任何人都可以在VBA中找到'On error goto -1'和'on error goto 0'之间的区别?我试过谷歌和msdn,但我没有运气.
Fra*_*ean 57
On Error GoTo 0 禁用过程中当前存在的任何错误捕获.
On Error GoTo -1 清除错误处理并将其设置为空,允许您创建另一个错误陷阱.
示例:On Error GoTo -1
在引发第一个错误之后,它将GoTo ErrorFound清除例程的错误处理并设置一个新GoTo AnotherErrorFound错误,这将在发现错误时发生.
Sub OnErrorGotoMinusOneTest()
On Error GoTo ErrorFound
Err.Raise Number:=9999, Description:="Forced Error"
Exit Sub
ErrorFound:
On Error GoTo -1 'Clear the current error handling
On Error GoTo AnotherErrorFound 'Set a new one
Err.Raise Number:=10000, Description:="Another Forced Error"
AnotherErrorFound:
'Code here
End Sub
Run Code Online (Sandbox Code Playgroud)
示例:On Error GoTo 0
引发第一个错误后,您将收到错误,因为已禁用错误处理.
Sub OnErrorGotoZeroTest()
On Error GoTo 0
Err.Raise Number:=9999, Description:="Forced Error"
End Sub
Run Code Online (Sandbox Code Playgroud)
D_B*_*ter 14
这个答案解决了错误对象和错误处理程序之间的混淆.
该错误对象可以使用被清除Err.Clear.这不会影响错误处理程序.
该错误处理程序成为使用启用On Error Goto <label>.它在发生错误时变为活动状态.
错误处理程序处于活动状态时,您无法分配新的错误处理程序.On Error Goto <label>没有效果.VBA只是忽略了分配新错误处理程序的尝试.
使用Err.Clear不会取消错误处理程序.
使用代码跳转到代码中的其他位置Goto <label>不会取消错误处理程序.使用Goto <label>在错误处理块会引起混淆,应加以避免.您可能认为错误处理程序不再处于活动状态,实际上它仍处于活动状态.
活动错误处理程序的作用是您无法分配新的错误处理程序.On Error Goto <label>没有效果.VBA只是忽略了分配新错误处理程序的尝试.错误处理程序处于活动状态时,任何其他错误都将无法处理.
退出活动错误处理程序的唯一方法是:
Resume Resume Next Resume <label> On error goto -1 使用这些方法中的任何一种来退出错误处理程序也将清除错误对象.
优秀来源:VBA芯片中的Pearson错误处理 Pearson On error goto -1在他的文章中没有提及.引用他:
我故意不包括On Error GoTo -1,因为它没有任何实际意义,并且可以锁定整个Excel应用程序,除非以完全正确的方式使用.是的,On Error GoTo -1在语法上是有效的,但它就像给醉酒的少年枪.它没有任何好处.
您还可以使用错误对象在不使用错误处理程序的情况下处理内联错误:MSDN内联错误处理