[VBA]ファイルが存在するかチェック!FSO(FileSystemObject)を使おう

ExcelVBAの自動化で他のExcelファイルからデータを取得する場合など、Excelファイルを複数取り扱う際にファイルが存在しなくて実行時エラーが発生することはありませんか?
事前にVBAでファイルが存在するかのチェックの処理を入れることで、取得したいデータファイルがない場合においても実行時エラーではなく、スムーズにファイルが存在しないことを知らせることができるメッセージ分を表示させ、実行時エラーを回避することができます。

ExcelVBAでファイルが存在するかの確認する方法はいくつかありますが、その中でも「FileSystemObject(FSO)」を使用する方法は、シンプルで可読性が高いため、この方法をぜひ覚えてください。

参照設定を行いましょう

Excel VBA (1/4)

①VBE(Visial Basic for Applications)のタブから「ツール」を選択し、「参照設定」を選択してください。

②参照設定のウインドウが表示されたら「Microsoft Scripting Runtime」にチェックをいれて「OK」ボタンを押します。
(既にチェックが入っている場合は、変更なくてOKです)

これで、参照設定の設定が完了しました。
VBAのコードや処理で、FSO(FileSystemObject)を使用して処理を行うための事前準備が完了です。

FileSystemObjectの使い方

以下のVBAコードは、FSOを使用して指定したパスのファイルが存在するかどうかを確認する方法です。

今回は、Excelファイルで紹介していますが、Excelファイルでなく、CSVファイルやtxtファイル、画像ファイルなど、他のファイルのチェックも可能です。

Sub ファイル存在チェック()

Dim FSO As Scripting.FileSystemObject
Dim filePath As String
    
    ' ファイルのパスを設定(ExcelのセルにあるPathを取得してもOK)
    filePath = "C:\\Users\\User\\Documents\\sample.xlsx"
    
    ' FileSystemObjectを作成
    Set FSO = New Scripting.FileSystemObject
    
    ' ファイルの存在を確認
    If Not FSO.FileExists(filePath) Then
        MsgBox "ファイルは存在しません。",, "[ERROR]"
        End  '←ファイルがない場合はここで処理を終了させる
    End If
    
    ' オブジェクトの解放
    Set FSO = Nothing

End Sub


■■ コードの解説とポイント ■■

  1. 「Dim FSO As Scripting.FileSystemObject」を宣言します。
    (高速性を重視した際に、Dim FSO As Object ではなく、FSOオブジェクトとして初めから宣言しておくのがベストです)

  2. 「Dim filePath As String」でファイルのパスを指定します。
    上記の例では、わかりやすくコード上に直接Pathを設定していますが、ファイル選択ダイヤログから選択して取得したものであったり、Excelのシート上のセルに設定しているPathを取得したものを代入してもOKです。

  3. 「Set FSO = New Scripting.FileSystemObject」で 初期化したFSOオブジェクト をセットします。

  4. 「If Not FOS.FileExists(filePath) Then」 で指定したファイルが存在するかどうかをチェックします。
    今回は、「Not」とすることで、ファイルが存在しない場合のみをチェックしています。ファイルが存在する場合には、この分岐に該当せず、処理が続いていくようなコードの書き方です。
    エラーとなる場合、「ファイルが存在しない」というメッセージボックスを表示させ、処理を強制的に終了させるように「End」をコードに入れています。

  5. 「Set FSO = Notiong」 でオブジェクトを解放します。
    FSO(FileSystemObject)の役目が終了したら、オブジェクトを必ず解放しましょう。

FSOはフォルダの存在チェックもできる

上記では、VBAでファイルが存在するかどうかのチェックについて紹介しましたが、FSO(FileSystemObject)は、フォルダが存在するかどうかのチェックもできます。
VBAコードもファイルの存在チェックとほとんど似ていますが、ほんの少しだけ使用する関数が異なるので、下記のコードで確認をしていきましょう。

Sub フォルダ存在チェック()

Dim FSO As Scripting.FileSystemObject
Dim folderPath As String
    
    ' フォルダのパスを設定(ExcelのセルにあるPathを取得してもOK)
    folderPath = "C:\\Users\\User\\Documents"
    
    ' FileSystemObjectを作成
    Set FSO = New Scripting.FileSystemObject
    
    ' ファイルの存在を確認
    If Not FSO.FolderExists(folderPath) Then
        MsgBox "フォルダが存在しません。",, "[ERROR]"
        End  '←フォルダがない場合はここで処理を終了させる
    End If
    
    ' オブジェクトの解放
    Set FSO = Nothing

End Sub


📝コードの相違点

  1. Pathの相違
    ファイルの場合は、「ファイルのPath」
    フォルダの場合は、「フォルダのPath」を設定します。
  2. 関数
    ファイルの場合は、「FileExists」の関数を使用していますが、フォルダの場合は「FolderExists」の関数を使用します。

違いについては、理解できましたか?
ほとんど違いはないので、シンプルで覚えやすいですね。

ぜひ、ExcelVBAのFSO(FileSystemObject)を使用して、よりユーザービリティの高いExcelVBAを作れるように、覚えていきましょう。

📌 次に読むべきオススメ記事

🔹【VBAエラー解消法】64ビット対応「Declare PtrSafe Function」の書き方と注意点

🔹[VBA]Findメソッド完全ガイド!範囲内検索を効率よく行う方法

🔹[VBA]逆順で処理を実行!For Next Step-1の使い方と活用法

🔹[VBA] VarType関数で画像が選択されているかを判定!画像が貼り付けられていないエラーも解消できる方法