使用 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.