为什么这个VBA错误处理程序不起作用?

时间:2016-10-28 13:47:29

标签: vba

我希望这个简单的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中的错误?

1 个答案:

答案 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