Dir関数とは
Dir関数を使うと、フォルダ内のファイル名一覧を取得したり、ファイルの存在の有無を確認できます。
Dir関数の戻り値はファイル名または、フォルダ名を文字列で返します。
Dir関数の引数には、文字列によるパス(格納場所)と、対象のファイルの属性を指定します。
指定したファイルが存在した場合、ファイル名が戻り値としてかえってきますが、存在しない場合は空欄(“”)がかえってきます。
Dir関数の構文
Dir[(pathname,[attributes])]
関数名のDirのあとに、pathnameでファイルの格納場所を文字列で指定、attributesでの属性は直接指定するか、属性が持つ数値で指定できます。
Dir関数の引数について
pathname
フルパスでドライブやフォルダ名にファイル名を文字列で指定します。
なお、この引数は省略が可能です。
attributes
ファイルの属性か、その属性がもつ数値を指定します。
なお、この引数は省略が可能です。省略した場合は0(標準ファイル)として処理されます。
この引数(attributes)で指定できるものは以下のとおりです。
属性 | 値 | 種類の説明 |
---|---|---|
vbNormal | 0 | 標準ファイル |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル(Macintoshは使用不可) |
vbVolume | 8 | ボリュームラベル(Macintoshは使用不可)。他の属性と併用はできない。 |
vbDirectory | 16 | ファイルとディレクトリまたはフォルダ |
vbAlias | 32 | エイリアスファイル(Macintoshのみ使用可) |
Dir関数をあつかう上での注意点
Dir関数をあつかう上では、いくつか注意点が存在します。
Dir関数のサンプルコード
実際にコードを書いてファイル名を取得します。
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
引数であるpathnameには文字列でフルパス(格納場所)を指定するので、ダブルクォーテーションで記載してください。上記のサンプルコードでは、変数pathにフルパス(格納場所)を代入してから、Dir関数の引数として指定しています。
Blog(dir関数).xlsm
ファイル名を取得することができました。

Dir関数はファイル名が文字列で返ってくるよ。
Dir関数で複数の属性(attributes)を指定する
Dir関数の引数のうち、属性(attributes)は複数指定できますが、指定する場合は、以下のように”+”をつかって書きます。
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
属性(attributes)名を” +“でつなげて書く、または値を加算した数値を指定することで引数にできます。
サンプルコードの場合は、属性(attributes)のない標準ファイルに加えて「読み取り専用ファイル」と「隠しファイル」と「フォルダ」の名前一覧を取得します。

属性の『 vbNormal 』は、値が0なので指定しなくても含まれているよ。
Dir関数の応用例|ファイルの存在を確認する
Dir関数のこの動作を応用することで、指定のパス(格納場所)に任意のファイルが存在するかのチェックができます。
具体的な方法として、サンプルコードにIf文を組み合わせて以下のように書きかえるとファイルの有無が確認できるマクロを作ることができます。
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
Dir関数の引数として指定した変数pathは、ファイルの格納場所とファイル名(Blog(dir関数).xlsm)が代入されています。ここでのDir関数の戻り値はファイル名なので、変数fnameに代入された文字列が空白であるか、そうでないかをIf文で判定しています。
この判定の結果が空白以外ならば、ファイル名が変数fnameに代入されています。つまり、代入された値が空白以外であれば、指定したファイル名は存在していることが確認できます。

