如果找不到文件,如何跳过代码块?

Posted

技术标签:

【中文标题】如果找不到文件,如何跳过代码块?【英文标题】:How to skip a block of code if file is not found? 【发布时间】:2019-05-22 05:14:42 【问题描述】:

我的代码可以将 .csv 文档合并到一个工作簿中并编辑一些小事。它创建一个工作簿,从“暂存文件夹”中随机播放文件,然后自动调整/隐藏一些列/使第 1 行变为粗体。

.csv 是 Python 程序的输出,可以包含 1-8 个文件。八个文件中的每一个都有一个唯一的名称,并且在每个输出中都保持不变。

例如: 几何错误总是会给出一个名为几何错误的输出。 根据发现的错误,输出将始终包含八个文件的某种组合。

如果我没有所有八个文件,则代码无法正常工作。 它会在名为“DVIEW Staging”的暂存文件夹中查找,如果找不到该文件,则我有 On Error Resume Next 行。

Application.DisplayAlerts = False
Set newbook = Workbooks.Add
ActiveWorkbook.SaveAs Filename:=Aname & "DVIEW Outputs.xlsx"
    
Environ ("USERPROFILE") + "\DVIEW Staging"
On Error Resume Next

Workbooks.Open Filename:= _
        Environ("USERPROFILE") & "\Desktop\DVIEW Staging\Geometry_Errors_Table.csv"
        On Error Resume Next
    Sheets("Geometry_Errors_Table").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
        Columns("A:Z").EntireColumn.AutoFit
        Range("A:A,B:B,C:C,I:I,J:J,K:K,L:L").Select
        Selection.EntireColumn.Hidden = True
        Rows("1:1").Select
        Selection.Font.Bold = True
        Range("D1").Select
        On Error Resume Next
        
Workbooks.Open Filename:= _
        Environ("USERPROFILE") & "\Desktop\DVIEW Staging\Fiber_and_Splice_Relationship_Errors.csv"
        On Error Resume Next
    Sheets("Fiber_and_Splice_Relationship_E").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
        Columns("A:Z").EntireColumn.AutoFit
        Range("A:A,C:C").Select
        Selection.EntireColumn.Hidden = True
        Rows("1:1").Select
        Selection.Font.Bold = True
        Range("B1").Select
        On Error Resume Next

因此,当它找不到它时,它会运行 CURRENT 表(它找到的那个)上的所有隐藏和自动调整命令。这意味着如果输出文件夹中有一张纸,它可能会再运行七次自动调整/隐藏/粗体。

如果找不到文档,我如何阻止一段代码跳过?

我希望文件搜索下的代码块在该文件上运行,或者根本不运行。 我不希望 Geometry Errors 代码块隐藏 Fiber_and_Splice_Relationship_Errors 表上的七列,然后在此之后运行 Fiber_and_Splice_Relationship_Errors 命令(因为我只希望为那一列隐藏两列)。

【问题讨论】:

VBA check if file exists的可能重复 那个答案说如果找不到文件就退出子,我不希望它完全退出宏的其余部分。如果文件存在,我希望它运行所有 8 个块,但如果该文件不存在,则跳过单个代码块。 您是否尝试过使用If 语句先查看.csv 文件是否存在,如果该文件在目录中不存在,请使用GoTo 而不是On Error Resume Next 来查找下一个 .csv 文件。 On Error Resume Next 将忽略错误并运行下一行代码。 @J.Wagner 考虑将您的过程分解为更小的子过程:您的宏正在做太多事情,这就是为什么 - 并且 它需要控制流语句,例如If...Then...Else...End If。另请注意,重复运行On Error Resume Next 不会做任何事情;一次就足够了——如果需要的话(很少需要)。 Zack E,我认为这将是一个很好的方法!不过,让我先看看其他答案选项。 【参考方案1】:

试试下面的:

Option Explicit

Sub test()

    Dim FileName As String
    Dim Directory As String

    FileName = ThisWorkbook.Worksheets("Sheet1").Range("A1").Value

    If Len(FileName) = 0 Then
        Exit Sub
    End If

    Directory = "C:\Users\mario\Desktop\Marios\" & FileName

    If Len(Dir(Directory)) = 0 Then
      MsgBox "File does not exist"

    End If

End Sub

【讨论】:

如果我只是关心文件是否存在,这将起作用。如果找不到 8 个文件之一,我绝对不希望 Sub 退出。关键是我希望它分别运行每个潜在的 8 个文件,但如果找不到文档,则跳过一段代码。所以我们已经成功了一半。让我们在特定文件夹中查找文档,如果不存在,则运行 GoTo 行到我想要的下一个代码块。现在我的问题是我不知道如何专门为每个代码块设置文件夹和文件。【参考方案2】:

我终于找到了答案! Zack E 让我走上了正确的道路,但这是让它做我想做的事情的答案:

If MsgBox("This macro will combine DVIEW outputs. Do you wish to continue?", vbYesNo) = vbNo Then Exit Sub

    Dim FileGeoErrors As String
    Dim FileFiberAndSplice As String
Set newbook = Workbooks.Add
ActiveWorkbook.SaveAs Filename:=Aname & "DVIEW Outputs.xlsx"

FileGeoErrors = Environ("USERPROFILE") & "\Desktop\DVIEW Staging\Geometry_Errors_Table.csv"
FileFiberAndSplice = Environ("USERPROFILE") & "\Desktop\DVIEW Staging\Fiber_and_Splice_Relationship_Errors.csv"

