在损坏的文件上绕过“运行时错误1004”

时间:2020-06-15 10:03:22

标签: excel vba

我有一个循环,该循环从工作表中的列表中打开多个文件,然后复制数据,其中一些文件已删除,但是我可以排除它们(运行时错误1004)。但是,某些文件已损坏,错误处理程序崩溃了。错误相同,原因不同。知道我怎么也可以排除这些吗?这些数据没有用,因此需要跳过。

Sub EDITING LOOP()

Application.DisplayAlerts = False
Application.EnableEvents = False

Dim i As Long

    With Workbooks("BOOK1.xlsb").Worksheets("SHEET1")

     For i = 2 To 29

        xfile = .Cells(i, 1)
        On Error GoTo ErrHandler

        Workbooks.Open (xfile)
        Application.Goto Reference:="TABLE1"
        Selection.copy
        ActiveWindow.Close

ErrHandler:

        If Err.Number <> 0 Then .Cells(i, 2) = "ERROR" Else .Cells(i, 2) = "OK"
        .Cells(i, 3) = Err.Number

Err.Clear      
' On Error Resume Next (TRIED BUT DIDN'T WORK) 
' On Error GoTo 0      (TRIED BUT DIDN'T WORK)

        Next

    End With

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

1 个答案:

答案 0 :(得分:0)

通常将错误测试封装在其自己的函数中会更好。这样,您可以更轻松地将“快乐之路”与“错误之路”分开。

Sub EDITINGLOOP()

    Application.DisplayAlerts = False
    Application.EnableEvents = False

    Dim i As Long

    With Workbooks("BOOK1.xlsb").Worksheets("SHEET1")

        For i = 2 To 29

            xfile = .Cells(i, 1)
            Dim myErrorNUmber As Long
            Dim myWorkbook As Excel.Workbook
            If Not TryOpenFile(xfile, myErrorNUmber, myWorkbook) Then

                .Cells(i, 2) = "ERROR"
                .Cells(i, 3) = myErrorNumber

            Else

                .Cells(i, 2) = "OK"
                Application.GoTo Reference:="TABLE1"
                Selection.Copy
                ActiveWindow.Close

            End If

        Next

    End With

    Application.ScreenUpdating = True
    Application.EnableEvents = True

End Sub


Public Function TryOpenFile(ByVal ipFileName As String, ByRef opErrorNum As Long, ByRef opWorkBook As Excel.Workbook) As Boolean

    On Error Resume Next
    Set opWorkBook = Workbooks.Open(xfile)
    opErrorNum = Err.Number
    TryOpenFile = Err.Number = 0
    On Error GoTo 0

End Function

您将注意到tryOpenFile函数返回错误号和对工作簿的引用(如果已成功打开)。打开工作表功能后,您当前的代码似乎对活动工作表做了一些毫无根据的假设。我没有尝试更正您的代码。

https://rubberduckvba.wordpress.com/2019/05/

中将详细讨论使用On Error Resume Next管理错误条件的测试。