如果找不到文件,如何跳过代码块?
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) > 0
更改为 If GeoErrPath<>vbNullstring
也是。
如果文件不存在,它仍然无法工作。当它试图通过文件名打开工作簿并且它不存在时,它不会继续代码,而是调试器出现说找不到文件。如果我“On Error Resume Next”,它会回到原来的问题。我似乎也无法让 On Error GoTo 工作。如果所有文件都可用,这很好用,但这种情况很少发生。
只是让您知道。我正在查找尽可能多的东西,并且整个早上都在努力让它发挥作用。我不只是在等待回复,所以如果我想出任何事情,我会告诉你。如果文件不存在,我只是无法让它通过文件。以上是关于如果找不到文件,如何跳过代码块?的主要内容,如果未能解决你的问题,请参考以下文章