エクセルVBAに限らず、プログラミング言語には関数と呼ばれる処理のかたまりが存在していて、これらは特定の処理をすることを想定されて備えられているものです。関数という言葉になじみがない人でも、エクセルのワークシートでSum(サム)と呼ばれるものであれば一度は聞いたことがあるのではないでしょうか。
Sum関数はセル範囲の数値を合計する関数です。つまりセル範囲という部品(引数)を渡してあげれば、セルに書かれた値をたし算して結果を出力してくれる関数と言えます。
このように関数は特定の処理を実行する道具と言ってもいいでしょう。そして関数は多数存在していますので、今回はファイル操作ができる「Dir関数」を紹介していきます。
ファイルやフォルダを操作する他の方法についても紹介するね。
Dir関数とは
Dir関数を使うと、フォルダ内のファイル名一覧を取得したり、ファイルの存在の有無を確認できます。
Dir関数の戻り値はファイル名または、フォルダ名を文字列で返します。
Dir関数の引数には、文字列によるパス(格納場所)と、対象のファイルの属性を指定します。
指定したファイルが存在した場合、ファイル名が戻り値としてかえってきますが、存在しない場合は空欄(“”)がかえってきます。
ほかの関数はどういったものがあるの?
Sum関数のように数学的な処理をする関数や、文字列操作やデータ型の判定をおこなうものまで存在します。また、VBAでは、エクセルの関数(ワークシート関数)をつかうことができます。
ワークシート関数の使いかたや、ここで取り上げていない関数を掲載している記事もありますので、くわしく知りたい人は以下のリンクよりご覧いただけます。
\文字列操作をする関数についての記事はこちら/
\ワークシート関数を利用する方法が書かれた記事はこちら/
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関数」以外にもファイルシステムオブジェクト(FileSystemObject)と呼ばれるものを利用する方法があります。ファイルシステムオブジェクトは豊富なメソッドやプロパティがあり、存在チェックや名前の取得、変更などの様々な処理が可能です。
<ファイルシステムオブジェクトについてはコチラ>
フォルダやファイルをあつかうならFileSystemObjectを使う方法がおすすめだよ。
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”が含まれるファイル名一覧が取得できました。
応用すれば任意のファイル名やフォルダ名に対しても使えるね。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
エクセルVBA Dir関数|まとめ
ここまでで、Dir関数について説明してきました。最後にまとめておきます。
Dir関数はファイル名一覧の取得や、ファイルの存在を確認する上で便利につかえる関数です。引数pathnameとattributesの2つがあります。戻り値はファイル名やフォルダ名などの文字列です。
引数のうち、属性(attributes)は標準ファイルを含め、「読み取り専用」や「隠しファイル」など複数の指定が可能ですが、Dir関数は最初に取得したファイル名を返します。すべての名前の一覧を取得する場合は繰り返し文と組み合わせて使用します。
Dir関数には、制約や注意点が多いのも事実です。このクセを理解した上で使っていくことができれば問題はありませんが、上位互換のような機能をもった「FileSystemObject」が存在しますので、一般的にはそちらを使用することをおすすめします。
今回はここまで。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント