VBA を使用してファイルが存在するかどうかを確認する

Glen Alfaro 2023年1月30日
  1. Dir() 関数を使用して、VBA を使用してファイルがコンピューターに存在するかどうかを確認する
  2. Dir() 関数にワイルドカードを導入して、VBA を使用してコンピューターにファイル/ S が存在するかどうかを確認する
  3. VBA を使用してコンピューターに存在するすべての名前を取得/カウント
VBA を使用してファイルが存在するかどうかを確認する

VBA は、特にデスクトップソフトウェア開発を扱う場合に、強力なコンピュータープログラミング言語です。VBA の優れた点の 1つは、コンピューター上のファイルと通信して操作する能力です。

このチュートリアルでは、特定のファイルが特定のパスに存在するかどうかを確認する方法を示します。これは、特にファイルへのアクセスや操作を処理する場合に、一般的に実行する必要のあるロジックです。

先に進む前に、最初にファイルが存在するかどうかを確認することをお勧めします。これは、プログラム全体がクラッシュする原因となるシステムエラーの発生を防ぐためです。

Dir() 関数を使用して、VBA を使用してファイルがコンピューターに存在するかどうかを確認する

以下のコードブロックは、Dir() 関数を使用してファイルが存在するかどうかを確認する方法を示しています。Dir() 関数は、ファイルパスを使用してフォルダ名とファイル名を取得するための強力なツールです。以下のコードブロックには、fileToCheck パラメータを持つサブルーチンが含まれています。パラメータとして fileToCheck を使用して、CheckFileExistence サブルーチンを呼び出すことができます。fileToCheck パラメータは、存在を確認するファイル名またはフォルダ名になります。

構文:

Dir([pathname],[attributes])

パラメーター:

[pathname] オプション。チェックするフォルダ名、ファイル名、またはファイルパス
[attributes] オプション。いくつかの属性を指定し、Dir() 関数はそれらの属性に基づいてファイル名を返します

[属性] については、以下の定義を参照してください。

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() 関数によって受け入れられるワイルドカードです。

? (疑問符) 任意の 1 文字を意味します。文字でも数字でもかまいません
*(アスタリスク) これは、行内の任意の数の文字を表します。

例:

この 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.

関連記事 - VBA File