If Dir(FileGeoErrors) <> "" Then
Workbooks.Open Filename:=FileGeoErrors
Sheets("Geometry_Errors_Table").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
            Columns("A:Z").EntireColumn.AutoFit
            Range("A:A,B:B,C:C,I:I,J:J,K:K,L:L").Select
            Selection.EntireColumn.Hidden = True
            Rows("1:1").Select
            Selection.Font.Bold = True
            Range("D1").Select
Else: GoTo 1
End If

1:
If Dir(FileFiberAndSplice) <> "" Then
Workbooks.Open Filename:=FileFiberAndSplice
Sheets("Fiber_and_Splice_Relationship_E").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
            Columns("A:Z").EntireColumn.AutoFit
            Range("A:A,C:C").Select
            Selection.EntireColumn.Hidden = True
            Rows("1:1").Select
            Selection.Font.Bold = True
            Range("B1").Select
Else: GoTo 2
End If

2:
If Dir(FileFiberCircuits) <> "" Then
Workbooks.Open Filename:=FileFiberCircuits
Sheets("Fiber_Has_Circuits").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
            Columns("A:Z").EntireColumn.AutoFit
            Range("A:A").Select
            Selection.EntireColumn.Hidden = True
            Rows("1:1").Select
            Selection.Font.Bold = True
            Range("B1").Select
Else: GoTo 3
End If

这里的关键是目录搜索,如果找到文件,它就会执行代码块。如果不是,它会跳转到按顺序编号的下一个块。这样,它会循环遍历所有 8 个 POTENTIAL 表,如果存在则运行代码,如果不存在则忽略它。

【讨论】:

很高兴您能找到解决方案。另一种方法是能够设置一个查找 .txt 文件的布尔函数,并在文件存在时分配一个变量,然后在模块中查找该特定变量。它也可能有助于简化代码。 扎克,非常感谢您的帮助和快速响应。这让我发疯了,而且和往常一样,当它真正解决时,解决起来相当简单。 使用GoTo?认真的吗?【参考方案3】:

未经测试,但这样的东西可能会起作用,当然可以根据您的需要对其进行编辑。

Sub Test()
    Dim FileGeoErrors As String
    Dim FileFiberAndSplice As String
    Dim GeoErrPath As String, FiberSplicePath As String
    Set newbook = Workbooks.Add

    ActiveWorkbook.SaveAs Filename:=Aname & "DVIEW Outputs.xlsx"

    Environ ("USERPROFILE") + "\DVIEW Staging"

    FileGeoErrors = Environ("USERPROFILE") & "\Desktop\DVIEW Staging\Geometry_Errors_Table.csv"
    FileFiberAndSplice = Environ("USERPROFILE") & "\Desktop\DVIEW Staging\Fiber_and_Splice_Relationship_Errors.csv"


    Workbooks.Open Filename:=FileGeoErrors
    Sheets("Geometry_Errors_Table").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
    GeoErrPath = FileGeoErrors
    ActiveSheet.Range("ZZ125") = GeoErrPath
        If Len(GeoErrPath) > 0 Then
            Columns("A:Z").EntireColumn.AutoFit
            Range("A:A,B:B,C:C,I:I,J:J,K:K,L:L").Select
            Selection.EntireColumn.Hidden = True
            Rows("1:1").Font.Bold = True
            Range("D1").Select
        End If
    Workbooks.Open Filename:=FileFiberAndSplice
    Sheets("Fiber_and_Splice_Relationship_E").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
    FiberSplicePath = FileFiberAndSplice
    ActiveSheet.Range("ZZ125") = FiberSplicePath
        If Len(FiberSplicePath) > 0 Then
            Workbooks.Open Filename:=FileFiberAndSplice
            Sheets("Fiber_and_Splice_Relationship_E").Move After:=Workbooks("DVIEW Outputs.xlsx").Sheets(1)
            Columns("A:Z").EntireColumn.AutoFit
            Range("A:A,C:C").Select
            Selection.EntireColumn.Hidden = True
            Rows("1:1").Font.Bold = True
            Range("B1").Select
        End If

End Sub

【讨论】:

我无法使 If Len 语句工作,它一直认为所有的都是零 我更新了答案以将文件路径保存到活动工作表中的单元格,然后测试单元格中的路径是否大于 0。您可以将 If Len(GeoErrPath) &gt; 0 更改为 If GeoErrPath&lt;&gt;vbNullstring也是。 如果文件不存在,它仍然无法工作。当它试图通过文件名打开工作簿并且它不存在时,它不会继续代码,而是调试器出现说找不到文件。如果我“On Error Resume Next”,它会回到原来的问题。我似乎也无法让 On Error GoTo 工作。如果所有文件都可用,这很好用,但这种情况很少发生。 只是让您知道。我正在查找尽可能多的东西,并且整个早上都在努力让它发挥作用。我不只是在等待回复,所以如果我想出任何事情,我会告诉你。如果文件不存在,我只是无法让它通过文件。

以上是关于如果找不到文件,如何跳过代码块?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代码块安装 fltk

如何获取 Webpack 中每个块包含的所有文件(或模块)的列表

WINDOWS 系统错误代码

WINDOWS 系统错误代码

WINDOWS 系统错误代码

继续尝试:除了:似乎没有跳过代码块