【簡単Excelマクロ・VBA】ファイルやフォルダの存在を確認する方法|Dir関数 / FileSystemObject|ファイル操作 #011
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
本稿では、ファイルの存在を確認する方法を解説いたします。
VBAでファイルの操作を行う場合、対象のファイルやフォルダに操作を加える前に、存在確認をすることが多いです。こうすることで、プログラムのロバスト性(堅牢性)が上がるためです。
堅牢性が上がるとは、つまり、対象のファイルやフォルダの存在を事前に確認しておくことで、意図しないファイル/フォルダに操作が加わることや、ファイル/フォルダが存在しないことによるエラー発生を防止することを意味します。
これは、これが無いとコードが動かないというわけではないですが、コーディングを行う上での良い習慣として事前の存在確認をしておくことが推奨されます。
ことばの意味
- ノンプログラマー
プログラミングを本職としない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
VBAにおけるファイル操作の全体像
VBAにおける「ファイル操作」の全体像は以下の記事で解説しております。
本稿では「ファイル操作」の一部である「ファイルの存在を確認する方法」を解説いたします。
VBAでファイルやフォルダの存在を確認する方法
VBAでファイルやフォルダの存在を確認する方法は2つある
概要
VBA で ファイルやフォルダの存在確認をする方法は2つあります。
- Dir 関数を使う方法
- FileSystemObject を使う方法
前後の文脈にあまり影響しない単純なファイルやフォルダの存在確認だけであれば Dir関数 を、高度なファイル操作/フォルダ操作が付随する場合は FileSystemObject を使うと良いでしょう。
特別な事情がなければ、FileSystemObject を使用しておくことが推奨されます。
それぞれの特徴を以下に解説していきます。
Dir 関数
概要
Dir 関数は、指定したパスにあるファイルやフォルダの名前を取得する関数です。
メリット
- コードがシンプルで処理が速い
- VBA標準の関数であるため、追加のライブラリの設定が不要ですぐ使える
デメリット
- 高度なファイル操作/フォルダ操作に対応していない
- 複雑な処理を行おうとすると予期せぬエラーが起こりやすい
例えば、Dir関数を用いたファイルのイテレーション中に、Dir関数を用いてファイルの存在確認を行うと、イテレーションがうまく機能しなくなります。
FileSystemObject
概要
FileSystemObject は、ファイルやフォルダを操作するためのオブジェクトです。これを使用することにより、ファイルやフォルダの作成、削除、コピー、移動、プロパティの取得などの操作が可能です。
メリット
- 高度なファイル操作/フォルダ操作が可能
ファイルの存在確認はもちろん、ファイルやフォルダの作成、削除、コピー、移動、名前の変更、プロパティの取得など、多くの機能があります。ファイルの存在確認を行う際は、合わせてこれらの操作を行うことが多いため、コーディングをする上で大変便利です。
デメリット
- 事前準備が必要
FileSystemObject を使うためには、難しい設定ではありませんが、事前に Microsoft Scripting Runtime ライブラリを参照する設定を行う必要があります。Microsoft Scripting Runtime は、Microsoft が提供する外部ライブラリです。 - Dir 関数よりも処理速度が遅い場合があります。
ことばの意味
- プロパティ・・・オブジェクトの特性や状態を表す情報のことです。例えば、ファイルのサイズ、作成日時、などです。
Dir 関数でファイルやフォルダの存在を確認する構文
Dir 関数でファイルやフォルダの存在を確認する基本構文を以下に示します。
' Dir関数でファイルの存在を確認する構文
If Dir(file_path) <> "" Then
MsgBox "ファイルが存在します"
Else
MsgBox "ファイルが存在しません"
End If
' Dir関数でフォルダの存在を確認する構文
If Dir(folder_path, vbDirectory) <> "" Then
MsgBox "フォルダが存在します"
Else
MsgBox "フォルダが存在しません"
End If
ここで 3行目の file_path
は ファイルのパスです。"<>" は、比較演算子のひとつで「・・・ではない」を意味します。つまり、Dir(file_path) <> ""
は、Dir(file_path)
が空の文字列ではない、を意味します。
同様に 16行目の folder_path はフォルダのパスです。vbDirectory は Dir 関数の引数で、フォルダ(ディレクトリ)を検索するための指定です。
尚、3行目のように引数を省略した婆には、デフォルトで vbNormal が適用されます。vbNormal は通常のファイルという意味です。
Dir 関数でファイルやフォルダの存在を確認する具体例
ファイルの存在確認
以下に具体例を示していきます。
まず最初は、ファイルの存在を確認する具体例を示します。
ファイル構成は以下の通りとします。
コードとマクロ実行結果を以下に示します。
Sub Sample()
' 変数宣言
Dim file_path As String
' 対象ファイルのパスを変数 file_path に代入
file_path = ThisWorkbook.Path & "\ファイル.xlsx"
' ファイルの存在を確認してメッセージを表示
If Dir(file_path) <> "" Then
MsgBox "ファイルが存在します"
Else
MsgBox "ファイルが存在しません"
End If
End Sub
解説していきます。
' 変数宣言
Dim file_path As String
冒頭のこの部分は変数の宣言をしています。変数は Dim 変数 As データ型
の構文で宣言します。
これによって変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、String
は文字列を扱うためのデータ型です。
' 対象ファイルのパスを変数 file_path に代入
file_path = ThisWorkbook.Path & "\ファイル.xlsx"
次に、対象ファイルのパスを変数 file_path
に格納しています。
' ファイルの存在を確認してメッセージを表示
If Dir(file_path) <> "" Then
MsgBox "ファイルが存在します"
Else
MsgBox "ファイルが存在しません"
End If
ここでファイルの存在を確認しています。
If Dir(file_path) <> "" Then
は、ファイルパスを表す文字列が空でなければ、つまりファイルが存在すれば、という意味になります。
上述したファイル構成の通り、このファイルパスに示すファイルは存在しますので、"ファイルが存在します" のメッセージボックスが表示されます。
もし、ファイルが存在しない場合は、"ファイルが存在しません" のメッセージボックスが表示されます。
フォルダの存在確認
次に、フォルダの存在確認の具体例を示していきます。
ファイル構成は以下の通りとします。
コードとマクロの実行結果を以下に示します。
Sub sample2()
' 変数宣言
Dim folder_path As String
' 対象ファイルのパスを変数 file_path に代入
folder_path = ThisWorkbook.Path & "\フォルダ"
' フォルダの存在を確認してメッセージを表示
If Dir(folder_path, vbDirectory) <> "" Then
MsgBox "フォルダが存在します"
Else
MsgBox "フォルダが存在しません"
End If
End Sub
解説していきます。
' 変数宣言
Dim folder_path As String
冒頭のこの部分は変数の宣言をしています。変数は Dim 変数 As データ型
の構文で宣言します。
これによって変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、String
は文字列を扱うためのデータ型です。
' 対象ファイルのパスを変数 file_path に代入する
folder_path = ThisWorkbook.Path & "\フォルダ"
次に、対象ファイルのパスを変数 folder_path
に格納しています。
' フォルダの存在を確認してメッセージを表示する
If Dir(folder_path, vbDirectory) <> "" Then
MsgBox "フォルダが存在します"
Else
MsgBox "フォルダが存在しません"
End If
ここでフォルダの存在を確認しています。
If Dir(folder_path) <> "" Then
は、フォルダのパスを表す文字列が空でなければ、つまりフォルダが存在すれば、という意味になります。
上述したファイル構成の通り、このフォルダパスに示すフォルダは存在しますので、"フォルダが存在します" のメッセージボックスが表示されます。
もし、フォルダが存在しない場合は、"フォルダが存在しません" のメッセージボックスが表示されます。
FileSystemObject でファイルやフォルダの存在を確認する構文
Microsoft Scripting Runtime を参照設定に追加
まず、FileSystemObjectを利用するためには、Microsoft Scripting Runtime を参照設定を追加する必要があります。
「ツール」-->「参照設定」と進み、Microsoft Scripting Runtime にチェックを入れ「OK」を押下します。
このひと手間が FileSystemObject を使う際のデメリットであるともいえますが、一度設定してしまえば以降は設定の必要はありません。
ファイルの存在を確認する構文
FileSystemObject でファイルの存在を確認する基本構文は以下の通りです。
' 変数宣言
Dim fso As FileSystemObject
' FileSystemObject のインスタンスを作成
Set fso = New FileSystemObject
' ファイルの存在を確認してメッセージを表示
If fso.FileExists(file_path) Then
MsgBox "ファイルが存在します。"
Else
MsgBox "ファイルが存在しません。"
End If
2行目:FileSystemObject型の変数 fso を宣言します。
6行目:ファイルシステムオブジェクト型の新しいインスタンスを作成し、変数 fso に代入します。
ことばの意味
- インスタンス
設計図(クラス)に基づいて作成された「実体」のことです。
10行目:指定したファイルパスにファイルが存在するかを確認します。ここで file_path
はファイルのパスを表します。
その後、10行目の確認結果に応じたメッセージを表示します。
フォルダの存在を確認する構文
FileSystemObject でフォルダの存在を確認する基本構文は以下の通りです。
' 変数宣言
Dim fso As FileSystemObject
' FileSystemObjectのインスタンスを作成
Set fso = New FileSystemObject
' フォルダの存在を確認してメッセージを表示
If fso.FolderExists(folder_path) Then
MsgBox "フォルダが存在します。"
Else
MsgBox "フォルダが存在しません。"
End If
2行目:FileSystemObject型の変数 fso を宣言します。
6行目:ファイルシステムオブジェクト型の新しいインスタンスを作成し、変数 fso に代入します。
10行目:指定したフォルダのパスにフォルダが存在するかを確認します。ここで folder_path
はフォルダのパスを表します。
前述のファイルを確認するコードとの違いがここです。ファイルの場合は FileExists
メソッドを使いますが、フォルダの場合は FolderExits
を使います。
その後、10行目の確認結果に応じたメッセージを表示します。
FileSystemObject でファイルやフォルダの存在を確認する具体例
ファイルの存在確認
以下に具体例を示していきます。
まず最初は、ファイルの存在を確認する具体例を示します。
ファイル構成は以下の通りとします。
コードとマクロ実行結果を以下に示します。
Sub Sample3()
' 変数宣言
Dim fso As FileSystemObject
Dim file_path As String
' FileSystemObject のインスタンスを作成
Set fso = New FileSystemObject
' 対象ファイルのパスを変数 file_path に代入する
file_path = ThisWorkbook.Path & "\ファイル.xlsx"
' ファイルの存在を確認してメッセージを表示
If fso.fileExists(file_path) Then
MsgBox "ファイルが存在します。"
Else
MsgBox "ファイルが存在しません。"
End If
End Sub
解説していきます。
' 変数宣言
Dim fso As FileSystemObject
Dim file_path As String
冒頭のこの部分は変数の宣言をしています。変数は Dim 変数 As データ型
の構文で宣言します。
これによって変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、FileSystemObject
は ファイルシステムを扱うためのデータ型、String
は文字列を扱うためのデータ型です。
' FileSystemObject のインスタンスを作成
Set fso = New FileSystemObject
ファイルシステムオブジェクト型の新しいインスタンスを作成し、変数 fso に代入します。
' 対象ファイルのパスを変数 file_path に代入する
file_path = ThisWorkbook.Path & "\ファイル.xlsx"
対象ファイルのパスを変数 file_path
に代入します。
' ファイルの存在を確認してメッセージを表示
If fso.FileExists(file_path) Then
MsgBox "ファイルが存在します。"
Else
MsgBox "ファイルが存在しません。"
End If
ここでファイルの存在を確認しています。
If fso.fileExists(file_path) Then
は、file_path
で指定されたファイルが存在している否かを判定しています。
上述のファイル構成の通り、このファイルパスに示すファイルは存在しますので、"ファイルが存在します"のメッセージボックスが表示されます。
もし、ファイルが存在しない場合は、"ファイルが存在しません"のメッセージボックスが表示されます。
フォルダの存在確認
次に、フォルダの存在確認の具体例を示していきます。
ファイル構成は以下の通りとします。
コードとマクロの実行結果を以下に示します。
Sub Sample4()
' 変数宣言
Dim fso As FileSystemObject
Dim folder_path As String
' FileSystemObject のインスタンスを作成
Set fso = New FileSystemObject
' 対象ファイルのパスを変数 folder_path に代入する
folder_path = ThisWorkbook.Path & "\フォルダ"
' ファイルの存在を確認してメッセージを表示
If fso.FolderExists(folder_path) Then
MsgBox "フォルダが存在します。"
Else
MsgBox "フォルダが存在しません。"
End If
End Sub
解説していきます。
' 変数宣言
Dim fso As FileSystemObject
Dim folder_path As String
冒頭のこの部分は変数の宣言をしています。変数は Dim 変数 As データ型
の構文で宣言します。
これによって変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、FileSystemObject
は ファイルシステムを扱うためのデータ型、String
は文字列を扱うためのデータ型です。
' FileSystemObject のインスタンスを作成
Set fso = New FileSystemObject
ファイルシステムオブジェクト型の新しいインスタンスを作成し、変数 fso に代入します。
' 対象ファイルのパスを変数 folder_path に代入する
folder_path = ThisWorkbook.Path & "\フォルダ"
対象ファイルのパスを変数 folder_path
に代入します。
' ファイルの存在を確認してメッセージを表示
If fso.FolderExists(folder_path) Then
MsgBox "フォルダが存在します。"
Else
MsgBox "フォルダが存在しません。"
End If
ここでファイルの存在を確認しています。
If fso.FolderExists(folder_path) Then
は、folder_path
で指定されたファイルが存在している否かを判定しています。
上述のファイル構成の通り、このファイルパスに示すフォルダは存在しますので、"フォルダが存在します"のメッセージボックスが表示されます。
もし、フォルダが存在しない場合は、"フォルダが存在しません"のメッセージボックスが表示されます。
おわりに
ご覧いただきありがとうございました。
本稿では、「ファイル操作」の中の「ファイルやフォルダの存在を確認する方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
筆者の記事関連経験
- VBA使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。