Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA错误处理无法处理第二个错误_Vba_Excel - Fatal编程技术网

Excel VBA错误处理无法处理第二个错误

Excel VBA错误处理无法处理第二个错误,vba,excel,Vba,Excel,在下面的代码中,当我输入未打开的工作簿或任何随机字符串时,Errorhandler正确地处理了第一个错误。但是,当我单击“重试”并再次输入一个随机名称时,我会在工作簿(workbookname)中出现“下标超出范围”错误。激活 有谁能帮我解释为什么会发生这种事,以及我怎样才能让它起作用。我试过很多东西。但一切都不起作用。此代码是较大程序的一部分 Sub test() Dim workbkname As String On Error GoTo Errorhandler Retry: work

在下面的代码中,当我输入未打开的工作簿或任何随机字符串时,Errorhandler正确地处理了第一个错误。但是,当我单击“重试”并再次输入一个随机名称时,我会在工作簿(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

这里的问题是,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
您也可以使用
Err.Clear()
来删除错误,但不推荐这样做


有关更多信息,请参见此处:

使用
恢复重试
而不是
转到重试