【发布时间】:2020-03-09 06:40:51
【问题描述】:
我的代码从 Excel 表中列出的路径中检查文件列表是否存在。表中现有文件的值为 1,不存在的文件值为 0。
错误处理程序处理第一个错误,继续循环并继续验证,直到遇到第二个错误,然后显示错误消息并停止宏。
我已经尝试过不同的迭代,包括 resume 和 resume next,如其他地方所建议的那样,这会导致“误报”,因为代码会在失败的 if 语句下恢复“then”代码并将它们的值设为 1(存在)或获取在第二个错误处陷入无限循环。
Sub File_Check()
Dim Filename, Trade_day, Today, lastmodified As String
Dim MasterTable As ListObject
Dim i As Integer
Today = Format(Now(), "DD-MM-YYYY")
Trade_day = Range("Trade_day_file")
Set MasterTable = ThisWorkbook.Sheets("Dashboard").ListObjects("MasterTable")
MasterTable.ListColumns(1).DataBodyRange = 0
For i = 1 To MasterTable.ListRows.Count
On Error GoTo Does_Not_Exist
'Check date in filename
Filename = VBA.Dir(MasterTable.DataBodyRange(i, 3).Value & Trade_day & MasterTable.DataBodyRange(i, 4).Value)
If Filename <> vbNullString Then
MasterTable.DataBodyRange(i, 1) = 1
'Check file creation date instead
ElseIf Format(FileDateTime(MasterTable.DataBodyRange(i, 3).Value & MasterTable.DataBodyRange(i, 4).Value), "DD-MM-YYYY") = Today Then
MasterTable.DataBodyRange(i, 1) = 1
End If
GoTo Skip_Err_Handler
Does_Not_Exist:
MasterTable.DataBodyRange(i, 1) = 0
Err.Clear
Skip_Err_Handler:
Next i
【问题讨论】:
-
你不需要
GoTo Skip_Error_Handler。只需将Next i放在其位置即可。然后你需要一个 resume 或 exit sub 来退出错误处理程序。 -
在
Does_Not_Exist内,您应该以resume next结尾,这样它会继续到循环中的下一行(在导致错误的行之后)并且不会终止。 -
SJR 我试过这个,代码功能和 VBA.dir 在错误时返回一个空字符串,但是 FileDateTime 返回错误'文件不存在',而实际上它不存在。 @Darrel H 我刚试过这个(在错误处理程序上方有'Next i'并删除skip_err_handler)这导致第一个错误之后的子结束。
-
编写不需要错误处理程序的代码。如果您使用 scripting.filesystemobject 而不是 VBA 目录,您可以使用 FileExists 检查来确定文件是否存在。 scripting.filesystem 对象需要对 Microsoft Scripting 运行时的引用。此外,看看你是如何声明你的变量的,你应该在每个模块的开头插入“选项显式”,并安装出色的 RubberDuck 插件并查看你得到的代码检查结果。你会学到很多东西。
-
@Freeflow 我有明确的选项,只是没有包含在帖子中:) VB.Dir 完美地工作,因为当文件不存在时它不会返回错误消息而是返回 vbnullstring。当 FileDateTime 函数在循环中第二次应用于不存在的文件时,会出现错误消息。我一般同意错误处理,但我不知道使用 fso 方法确定文件创建日期和时间的方法。
标签: excel vba loops error-handling