【问题标题】:Run-time Error 1004; Error handling运行时错误 1004;错误处理
【发布时间】:2015-12-06 23:47:25
【问题描述】:

我的错误处理有问题。我正在为多个营业地点拼接一系列编号的文件。我已经编写了代码以在“文件不存在”的错误上移动到下一个位置循环,因为每个位置都有不同数量的文件。

即使进行了错误处理,我也会收到运行时 1004 错误。怎么会这样?它在第二个位置循环上轰炸,在第一个位置循环上起作用。为了安全起见,我使用了 15 个文件的循环,因为我遇到的最大值是 12。

    Sub OpenURL()

    Dim LocBackupFile As String
    Dim CurrentFile As String
    Dim HubFileName As String

    Application.DisplayAlerts = False
    Filedate = Format(Date, "mm-dd-yyyy")

    'Cycle through Hubs
    HubArray = Array("GA100%20-%20AHUB", "TX100%20-%20DHUB", "CA200%20-%20HHUB", "IN100%20-%20IHUB", "WA100%20-%20KHUB", _
            "AB100%20-%20LHUB", "MO100%20-%20MHUB", "NC100%20-%20NHUB", "OH100%20-%20OHUB", "PA100%20-%20SHUB", _
            "IN200%20-%20THUB", "UT100%20-%20UHUB", "ON100%20-%20VHUB", "MN100%20-%20WINO", "NL100%20-%20YHUB")

    For Hub = LBound(HubArray) To UBound(HubArray)

    HubName = Left(HubArray(Hub), 5)
    HubFileName = HubName & " NoLocBackup " & Filedate & ".xlsb"

        For CheckAndOpen = 1 To 15

            LocBackupFile = "http://fastnet.--------.com/sites/fastreports/Hubs/" & HubArray(Hub) & "/locbackup_ws" & CheckAndOpen & ".xls"

            On Error Resume Next
            Workbooks.Open FileName:=LocBackupFile
            On Error GoTo Done

            CurrentFile = "locbackup_ws" & CheckAndOpen & ".xls"
            If CheckAndOpen = 1 Then
                RowCount = ActiveSheet.UsedRange.Rows.Count
                Workbooks.Add.SaveAs FileName:="R:\" & HubFileName, FileFormat:=50
                If RowCount >= 65000 Then
                    DestRowCount = 65001
                End If
                Workbooks(CurrentFile).Sheets(1).Range("A1:H" & RowCount).Copy Destination:=Workbooks(HubFileName).Sheets(1).Range("A1")
            Else
                RowCount = ActiveSheet.UsedRange.Rows.Count
                If RowCount < 64999 Then
                    Workbooks(CurrentFile).Sheets(1).Range("A3:H" & RowCount).Copy Destination:=Workbooks(HubFileName).Sheets(1).Range("A" & DestRowCount)
                Else
                    Workbooks(CurrentFile).Sheets(1).Range("A3:H65000").Copy Destination:=Workbooks(HubFileName).Sheets(1).Range("A" & DestRowCount)
                    DestRowCount = DestRowCount + 64998
                End If
            End If

            Workbooks(CurrentFile).Close SaveChanges:=False

        Next CheckAndOpen

    Done:

    On Error GoTo 0

    Workbooks(HubFileName).Save
    Workbooks(HubFileName).Close

    Next Hub

    Application.DisplayAlerts = True

    End Sub

【问题讨论】:

  • 错误出现在哪一行?当您尝试保存并关闭 HubFileName 工作簿时,它是否真的打开了?
  • 错误处理之间的行:Workbooks.OpenFileName:=LocBackupFile

标签: excel vba error-handling runtime-error


【解决方案1】:

转到工具->选项->并在常规选项卡上将“错误捕获”更改为“未处理错误中断”

【讨论】:

  • 其实已经选中了。我也有同样的想法。这就是让我难过的地方。该错误已在代码中“处理”。
  • 哇 - 太奇怪了,然后 o_0 你有没有试过在该行之后使用Err.Clear 以确保不存在干扰第一个循环的现有错误?
  • 另外,在下一个循环之前,您实际上在代码中的哪个位置关闭了该工作簿?这可能是一个文件访问错误,尽管最终它仍然不应该提示
【解决方案2】:

我也遇到过同样的问题(错误处理未捕获错误 1004)。
我就是这样解决的:
我将代码放在 For 循环中的一个单独的“子”子(即 process_file)中,并将所有必需的参数传递给它。
为您:在“母亲”子 OpenURL() 中,您将拥有:

On Error GoTo err_line 'or do something else
For CheckAndOpen = 1 To 15
   has_err = True
   Call process_file( all required parameters here)
   has_err = False
err_line:
   if has_err then
      'your handling code goes here
   End If
Next

在母子 OpenURL() 之外,您将拥有:

Sub process_file(all required parameters here)
  '...code from the for in the mother....
End sub

子子进程文件中的错误处理仍然有效,但如果一切都失败了,母亲将恢复。

编辑 您可能希望使用此方法仅捕获破坏代码的行(仅将该行放在子子中,并在父子中进行错误处理)。此外,这是一种变通方法,而不是对问题的实际修复。

【讨论】:

  • 这不是处理错误,而是忽略错误
  • @chrisneilsen 正确的评论(ty),我已经调整了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2016-03-25
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多