Excel VBA错误处理不适用于第二个错误

use*_*535 1 excel vba excel-vba

在下面的代码中Errorhandler,当我输入未打开的工作簿或任何随机字符串时,可以正确处理第一个错误。但是,当我单击“重试”并再次输入一个随机名称时,会收到Subscript out of Range错误@ Workbooks(workbookname)。启用。

谁能帮助我为什么会这样以及如何使它工作。我已经尝试了很多东西。但是没有任何效果。此代码是较大程序的一部分。

Sub test()

Dim workbkname As String
On Error GoTo Errorhandler
Retry:

workbookname = InputBox("Enter workbook name:", _
                        "Name Enrty")
If StrPtr(workbookname) = 0 Then
    MsgBox ("Aborting Program")
    End
End If

Workbooks(workbookname).Activate
Exit Sub

Errorhandler:
Response = MsgBox("Workbook " & workbookname & " not found", vbRetryCancel)
If Response = 4 Then
    GoTo Retry

End If

End Sub
Run Code Online (Sandbox Code Playgroud)

Cod*_*key 6

这里的问题是,一旦给出了类似的指令,VBA错误处理程序就不会清除错误GoTo。结果,代码认为它在您的错误处理例程中遇到了错误,因此将错误抛出堆栈。

为了清除错误,您必须调用Resume一个继续Resume执行的位置(要么单独运行一次Resume Next以再次运行错误代码,以继续执行错误发生后的代码行,要么Resume可以在其后调用标签,如下所示:

Sub ErrTest
    On Error Goto ErrHndl
    For i = 0 to 5
        a = 1/i
nextiLabel:
    Next i

    Exit Sub
ErrHndl:
    Resume nextiLabel
End Sub
Run Code Online (Sandbox Code Playgroud)

您也可以使用Err.Clear()来消除错误,但是不建议这样做。

有关更多信息,请参见此处:Excel中的错误处理