※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|Dir関数の使い方とファイルやフォルダの存在をチェックする方法

エクセルVBAに限らず、プログラミング言語には関数と呼ばれる処理のかたまりが存在していて、これらは特定の処理をすることを想定されて備えられているものです。関数という言葉になじみがない人でも、エクセルのワークシートでSum(サム)と呼ばれるものであれば一度は聞いたことがあるのではないでしょうか。

Sum関数はセル範囲の数値を合計する関数です。つまりセル範囲という部品(引数)を渡してあげれば、セルに書かれた値をたし算して結果を出力してくれる関数と言えます。

このように関数は特定の処理を実行する道具と言ってもいいでしょう。そして関数は多数存在していますので、今回はファイル操作ができる「Dir関数」を紹介していきます。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

ファイルやフォルダを操作する他の方法についても紹介するね。

Dir関数とは

Dir関数を使うと、フォルダ内のファイル名一覧を取得したり、ファイルの存在の有無を確認できます。
Dir関数の戻り値はファイル名または、フォルダ名を文字列で返します。

Dir関数の引数には、文字列によるパス(格納場所)と、対象のファイルの属性を指定します。
指定したファイルが存在した場合、ファイル名が戻り値としてかえってきますが、存在しない場合は空欄(“”)がかえってきます。


ほかの関数はどういったものがあるの?

Sum関数のように数学的な処理をする関数や、文字列操作やデータ型の判定をおこなうものまで存在します。また、VBAでは、エクセルの関数(ワークシート関数)をつかうことができます。

ワークシート関数の使いかたや、ここで取り上げていない関数を掲載している記事もありますので、くわしく知りたい人は以下のリンクよりご覧いただけます。

\文字列操作をする関数についての記事はこちら/

ワークシート関数を利用する方法が書かれた記事はこちら/

Dir関数の構文

Dir[(pathname,[attributes])]

関数名のDirのあとに、pathnameでファイルの格納場所を文字列で指定、attributesでの属性は直接指定するか、属性が持つ数値で指定できます。

Dir関数の引数について

フルパスでドライブやフォルダ名にファイル名を文字列で指定します。
なお、この引数は省略が可能です。

ファイルの属性か、その属性がもつ数値を指定します。
なお、この引数は省略が可能です。省略した場合は0(標準ファイル)として処理されます。

この引数(attributes)で指定できるものは以下のとおりです。

設定値
属性 説明
vbNormal 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システムファイル(Macintoshは使用不可)
vbVolume 8 ボリュームラベル(Macintoshは使用不可)。他の属性と併用はできない。
vbDirectory 16 ファイルとディレクトリまたはフォルダ
vbAlias 32 エイリアスファイル(Macintoshのみ使用可)
属性( attributes )は複数指定することも可能です。ただし、vbVolumeを他の属性( attributes )と合わせて指定した場合は無視されます。

Dir関数をあつかう上での注意点

Dir関数をあつかう上では、以下のような注意点が存在します。

  • 最初の呼び出し時は、引数pathnameの指定が必須である
  • pathnameに一致するファイルが複数であっても、最初のファイル名を返す。
    (※繰り返し処理と組み合わせることで複数個のファイル名に対応は可能)
  • Dir関数で引数なしを指定した場合は、戻り値は最後に長さ0の文字列””が返ってくる
  • 引数の属性(attributes)で、vbDirectory(16)を指定した戻り値に” . “や” .. “が返ってくる。
    (※これらはカレントフォルダや、親フォルダを意味しているが、なぜそれらがこういった表示で返ってくるのかは不明。)

こちらで紹介している「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に変更すると、ファイル名を表示するメッセージボックスが表示され、最後に以下の画像のようなメッセージが表示されます。

VBAのDir関数で引数なしでファイル名一覧を取得した場合、最後に長さ0の文字列が返ってくることをメッセージボックスで視覚化した画像

空欄のメッセージボックスが表示されるのは、マクロの動作として変なかんじがするね。

何かしらのメッセージや出力結果を出す場合は、マクロの使用者(ユーザー)に違和感を与えないように、If文やSelectCase文などの条件分岐をつかって、空欄であればメッセージボックスを表示しないようにする対処をしておきましょう。

If文やSelectCase文の使いかたや書き方については、以下の記事をご覧ください。

エクセルVBAのIf文で条件を判定して分岐するマクロをつくる方法
エクセルVBAの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”が含まれるファイル名一覧が取得できました。

応用すれば任意のファイル名やフォルダ名に対しても使えるね。

PR

残業はしたくない!PCやExcelのスキルアップであなたのプライベート時間を奪わせない!
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。


詳しくは以下のリンクをクリック

エクセルVBA Dir関数|まとめ

ここまでで、Dir関数について説明してきました。最後にまとめておきます。

Dir関数はファイル名一覧の取得や、ファイルの存在を確認する上で便利につかえる関数です。引数pathnameattributesの2つがあります。戻り値はファイル名やフォルダ名などの文字列です。

引数のうち、属性(attributes)は標準ファイルを含め、「読み取り専用」や「隠しファイル」など複数の指定が可能ですが、Dir関数は最初に取得したファイル名を返します。すべての名前の一覧を取得する場合は繰り返し文と組み合わせて使用します。

Dir関数には、制約や注意点が多いのも事実です。このクセを理解した上で使っていくことができれば問題はありませんが、上位互換のような機能をもった「FileSystemObject」が存在しますので、一般的にはそちらを使用することをおすすめします。

今回はここまで。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました