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

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

 エクセルVBAでファイルやフォルダの有無を確認したいときにはDir関数が使うことができます。

Dir関数は、ディレクトリ関数と読みます。

ディレクトリ(Directory)とは、コンピューター上のファイルを整理や管理をする「フォルダ」のようなものであり、ここから名前がつけられているようです。

エクセルVBAに限らず、プログラミング言語やアプリに”関数”と呼ばれる処理をまとめたものが存在していて、これらは特定の処理をすることを想定されて備えられているものです。

“関数”という言葉になじみがない人でも、エクセルのワークシートでSum(サム)と呼ばれるものであれば一度は聞いたことがあるのではないでしょうか。

Sum関数はセル範囲の数値を合計するはたらきを持つ関数です。

セル範囲という部品(引数)をSum関数に渡してあげれば、セル範囲に書かれた数値をたし算して結果を返します。

関数は特定のはたらきを実行する道具と考えても良いかと思いますが、ワークシートやVBAなどに数多く準備されているので目的に一致するはたらきをする関数があればとても便利です。

 今回はそんな数や種類が豊富な関数のうち、VBAで利用できる「Dir関数」でファイルの有無を確認する方法を紹介していきたいと思います。

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

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

まずはDir関数の基本説明からはじめるよ。

Dir関数とは

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

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


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

Dir関数のほかにはどんな関数がある?

 Sum関数のように数学的な処理をする関数や、文字列操作やデータ型の判定をおこなうものまで存在します。

また、VBAでは、エクセルの関数(ワークシート関数)をつかうことができます。

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

Dir関数の構文

Dir[(pathname,[attributes])]

関数名のDirのあとに、pathnameでファイルやフォルダの格納場所を文字列で指定します。
attributesはファイルやフォルダの属性は直接指定するか数値で指定することができます。
※引数はいずれも省略可能です。

Dir関数の引数について

 それぞれの引数について説明します。

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

※フルパスとは、ファイルやフォルダーの所在の記述方法で最上位階層から表記したものです。

例:C:\Users\XXXXX\Desktop¥テスト.txt

などのようにドライブ名から所在を記述します。

pathnameにはファイルの住所の書くよ。

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

attributesで指定できるものは以下のとおりです。

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

attributesはワードやエクセルなどのアプリケーションの違いではないよ。

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

 Dir関数をつかう上で注意すべき点は以下のとおりです。

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

フォルダやファイルをあつかうならファイルシステムオブジェクト

 ファイルやフォルダを操作する方法としてこちらで紹介している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に代入されたファイル名をイミディエイトウィンドウに表示します。

実行結果(イミディエイトウィンドウ)
Blog(dir関数).xlsm

ファイル名を取得することができました。

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(ユーザー定義型).xlsm
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(配列)2.xlsx
Blog.xlsx
subtotal.xlsx
キーワード.xlsx
ブログ勤務表(原紙).xlsx

ファイル名に”.xlsx”が含まれるファイル名一覧が取得できました。

書きかえれば好きなファイル名やフォルダ名だけに使えるね。

PR

スクール選びにお悩みですか?

動画編集、ロボット、AIとテクノロジーの進化が目まぐるしい時代だからこそ身につけるなら即戦力のスキル。

豊富なコースが選べて、独自開発されたカリキュラムの採用で業界有数の学習継続率!

さらにスキル習得だけじゃない。卒業後の転職や副業まで激アツなサポートが無料!!

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

 本記事では、エクセルVBAのDir関数について紹介してきました。
Dir関数は、ファイル名やフォルダー名を指定することでファイルやフォルダーの存在を確認することができます。

Dir関数の実行で返ってくる結果はファイル名やフォルダー名の文字列です。
引数の格納場所( pathname )と属性( attributes )の使いかたを工夫することで希望するファイルやフォルダーを取得することができます。

また、格納場所( pathname )にはワイルドカードが使えます。

 くり返しや条件判定となるステートメントと組み合わせることで、指定したフォルダーのファイルやサブフォルダをまとめて取得することも可能です。

画像のような状態から特定のファイル名だけを取り出したりもできるね。

 Dir関数にはファイルやフォルダーの存在を確認したり、ファイル名の取得などが実行できます。

しかし、実務を想定した場面では、存在を確認するだけでとどまらず、そのあとの編集や処理がつきものであることが多いと思われます。

ファイルやフォルダーに対する操作はDir関数のみで実現することができないため、ファイルやフォルダーの確認をしたあとでなにか別の処理を実行する必要があるのであれば、Dir関数と同等の機能も持ちあわせた上位互換のようなファイルシステムオブジェクト(FileSystemObject)を使用することをオススメします。

良ければファイルシステムオブジェクトの記事も見てね。

今回はここまで。

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

コメント

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