【簡単エクセル/Excel VBA マクロ】ファイルやフォルダの存在を確認する方法|Dir関数 / FileSystemObject|ファイル操作 #011

アフィリエイト広告を利用しています。
Information
運営者・ポテ

いつもありがとうございます!

皆さん、こんにちは。ご覧いただきありがとうございます。

“日々の業務にちょうどいい自動化を”──

業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。

VBAでファイルの操作を行う場合、対象のファイルやフォルダに操作を加える前に、存在確認をすることが多いです。こうすることで、プログラムのロバスト性(堅牢性)が上がるためです。

堅牢性が上がるとは、つまり、対象のファイルやフォルダの存在を事前に確認しておくことで、意図しないファイル/フォルダに操作が加わることや、ファイル/フォルダが存在しないことによるエラー発生を防止することを意味します。

これは、これが無いとコードが動かないというわけではないですが、コーディングを行う上での良い習慣として事前の存在確認をしておくことが推奨されます。

この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。

VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。

VBAにおけるファイル操作の全体像

VBAにおける「ファイル操作」の全体像は以下の記事で解説しています。

この記事では「ファイル操作」の一部である「ファイルやフォルダの存在を確認する方法」を解説します。

VBAでファイルやフォルダの存在を確認する方法

VBAでファイルやフォルダの存在を確認する方法は2つある

概要

VBA で ファイルやフォルダの存在確認をする方法は2つあります。

  1. Dir 関数を使う方法
  2. 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 に代入します。

Information

インスタンス
設計図(クラス)に基づいて作成された「実体」のことです。

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スキルアップの参考情報

近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。

分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。

とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。

全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。

そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。

「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。

VBAのスキルアップ

VBAを学び始めるなら

入門書は、どれを選んでも大きな差はないように感じます。

どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。

もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

基礎を超えて力をつけたいなら

私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。

今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。

このレベルの本を一冊持っておくことに、損はないでしょう。


資格で能力を証明したいなら

VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。

特に「スタンダード」の方は上級者向けです。

あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。

以下の公式テキストが販売されています。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。

これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。

今はAIにコードを尋ねれば、答えが返ってくる時代です。

しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。


こちらの記事でも紹介しています。もしよろしければご覧ください。

【初心者歓迎】無料相談受付中 

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

おわりに

運営者・ポテ

ご覧いただきありがとうございました!

この記事では、「ファイル操作」の中の「ファイルやフォルダの存在を確認する方法」を解説しました。

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を追求。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です