【PR】を含みます。

プログラミング

【VBA】ファイル・フォルダの存在確認をする方法|Dir関数とFileSystemObjectの使い分け

VBA ファイル・フォルダの存在確認をする方法 Dir関数とFileSystemObjectの使い分け

VBAでファイルを開いたり保存したりするときは、あらかじめファイルやフォルダが存在するか確認しておくと安心です。

存在しないパスをそのまま使ってしまうと、実行時エラーの原因になることがあります。

VBAで存在確認を行う方法としては、手軽に書きやすいDir関数と、ファイルとフォルダを明確に区別しやすいFileSystemObjectがよく使われます。

本記事では、それぞれの使い方だけでなく、実務ではどちらを使うべきか、どのように使い分けるべきかまで分かりやすく解説します。

結論:手軽に存在確認するならDir関数、厳密に確認するならFileSystemObject

VBAでファイルやフォルダの存在確認を行う方法としては、Dir関数とFileSystemObjectがよく使われます。

簡単な存在確認だけであればDir関数が手軽で使いやすく、ファイルとフォルダを明確に区別したい場合や、その後に作成やコピーなどの処理まで行う場合は、FileSystemObjectが向いています。

まずは「有無だけ確認したいのか」「その後のファイル操作まで見据えるのか」を整理したうえで、適した方法を選ぶことが大切です。

結論
  • 簡単な存在確認ならDir関数
  • ファイルとフォルダを明確に区別したい場合はFileSystemObject
  • 存在確認のあとにファイル操作まで続くならFileSystemObjectが便利

VBAでファイル・フォルダの存在確認が必要になる場面

VBAで存在確認が必要になるのは、単にファイルを開くときだけではありません。

たとえば、外部ファイルを読み込む前、ファイルを保存する前、出力先フォルダが存在するか確認したいときなど、実務では事前チェックを入れておいた方が安全な場面が多くあります。

存在しないパスをそのまま使うと実行時エラーの原因になり、処理が途中で止まることがあります。

そのため、ファイル操作の前に存在確認を入れておくことは、エラーを減らすうえでも有効です。

手軽に確認するならDir関数が使いやすい

Dir関数は、VBAでファイルやフォルダの存在確認を行うときに、もっとも手軽に使いやすい方法です。

追加の設定が不要で、短いコードで確認できるため、まず有無だけ確認したい場面に向いています。

Dir関数でファイルの存在確認をする方法

ファイルの存在確認は、Dir関数にファイルパスを指定することで行えます。

対象のファイルが存在する場合はファイル名が返り、存在しない場合は空文字が返ります。

Copyをクリックするとコピーできます。

VBA
Copy
Sub sampleFileExists()
    Dim filePath As String
    filePath = "C:\Users\user\Desktop\sample.xlsx"
    If Dir(filePath) <> "" Then
        MsgBox "ファイルは存在します"
    Else
        MsgBox "ファイルは存在しません"
    End If
End Sub

上記のC:\Users\user\Desktop\sample.xlsxの部分は、ご自身の環境に合わせて書き換えてください。

上記のように、読み込み前にファイルの有無を確認しておくだけでも、実行時エラーを防ぎやすくなります。

Dir関数でフォルダの存在確認をする方法

フォルダの存在確認では、Dir関数の第2引数にvbDirectoryを指定する方法がよく使われます。

保存先フォルダが存在するかどうかを事前に確認したい場面でも使いやすい方法です。

Copyをクリックするとコピーできます。

VBA
Copy
Sub sampleFolderExists()
    Dim folderPath As String
    folderPath = "C:\Users\user\Desktop"
    If Dir(folderPath, vbDirectory) <> "" Then
        MsgBox "フォルダは存在します"
    Else
        MsgBox "フォルダは存在しません"
    End If
End Sub

上記のC:\Users\user\Desktopの部分は、ご自身の環境に合わせて書き換えてください。

