放入错误处理程序后得到运行时错误1004?

时间:2017-06-05 13:13:56

标签: excel vba excel-vba

为什么这不能抑制错误?

For i = 1 To Last_row

    On Error GoTo errorhandler1
    Set wkb = Workbooks.Open(Filename:=l)

    '' my code

errorhandler1:

next I

这就是我得到的:

this the error

3 个答案:

答案 0 :(得分:3)

在开始之前,您的代码未正确设置以进行错误处理。

我发现,一旦GoTo errohandler1在第一个实例中被执行,未来的调用将被忽略,以便在抛出错误时进行。

您当前的代码设置为在打开工作簿时忽略错误,您可以使用Resume Next,然后GoTo 0来重置错误处理方法。

    For i = 1 To Last_row

        On Error Resume Next
        Set wkb = Workbooks.Open(Filename:=l)
        On Error GoTo 0

        If Not wkb Is Nothing Then
            '' my code
        End If
    next I

如果你想真正处理错误 - 而不是忽略它们,你应该在循环之外这样做(强烈鼓励!)

    For i = 1 To Last_row
        On Error GoTo CleanFail
        Set wkb = Workbooks.Open(Filename:=l)
        '' my code
    next I

    Exit Sub

CleanFail:
    'deal with error

答案 1 :(得分:2)

On Error GoTo不仅仅是某种条件GoTo跳跃。

当运行时遇到错误,处于错误状态时,您需要清除。

错误处理子程序不仅仅是标签代码在发生错误时跳转到的地方 - 它处理运行时错误

跳转到Next语句,表明下一次迭代发生在运行时错误状态,因为你没有Clear错误状态...所以执行恢复并且一直在执行,就VBA运行时而言,循环体本身就成了错误处理子例程:VBA正在等待Err.Clear,或Resume Next,或任何其他告诉它的语句"所有好的,错误处理,移动,没有什么可看到这里"。

errorhandler1:
        Err.Clear
        On Error GoTo 0
    next i

这可以解决眼前的问题,但仍然会给你一个非常复杂的代码。最好从错误的路径中提取错误处理清除"。

答案 2 :(得分:1)

不确定为什么你不能绕过找不到错误的文件......

尝试使用子函数来返回打开的文件(如果找到)?

Function GetWorkBook(ByVal sFullName As String, Optional ReadOnly As Boolean) As Workbook
    Dim sFile As String: sFile = Dir(sFullName)
    On Error Resume Next
    Set GetWorkBook = Workbooks(sFile)
    If GetWorkBook Is Nothing Then Set GetWorkBook = Workbooks.Open(sFullName, ReadOnly:=ReadOnly)
End Function