我希望这个简单的VBA可以静默处理所有10个错误,但出于某种原因,只有第一个是静默处理的:
Public Sub HandleError()
For i = 1 To 10
On Error GoTo Continue
ThrowError
Continue:
Err.Clear
Next i
End Sub
Public Sub ThrowError()
Err.Raise vbObjectError + 1000
End Sub
这是上述代码的正确行为吗?或者这是VBA中的错误?
答案 0 :(得分:4)
您正在遍历错误处理标签,因此第二个错误是在错误处理程序 的上下文中引发 ,即使Next i
指令将代码执行移动到标签上方的一行。在清除错误后,需要通过调用Resume
显式地将执行移出错误处理上下文。这意味着您的错误处理程序需要在循环之外...
Public Sub HandleError()
For i = 1 To 10
On Error GoTo Continue
ThrowError
Next i
Exit Sub
Continue:
Err.Clear
Resume Next
End Sub
...或者有Resume
的第二个标签:
Public Sub HandleError()
For i = 1 To 10
On Error GoTo Continue
ThrowError
Continue:
Err.Clear
Resume NextLoop
NextLoop:
Next i
End Sub
很多 更好 只是测试特定代码行上的特定错误:
Public Sub HandleError()
For i = 1 To 10
On Error Resume Next
ThrowError
If Err.Number = vbObjectError + 1000 Then Err.Clear
On Error GoTo 0
Debug.Print i
Next i
End Sub