保存先や出力先のフォルダが環境によって異なる場合もあるため、事前に確認しておくと処理を安定させやすくなります。

Dir関数を使うメリット

  • 追加の設定が不要
  • コードを短く書きやすい
  • 単純な存在確認であれば十分対応できます

Dir関数を使うときの注意点

Dir関数は手軽ですが、フォルダ確認では使い方を正しく理解しておくことが大切です。

単純な存在確認には向いていますが、ファイルとフォルダを明確に区別したい場合は、FileSystemObjectを使う必要があります。

Dir(folderPath, vbDirectory)で注意したいパターン

Dir(folderPath, vbDirectory)はフォルダ確認でよく使われる書き方ですが、常に厳密にフォルダだけを判定できるとは限りません。

単純な存在確認には便利ですが、ファイルとフォルダを明確に区別したい場合は、使い方に注意が必要です。

より厳密にファイルとフォルダを区別したい場合や、その後にファイル操作まで行う場合は、FileSystemObjectを使う方が適しています。

より厳密に確認するならFileSystemObject(FSO)

FileSystemObjectは、ファイルやフォルダの存在確認だけでなく、作成・コピー・削除などもまとめて扱いやすい方法です。

ファイル確認用のFileExistsと、フォルダ確認用のFolderExistsが分かれているため、ファイルとフォルダを明確に区別しやすいのが特徴です。

FileSystemObject(FSO)でファイルの存在確認をする方法

Copyをクリックするとコピーできます。

VBA
Copy
Sub sampleFileExistsByFso()
    Dim fso As Object
    Dim filePath As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    filePath = "C:\Users\user\Desktop\sample.xlsx"
    If fso.FileExists(filePath) Then
        MsgBox "ファイルは存在します"
    Else
        MsgBox "ファイルは存在しません"
    End If
End Sub

上記のC:\Users\user\Desktop\sample.xlsxの部分は、ご自身の環境に合わせて書き換えてください。

FileSystemObject(FSO)でフォルダの存在確認をする方法

Copyをクリックするとコピーできます。

VBA
Copy
Sub sampleFolderExistsByFso()
    Dim fso As Object
    Dim folderPath As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    folderPath = "C:\Users\user\Desktop"
    If fso.FolderExists(folderPath) Then
        MsgBox "フォルダは存在します"
    Else
        MsgBox "フォルダは存在しません"
    End If
End Sub

上記のC:\Users\user\Desktopの部分は、ご自身の環境に合わせて書き換えてください。

FileSystemObject(FSO)を使うメリット

  • ファイルとフォルダを明確に区別しやすい
  • 存在確認のあとに作成・コピーなどの処理へつなげやすい
  • 存在確認の意図がコード上で分かりやすい

Dir関数とFileSystemObject(FSO)はどちらを使うべき?

どちらを使うべきかは、存在確認のあとにどのような処理を続けるかによって変わります。

方法向いているケース特徴
Dir関数単純な存在確認短く書けて手軽
FileSystemObject存在確認のあとにファイル操作も続く場合ファイルとフォルダを区別しやすく、拡張しやすい

単純な存在確認だけであれば、Dir関数でも十分対応しやすいです。

一方で、ファイルとフォルダを明確に区別したい場合や、存在確認のあとにフォルダ作成・ファイルコピーなどの処理が続く場合は、FileSystemObjectの方が整理しやすくなります。

まずは「存在確認だけで終わる処理か」「その後もファイル操作が続く処理か」で考えると、判断しやすくなります。

実践:存在確認からファイル操作までの定型コード

フォルダがなければ作成する例

Copyをクリックするとコピーできます。

VBA
Copy
Sub createFolderIfNotExists()
    Dim fso As Object
    Dim folderPath As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    folderPath = "C:\Users\user\Desktop\output"
    If Not fso.FolderExists(folderPath) Then
        fso.CreateFolder folderPath
    End If
End Sub