サンプルコードの場合は、「Blog(dir関数).xlsm が見つかりました。」ってメッセージが表示されるよ。
Dir関数のサンプルコード(フォルダ配下のファイル名をすべて取得する)
フォルダ配下のファイル名を全て取得する場合は、繰り返し文を使います。
このサンプルコードでは、Do Until ~ Loop文を使って指定したフォルダ内のエクセルファイルのファイル名を全て取得します。
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
pathに格納場所を代入するときの文字列では、末尾に”¥“をつけるところがポイントです。
Do Until fname = “” の部分は、Do While fname <> “”でも同じことができます。
WhileとUntilの関係や、For文をつかった基本の書きかたなどについては、別の記事で紹介していますので、詳しく知りたい人はこちらをご覧ください。
Blog(ユーザー定義型).xlsm Blog(ユーザー定義型).xlsx Blog(配列)2.xlsm Blog(配列)2.xlsx Blog(ユーザーフォーム).xlsm Blog(ユーザーフォーム).xlsm Blog.xlsx subtotal.xlsx キーワード.xlsx ブログ勤務表(原紙).xlsx ブログ用ファイル.xlsm
変数pathに指定したフォルダ内に入っているファイル名を全て出力することができました。なお、上記のサンプルコードでは、Do Until~Loopなどの繰り返し文をつかわなかったときは、Dir関数はフォルダ内の1番最初の取得したファイル名のみです。
ここでは、イミディエイトウィンドウへの出力なのでわかりにくいですが、最終行に長さ0の文字列””が出力されています。サンプルコードの、Debug.Print fnameの部分を、MsgBox fnameに変更すると、ファイル名を表示するメッセージボックスが表示され、最後に以下の画像のようなメッセージが表示されます。


空欄のメッセージボックスが表示されるのは、マクロの動作として変なかんじがするね。
マクロの使用者(ユーザー)に違和感を与えないように、If文やSelectCase文をつかって、空欄の場合は表示しないようにするなどの対処をしておきましょう。
If文やSelectCase文の使いかたや書き方については、以下の記事をご覧ください。
Dir関数でフォルダ名とファイル名を一覧で取得する
指定したパスにフォルダが入っていることもあります。ファイル名と同じように、フォルダ名も合わせて取得したい場合はサンプルコードを以下のように書きかえてください。
fname = Dir(path, vbNormal)'vbNormalの代わりに0を指定でも可。
fname = Dir(path, vbDirectory)'vbDirectoryの代わりに16を指定でも可。
Dir関数の引数であるの属性(attributes)を、vbNormal(0) から vbDirectory(16)に変更します。
これで、変数pathに指定した場所のファイル名と、フォルダ名をすべて取得することができます。
Dir関数のサンプルコード(フォルダ配下の特定のファイル名を取得する)
Dir関数の引数(pathname)の文字列には、ワイルドカードとして” * “と” ? “の使用ができます。これを利用して、特定のファイル名が含められるものだけを抽出ができます。次のサンプルコードでは、Dir関数の引数に”*.xlsx”を指定したものです。
これで、.xlsxの拡張子をもったエクセルファイルの一覧が取得できるはずです。
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
Blog(配列)2.xlsx Blog.xlsx subtotal.xlsx キーワード.xlsx ブログ勤務表(原紙).xlsx
ファイル名に”.xlsx”が含まれるファイル名一覧が取得できました。


応用すれば任意のファイル名やフォルダ名に対しても使えるね。
独学の学習効率でお悩みの人必見!
<動画学習見放題サービス>
初心者にやさしいチューターなら今すぐにはじめられる
■オンラインで学習したい
■プログラミングで副業をはじめたい
■パソコン・エクセルの学習をしたい
エクセルVBA Dir関数|まとめ


ここまでで、Dir関数について説明してきました。最後にまとめておきます。
Dir関数はファイル名一覧の取得や、ファイルの存在を確認する上で便利につかえる関数です。引数pathnameとattributesの2つがあります。戻り値はファイル名やフォルダ名などの文字列です。
引数のうち、属性(attributes)は標準ファイルを含め、「読み取り専用」や「隠しファイル」など複数の指定が可能ですが、Dir関数は最初に取得したファイル名を返します。すべての名前の一覧を取得する場合は繰り返し文と組み合わせて使用します。
Dir関数には、制約や注意点が多いのも事実です。このクセを理解した上で使っていくことができれば問題はありませんが、上位互換のような機能をもった「FileSystemObject」が存在しますので、一般的にはそちらを使用することをおすすめします。
今回はここまで。
コダマのもりブログはにほんブログ村に登録しています。
今回の記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント