エクセルVBAでファイルやフォルダの有無を確認したいときにはDir関数が使うことができます。
Dir関数は、ディレクトリ関数と読みます。
ディレクトリ(Directory)とは、コンピューター上のファイルを整理や管理をする「フォルダ」のようなものであり、ここから名前がつけられているようです。
エクセルVBAに限らず、プログラミング言語やアプリに”関数”と呼ばれる処理をまとめたものが存在していて、これらは特定の処理をすることを想定されて備えられているものです。
“関数”という言葉になじみがない人でも、エクセルのワークシートでSum(サム)と呼ばれるものであれば一度は聞いたことがあるのではないでしょうか。
Sum関数はセル範囲の数値を合計するはたらきを持つ関数です。
セル範囲という部品(引数)をSum関数に渡してあげれば、セル範囲に書かれた数値をたし算して結果を返します。
関数は特定のはたらきを実行する道具と考えても良いかと思いますが、ワークシートやVBAなどに数多く準備されているので目的に一致するはたらきをする関数があればとても便利です。
今回はそんな数や種類が豊富な関数のうち、VBAで利用できる「Dir関数」でファイルの有無を確認する方法を紹介していきたいと思います。

まずはDir関数の基本説明からはじめるよ。
Dir関数とは
Dir関数を使うとフォルダ内のファイル名一覧を取得したり、ファイルの存在の有無を確認できます。
Dir関数を使うとファイル名または、フォルダ名を文字列で返します。
Dir関数の引数には、文字列によるパス(格納場所)と対象のファイルの属性を指定します。
指定したファイルが存在した場合ファイル名が戻り値としてかえってきますが、指定したファイルが存在しない場合は空欄(“”)がかえってきます。

ほかの関数はどういったものがあるの?
Dir関数のほかにはどんな関数がある?
Sum関数のように数学的な処理をする関数や、文字列操作やデータ型の判定をおこなうものまで存在します。
また、VBAでは、エクセルの関数(ワークシート関数)をつかうことができます。
ワークシート関数の使いかたや、ここで取り上げていない関数を掲載している記事もありますので、くわしく知りたい人は以下のリンクよりご覧いただけます。
\文字列操作をする関数についての記事はこちら/
\ワークシート関数を利用する方法が書かれた記事はこちら/
Dir関数の構文
Dir[(pathname,[attributes])]
関数名のDirのあとに、pathnameでファイルやフォルダの格納場所を文字列で指定します。
attributesはファイルやフォルダの属性は直接指定するか数値で指定することができます。
※引数はいずれも省略可能です。
Dir関数の引数について
それぞれの引数について説明します。
pathname(ファイルやフォルダーの格納場所)
フルパスでファイル名やフォルダー名を文字列で指定します。
なお、この引数は省略が可能です。
※フルパスとは、ファイルやフォルダーの所在の記述方法で最上位階層から表記したものです。
例:C:\Users\XXXXX\Desktop¥テスト.txt
などのようにドライブ名から所在を記述します。

pathnameにはファイルの住所の書くよ。
attributes(属性)
ファイルの属性か、その属性がもつ数値を指定します。
なお、この引数は省略が可能です。省略した場合は0(標準ファイル)として処理されます。
attributesで指定できるものは以下のとおりです。
属性 | 値 | 説明 |
---|---|---|
vbNormal | 0 | 標準ファイル |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル(Macintoshは使用不可) |
vbVolume | 8 | ボリュームラベル(Macintoshは使用不可)。他の属性と併用はできない。 |
vbDirectory | 16 | ファイルとディレクトリまたはフォルダ |
vbAlias | 32 | エイリアスファイル(Macintoshのみ使用可) |

attributesはワードやエクセルなどのアプリケーションの違いではないよ。
Dir関数をあつかう上での注意点
Dir関数をつかう上で注意すべき点は以下のとおりです。
フォルダやファイルをあつかうならファイルシステムオブジェクト
ファイルやフォルダを操作する方法としてこちらで紹介しているDir関数ではなく、ファイルシステムオブジェクト(FileSystemObject)と呼ばれるものを利用する方法があります。
ファイルシステムオブジェクトは豊富なメソッドやプロパティがあり、存在チェックや名前の取得、変更などの様々な処理ができて便利につかえるオブジェクトなので、仕事や作業で効率化をしたい人は以下のリンクよりご覧ください。
<ファイルシステムオブジェクトについてはコチラ>

ファイルシステムオブジェクトを使う方法もおすすめだよ。
Dir関数をつかったサンプルマクロ
Dir関数をつかってファイル名を返すマクロのVBAコードを紹介します。
サンプルマクロのVBAコード
Option Explicit
Sub dir関数()
'Dir関数の戻り値を代入するための変数を宣言する
Dim fname As String
'ファイルの格納場所を文字列で代入するための変数を宣言する
Dim path As String
'ファイルの格納場所を変数pathに代入する
path = "C:¥Users¥XXXXX¥Desktop¥Excelファイル¥Blog(dir関数).xlsm"
'Dir関数の引数に変数pathを指定し、ファイル名を取得する。取得した値は変数fnameに代入する。(※戻り値は文字列型)
fname = Dir(path, vbNormal)
'変数fnameの値をイミディエイトウィンドウに出力する
Debug.Print fname
End Sub
06行目
ファイル名を代入するための文字列型変数としてfnameを宣言する。
09行目
パスを代入するための文字列型変数としてPathを宣言する。
12行目
Pathに”C:\Users\XXXXX\Desktop\Excelファイル\Blog(dir関数).xlsm“に代入します。
15行目
Dir関数をつかってファイル名を取得し、取得したファイル名をfnameに代入します。
引数には12行目でパスを代入したPathを指定しています。
18行目
デバッグプリントでfnameに代入されたファイル名をイミディエイトウィンドウに表示します。
ファイル名を取得することができました。

Dir関数ではファイル名が文字列で返ってくるよ。
Dir関数で複数の属性(attributes)を指定する
Dir関数の引数のうちattributes(属性)は複数指定できますが、指定する場合は” + “をつかって書きます。
サンプルマクロのVBAコード
Option Explicit
Sub dir関数()
'Dir関数の戻り値を代入するための変数を宣言する
Dim fname As String
'ファイルの格納場所を文字列で代入するための変数を宣言する
Dim path As String
'ファイルの格納場所を変数pathに代入する
path = "C:¥Users¥XXXXX¥Desktop¥Excelファイル¥Blog(dir関数).xlsm"
'Dir関数の引数に変数pathを指定し、ファイル名を取得する。取得した値は変数fnameに代入する。(※戻り値は文字列型)
fname = Dir(path, vbReadOnly + vbHidden + vbDirectory)
'fname = Dir(path, 1 + 2 + 16)でも同じ内容になります。
'fname = Dir(path, 19)でも同じ内容になります。
'変数fnameの値をイミディエイトウィンドウに出力する
Debug.Print fname
End Sub
15行目
attributesに複数の条件を指定しています。
サンプルマクロでは標準ファイルに加えて、読み取り専用ファイル、隠しファイル、フォルダの名前の一覧を取得します。

属性の 「vbNormal」は、値が0なので指定しなくても含まれているよ。
Dir関数の応用例|ファイルの存在を確認する
Dir関数のこの動作を応用することで、指定のパス(格納場所)に任意のファイルが存在するかのチェックができます。
具体的な方法として、Dir関数で返ってくる値をIf文で判定することでファイルの有無が確認できるマクロになります。
サンプルマクロのVBAコード
Option Explicit
Sub dir関数()
'Dir関数の戻り値を代入するための変数を宣言する
Dim fname As String
'ファイルの格納場所を文字列で代入するための変数を宣言する
Dim path As String
'ファイルの格納場所を変数pathに代入する
path = "C:¥Users¥XXXXX¥Desktop¥Excelファイル¥Blog(dir関数).xlsm"
'Dir関数の引数に変数pathを指定し、ファイル名を取得する。取得した値は変数fnameに代入する。(※戻り値は文字列型)
fname = Dir(path, 0)
'If文をつかって変数fnameの値が空白以外ならファイルが見つかったメッセージをする。
If fname <> "" Then
MsgBox fname & " が見つかりました。"
Else
MsgBox "ファイルが見つかりません。"
End If
End Sub
15行目
Dir関数をつかってファイル名を取得し、取得したファイル名をfnameに代入します。
18行目から22行目
fnameに代入された文字列が空白(“”)かどうかを判定します。
判定の結果、空白でなかったときはファイルが見つかった旨をメッセージとして「〇〇が見つかりました。」と表示します。
判定の結果、空白だったときは見つからなかった旨のメッセージを表示します。

サンプルの場合は「Blog(dir関数).xlsm が見つかりました。」ってメッセージが表示されるよ。
Dir関数をつかったサンプルマクロ(ファイル名一覧を取得する)
特定フォルダーに入っているファイル名をまとめて取得するマクロのコードを紹介します。
こちらのサンプルマクロでは、くり返し文を使って指定したフォルダ内のファイル名を全て取得します。
具体的には、Excelファイルという名前のフォルダーに入っているファイル名をすべて取り出す処理をしています。
サンプルマクロのVBAコード
Option Explicit
Sub dir関数()
'Dir関数の戻り値を代入するための変数を宣言する
Dim fname As String
'ファイルの格納場所を文字列で代入するための変数を宣言する
Dim path As String
'ファイルの格納場所を変数pathに代入する
path = "C:¥Users¥XXXXX¥Desktop¥Excelファイル¥"
'Dir関数の引数に変数pathを指定し、ファイル名を取得する。取得した値は変数fnameに代入する。(※戻り値は文字列型)
fname = Dir(path, vbNormal)
'Do loop文でfnameが空白になるまで繰り返す
Do Until fname = ""
'Dir関数でファイル名を取得する(引数の指定なし)
fname = Dir()
'変数fnameの値をイミディエイトウィンドウに出力する。
Debug.Print fname
Loop
End Sub
15行目までは、これまでに紹介したマクロの書きかたと同じです。
ただし、12行目で変数のpathにファイルの格納場所を表す文字列の末尾には”¥“をつけておきましょう。
19行目
Do Loopステートメントでくり返しを指定しています。
Dir関数で取得したファイル名が空白になるまでくり返すという条件式で指定しています。
Dir関数は指定したファイルが見つからなかった場合に空白を””を返す仕様となっているため、すべてのファイル(厳密に言えば標準ファイルのみ)が取得できることになります。
22行目
Dir関数で取得できるファイル名を変数のfnameに代入しています。
12行目でファイルの格納場所を指定していることで、ここではpathを省略した書きかたでも動作します。
Do Loopステートメントでくり返しをする方法についてはこちら
Blog(ユーザー定義型).xlsx
Blog(配列)2.xlsm
Blog(配列)2.xlsx
Blog(ユーザーフォーム).xlsm
Blog(ユーザーフォーム).xlsm
Blog.xlsx
subtotal.xlsx
キーワード.xlsx
ブログ勤務表(原紙).xlsx
ブログ用ファイル.xlsm

Excelファイルという名前のフォルダーに入っているファイル名一覧が表示できたね。
Dir関数でファイル名とフォルダー名一覧で取得する
先のマクロでは、ファイル名一覧を取得しましたが、指定したパスにフォルダが入っていることもあります。
ファイル名と同じように、フォルダ名も合わせて取得したいときはこちらを参考にマクロを作成してみてください。
サンプルマクロのVBAコード(書きかえる部分のみ)
fname = Dir(path, vbNormal)'vbNormalの代わりに0を指定でも可。
サンプルマクロのVBAコード(書きかえる部分のみ)
fname = Dir(path, vbDirectory)'vbDirectoryの代わりに16を指定でも可。
Dir関数の引数であるのattributes(属性)を、vbNormal(0) から vbDirectory(16)に変更します。
これで、変数pathに指定した格納場所のファイル名と、フォルダー名をまとめて取得することができます。
Dir関数でフォルダ配下の特定のファイル名を取得する
Dir関数の引数であるpathnameの文字列には、ワイルドカードとして” * “と” ? “の使用ができます。
これらをワイルドカードを利用して、特定のファイル名が含められるものだけの抽出ができます。
次のサンプルコードでは、Dir関数の引数に”*.xlsx”を指定しているため、.xlsxの拡張子をもったエクセルファイルの一覧が取得できます。
サンプルマクロのVBAコード
Option Explicit
Sub dir関数()
'Dir関数の戻り値を代入するための変数を宣言する
Dim fname As String
'ファイルの格納場所を文字列で代入するための変数を宣言する
Dim path As String
'ファイルの格納場所を変数pathに代入する
path = "C:¥Users¥XXXXX¥Desktop¥Excelファイル¥*.xlsx"
'dir関数の引数に変数pathを指定し、ファイル名を取得する。取得した値は変数fnameに代入する。(※戻り値は文字列型)
fname = Dir(path, vbNormal)
'Do loop文でfnameが空白になるまで繰り返す
Do Until fname = ""
'Dir関数でファイル名を取得する(引数の指定なし)
fname = Dir()
'変数fnameの値をイミディエイトウィンドウに出力する。
Debug.Print fname
Loop
End Sub
12行目
変数pathに代入する格納場所にワイルドカード文字” * “を使っています。
これにより”.xlsx“の拡張子をもったファイルすべてが対象になります。
Blog.xlsx
subtotal.xlsx
キーワード.xlsx
ブログ勤務表(原紙).xlsx
ファイル名に”.xlsx”が含まれるファイル名一覧が取得できました。

書きかえれば好きなファイル名やフォルダ名だけに使えるね。
スクール選びにお悩みですか?
動画編集、ロボット、AIとテクノロジーの進化が目まぐるしい時代だからこそ身につけるなら即戦力のスキル。
豊富なコースが選べて、独自開発されたカリキュラムの採用で業界有数の学習継続率!
さらにスキル習得だけじゃない。卒業後の転職や副業まで激アツなサポートが無料!!
エクセルVBA Dir関数|まとめ
本記事では、エクセルVBAのDir関数について紹介してきました。
Dir関数は、ファイル名やフォルダー名を指定することでファイルやフォルダーの存在を確認することができます。
Dir関数の実行で返ってくる結果はファイル名やフォルダー名の文字列です。
引数の格納場所( pathname )と属性( attributes )の使いかたを工夫することで希望するファイルやフォルダーを取得することができます。
また、格納場所( pathname )にはワイルドカードが使えます。
くり返しや条件判定となるステートメントと組み合わせることで、指定したフォルダーのファイルやサブフォルダをまとめて取得することも可能です。


画像のような状態から特定のファイル名だけを取り出したりもできるね。
Dir関数にはファイルやフォルダーの存在を確認したり、ファイル名の取得などが実行できます。
しかし、実務を想定した場面では、存在を確認するだけでとどまらず、そのあとの編集や処理がつきものであることが多いと思われます。
ファイルやフォルダーに対する操作はDir関数のみで実現することができないため、ファイルやフォルダーの確認をしたあとでなにか別の処理を実行する必要があるのであれば、Dir関数と同等の機能も持ちあわせた上位互換のようなファイルシステムオブジェクト(FileSystemObject)を使用することをオススメします。

良ければファイルシステムオブジェクトの記事も見てね。
今回はここまで。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント