【问题标题】:Bypassing "Run-Time Error 1004" on corrupt file绕过损坏文件上的“运行时错误 1004”
【发布时间】:2020-06-15 19:20:58
【问题描述】:

我有一个循环,它从工作表的列表中打开多个文件,然后复制数据,其中一些文件已被删除,但我可以排除这些(运行时错误 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

【问题讨论】:

标签: excel vba


【解决方案1】:

通常最好将错误测试封装在自己的函数中。通过这种方式,您可以更轻松地将“快乐路径”与“错误路径”分开。

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 来管理错误条件的测试

【讨论】:

  • 感谢您为此所做的工作。我已经尝试过了,但我得到了一个无效或不合格的功能。我不太明白那个功能。也许更简单的查看方法是如果我在 a 列中有一个文件列表,使用 i 循环如何检查这些文件是否有效
  • 使用文件系统对象,以便您可以测试每个文件是否存在(使用exists 方法)。您在 excel 中的名称列表可以加载到 VBA 数组中,因此您应该能够对文件名进行 for each 循环。
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2017-12-14
相关资源
最近更新 更多