使用 VBA 检查文件是否存在

Glen Alfaro 2023年1月30日 2022年5月18日
  1. 使用 VBA 的 Dir() 函数来检查文件是否存在于计算机上
  2. Dir() 函数中引入通配符以使用 VBA 检查计算机中是否存在文件/S
  3. 使用 VBA 获取/计算计算机中存在的所有名称
使用 VBA 检查文件是否存在

VBA 是一种功能强大的计算机编程语言,尤其是在处理桌面软件开发时。VBA 的优势之一是它能够在计算机上通信和操作文件。

本教程将演示如何检查某个文件是否存在于某个路径中。这是一个典型的必须做的逻辑,尤其是在处理文件访问或操作时。

在继续之前检查文件是否存在是一种很好的做法。是为了防止发生系统错误,导致整个程序崩溃。

使用 VBA 的 Dir() 函数来检查文件是否存在于计算机上

下面的代码块演示了如何使用 Dir() 函数检查文件是否存在。Dir() 函数是一个强大的工具,通过使用它们的文件路径来获取文件夹名称和文件名称。下面的代码块包含一个带有 fileToCheck 参数的子程序。你可以使用 fileToCheck 作为其参数来调用 CheckFileExistence 子例程。fileToCheck 参数将是你要检查是否存在的文件名或文件夹名。

语法:

Dir([pathname],[attributes])

参数:

[pathname] 可选的。要检查的文件夹名、文件名或文件路径
[attributes] 可选的。将指定一些属性,Dir() 函数将根据这些属性返回文件名

对于 [attributes],请参见以下定义。

vbNormal (默认)指定没有属性的文件。
vbReadOnly 除了没有属性的文件之外,还指定只读文件。
vbHidden 除了没有属性的文件之外,还指定隐藏文件。
vbDirectory 除了没有属性的文件之外,还指定目录或文件夹。
vbSystem 除了没有属性的文件之外,还指定系统文件。在 Macintosh 上不可用。
Sub CheckFileExistence(fileToCheck as String)
Dim FileName As String
FileName = Dir(fileToCheck,vbNormal)

If FileName <> "" Then
    MsgBox "File Exists"
Else
    MsgBox "File Doesn't Exist"
End If
End Sub

Sub test1()

Call CheckFileExistence("Book1.xlsx")

test1 输出:

File Exists

请注意,文件 Book1.xlsx 可能位于你计算机上的任何文件夹中。Dir() 函数的好处是它可以检查计算机上所有文件夹中任何可能位置的文件。

因此,如果结果是文件不存在,则该文件名未在计算机上的任何文件夹或文件中使用。

Dir() 函数中引入通配符以使用 VBA 检查计算机中是否存在文件/S

此外,Dir() 函数允许在其参数上使用通配符。如果你不确定所需的确切文件名、文件夹名称和文件路径,这些通配符可用于搜索文件。

下面的列表是 Dir() 函数接受的通配符:

? (问号) 表示任何单个字符。它可以是字母或数字
*(星号) 它表示一行中任意数量的字符。

例子:

此 vba 代码块将检查是否存在 xlsx 文件类型的文件。因此,我们使用*.xlsx 搜索文件名。

Sub CheckFileExistence(fileToCheck as String)
Dim FileName As String
FileName = Dir(fileToCheck,vbNormal)

If FileName <> "" Then
    MsgBox "File Exists"
Else
    MsgBox "File Doesn't Exist"
End If
End Sub

Sub test2()

Call CheckFileExistence("*.xlsx")

End Sub

test2 输出:

File Exists

下面的 vba 代码将检查在任何文件类型中是否存在文件名只有 2 个字符长的文件。因此,我们使用 ??.* 来搜索文件名。

Sub CheckFileExistence(fileToCheck as String)
Dim FileName As String
FileName = Dir(fileToCheck,vbNormal)

If FileName <> "" Then
    MsgBox "File Exists"
Else
    MsgBox "File Doesn't Exist"
End If
End Sub

Sub test3()

Call CheckFileExistence("??.*")

End Sub

test3 输出:

File Exists

使用 VBA 获取/计算计算机中存在的所有名称

上面的代码块只是检测文件的存在,而没有获取有关这些文件的任何信息。在下面的代码块中,我们将列出与我们的搜索名称字符串匹配的所有现有文件。

对于下面的代码块,输出将是文件名长度为 1 到 4 个字母的所有 .xlsx 文件的文件名(????.xlsx)。


Sub ListAllFiles(fileToCheck As String)

Dim FileName As String

FileName = Dir(fileToCheck, vbNormal)

Do While FileName <> ""

    Debug.Print FileName
    FileName = Dir()
Loop


End Sub

Sub test4()

Call ListAllFiles("????.xlsx")

End Sub

test4 输出:

ATIC.xlsx
CS.xlsx
Data.xlsx
EA65.xlsx
edge.xlsx
fe10.xlsx
FV3P.xlsx
G!.xlsx
GZ7P.xlsx
HE6P.xlsx
IF.xlsx
IF27.xlsx
Lot.xlsx
SR.xlsx
Test.xlsx
WOP.xlsx

最后,下面的代码块将计算与我们的搜索名称字符串匹配的所有现有文件。

对于下面的代码块,输出将是文件名长度为 1 到 4 个字母的所有 .xlsx 文件的数量(????.xlsx)。

Sub CountAllFiles(fileToCheck As String)

Dim FileName As String
Dim fileCnt As Long

FileName = Dir(fileToCheck, vbNormal)

Do While FileName <> ""

    fileCnt = fileCnt + 1
    FileName = Dir()
Loop

Debug.Print "There are " & fileCnt & " existing files matched with the criteria."

End Sub

Sub test5()

Call CountAllFiles("????.xlsx")

End Sub

test5 输出:

There are 16 existing files matched with the criteria.