循环访问文件已损坏的文件夹中的文件时的错误处理

问题描述 投票:0回答:1

我有一个循环遍历特定文件夹中的文件的宏。

它尝试再次打开第一个文件(地址),我收到一条错误消息

文件已打开并正被其他用户使用
(或类似的东西)

此文件夹中有两个文件(地址/用户)。 这个小片段的目的是确保每个文件都有数据(以防止下游出现问题)。

地址文件可以打开并且有数据。下一个文件是 Users,它已损坏且无法打开,因此

On Error GoTo BadFile
启动。该宏对损坏的文件执行了我想要的操作,但随后返回到主循环,并在出现以下情况时再次尝试打开地址文件:显示错误消息。

可能有六个文件,我正在尝试确定每个文件的状态。

X = 1
    
For Each XFILE In xFolder.Files
        
     MyWB = ""
        
     On Error GoTo badfile
        
     objExcelApp.Workbooks.Open (XFILE)
    
     MyWB = ActiveWorkbook.Name
        
     If Len(Trim(Cells(2, 1))) = 0 Then
        
          ReDim Preserve MyFile(1 To X)
          MyFile(X) = ActiveWorkbook.Name
            
          If InStr(1, MyFile(X), "Address") > 0 Then Got1 = True
          If InStr(1, MyFile(X), "Commodities") > 0 Then Got2 = True
          If InStr(1, MyFile(X), "GL") > 0 Then Got3 = True
          If InStr(1, MyFile(X), "Suppliers") > 0 Then Got4 = True
          If InStr(1, MyFile(X), "Users") > 0 Then Got5 = True
          If InStr(1, MyFile(X), "Translate") > 0 Then Got6 = True
            
          objExcelApp.Workbooks(MyWB).Close False
       
BadFile:
            
          ReDim Preserve MyFile(1 To X)
            
          MyWB = XFILE
          MyWB = Replace(MyWB, "\\VS600\", "")
          MyWB = Replace(MyWB, "Testing\", "")
          MyWB = Replace(MyWB, "Data Files\", "")

          MyFile(X) = MyWB
            
          If InStr(1, MyFile(X), "Address") > 0 Then BadFileGot1 = True
          If InStr(1, MyFile(X), "Commodities") > 0 Then BadFileGot2 = True
          If InStr(1, MyFile(X), "GL") > 0 Then BadFileGot3 = True
          If InStr(1, MyFile(X), "Suppliers") > 0 Then BadFileGot4 = True
          If InStr(1, MyFile(X), "Users") > 0 Then BadFileGot5 = True
          If InStr(1, MyFile(X), "Translate") > 0 Then BadFileGot6 = True
           
          X = X + 1
         
     Else
         
          objExcelApp.Workbooks(MyWB).Close False
          
     End If
        
Next XFILE

我希望它退出循环并继续宏的其余部分。

excel vba fso
1个回答
1
投票

很难说到底是什么失败了,但我认为像您一样使用错误处理程序可能会导致问题。您永远不会停用

On Error Goto BadFile
。这意味着每当代码中发生运行时错误时,它都会跳转到该位置。

现在考虑循环中的任何语句,甚至在完成循环后,都会发出运行时错误:代码将跳回到

BadFile:
。无论
XFile
的内容是什么,该文件都将被(再次)处理并作为“坏文件”处理。

您不应该以这种方式使用错误处理来控制程序的流程。在您的情况下,您只想使用错误处理程序来检查是否可以打开工作簿。因此,将其范围限制为该声明:

    Dim wb As Workbook
    Set wb = Nothing
    On Error Resume Next
    Set wb = Workbooks.Open(file)
    On Error GoTo 0
    
    If wb Is Nothing Then
        ' Handle Error here
    Else
        ' Handle success here
        wb.Close False
    End If

现在,代码将对刚刚打开的工作簿的引用分配给变量

wb
。如果失败,
wb
将保持
Nothing
,您可以在之后禁用错误处理程序来检查。

您的代码还有很多改进的空间,最令人痛苦的一件事是收集所有文件名的

Redim Preserve
。不使用数组,只需使用
Collection
。集合是为了增长或缩小而构建的,而数组(在 VBA 中)是为数组构建的,您在某个时刻知道它有多大。
Redim Preserve
是一个代价高昂的操作,因为需要复制整个数组。

Dim MyFiles As New Collection
For Each XFile in folder.Files
    ...
    MyFiles.Add wb.Name
© www.soinside.com 2019 - 2024. All rights reserved.