ファイルがあれば開く例

Copyをクリックするとコピーできます。

VBA
Copy
Sub openFileIfExists()
    Dim filePath As String
    filePath = "C:\Users\user\Desktop\sample.xlsx"
    If Dir(filePath) <> "" Then
        Workbooks.Open filePath
    Else
        MsgBox "ファイルが見つかりません"
    End If
End Sub

保存前にフォルダ存在確認をする例

Copyをクリックするとコピーできます。

VBA
Copy
Sub saveIfFolderExists()
    Dim folderPath As String
    Dim savePath As String
    folderPath = "C:\Users\user\Desktop"
    savePath = folderPath & "\sample.xlsm"
    If Dir(folderPath, vbDirectory) = "" Then
        MsgBox "保存先フォルダが存在しません"
        Exit Sub
    End If
    ActiveWorkbook.SaveAs savePath
End Sub

保存先フォルダが存在していても、同名ファイルがある場合は別の対策が必要です。

VBAでファイル名に連番を付けて重複を防ぐ方法は、以下の記事で詳しく紹介しています。

あわせて読む
VBA ファイル名に連番を付けて重複を防ぐ方法

【VBA】ファイル名に連番を付けて重複を防ぐ方法

VBAでファイルを保存する際、同名ファイルが存在すると上書きされてしまうリスクがあります。 本記事では、ファイル名の重複を自動で回避し、連番(例:test(1).txt)の付いたファイルパスを生成する ...

VBAで存在確認するときの注意点

パス指定のミスに注意する

存在確認がうまくいかない場合は、関数の使い方よりも、パス指定のミスが原因になっていることがあります。

ファイル確認では拡張子まで含めたフルパスになっているか、フォルダ確認では対象のパスを正しく指定できているかを確認しましょう。

存在確認だけでは保存エラーを完全には防げない

存在確認をしていても、それだけですべてのエラーを防げるわけではありません。

たとえば、保存先フォルダは存在していても、同名ファイルがすでにある場合や、保存形式と拡張子の組み合わせが適切でない場合は、保存時に別のエラーが発生することがあります。

よくある質問

Dir関数とFileSystemObjectはどちらを使えばよいですか?

単純な存在確認だけならDir関数でも十分対応できます。

一方で、ファイルとフォルダを厳密に区別したい場合や、その後に作成・コピーなどの処理が続く場合はFileSystemObjectが向いています。

FileSystemObjectを使うときに参照設定は必要ですか?

今回のコード例では、CreateObject("Scripting.FileSystemObject")を使っているため、参照設定を行わなくても使用できる形にしています。

保存前に存在確認をしていれば安心ですか?

存在確認をしておくと安全ですが、それだけで保存エラーを完全に防げるわけではありません。

同名ファイルの有無や保存形式の違いなど、別の要因でエラーになることもあります。

まとめ

今回は、VBAでファイルやフォルダの存在確認を行う方法を紹介しました。

  • 手軽に確認するならDir関数
  • ファイルとフォルダを厳密に区別したい場合はFileSystemObject
  • 実務では、その後の処理まで見据えて使い分けることが大切

単純な存在確認だけであればDir関数でも十分対応できますが、存在確認のあとに作成・コピー・保存などの処理まで行う場合は、FileSystemObjectの方が適しています。

まずはそれぞれの役割の違いを押さえ、用途に応じて使い分けてみてください。

この記事を書いた人
もみじのアイコン画像

もみじ

現役フリーランスWebエンジニア。フロントエンド開発を中心に、Web制作、WordPress、業務効率化ツール開発、PHPを用いた機能改修に携わってきました。社内SEとして業務ツール開発や運用保守を担当した経験もあります。

実務や学習を通じて得た知見をもとに、初心者がつまずきやすいポイントや、現場で役立つ考え方をわかりやすく発信しています。

詳しいプロフィールはこちら

-プログラミング
-, ,