VBAでフォルダ内のファイルを一括処理!Dir関数の基本と活用例を解説

この記事はアフィリエイト広告を利用しています。
VBAでフォルダのファイルを一括処理!Dir関数の基本と活用例を解説

ようこそ♪ささぽんのExcel教室へ。

今回は VBAにおいて「Dir関数でファイルを検索&一括処理する方法」 をお届けします!

フォルダ内のファイルを一括で処理したいとき、最初に思い浮かぶのは「どうやってファイルを指定するのか」という疑問ではないでしょうか。
そんなときに活躍するのが、Dir関数です。

この記事では、Dir関数の基本的な使い方からループ処理での活用例までを丁寧に解説します!

ささぽん

この記事は以下のような方におすすめです!
・Dir関数の使い方を知りたい方
・VBAでフォルダ内のファイル指定が上手くいかない方

・複数ファイルを順に処理するマクロを作りたい方

このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。

読み終わるころにはきっと、
Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。

一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!

目次

1.Dir関数とは?ファイルの存在確認や検索に使える関数

◼︎Dir関数とは?

◼︎ワイルドカードであいまい検索

2.処理するファイルを絞り込む方法3パターン

◼︎Instr関数でファイル名を検索する

◼︎拡張子で処理対象を制限する

3.複数ファイルを順に処理する

◼︎STEP1:1つ目のファイルを特定する

◼︎STEP2:次に処理するファイルを取得する

◼︎STEP3:ファイルがなくなるまで繰り返す

4.Dir関数を使う時の注意点

◼︎検索条件は1つしか保持できない

◼︎フルパスは取得できない

◼︎ファイルが見つからない場合の処理の記載が必要

5.まとめ

◼︎Dir関数でできること

◼︎Dir関数を使ううえで気をつけたい3つのポイント

1.Dir関数とは?ファイルの存在確認や検索に使える関数

VBAでファイルを扱うとき、「ファイルがあれば処理をする」「条件に一致するファイルについて処理する」という条件分岐をしたい場面はありませんか?
そんなときに便利なのが、Dir関数です。

Dirはファイルやフォルダの「存在確認」や「検索」に使える関数で、条件に合うファイル名を返してくれます。

この章では、Dir関数の基本的な使い方と使える場面について解説します!

◼︎Dir関数とは?

Dir関数は、指定したパスや条件に一致するファイル名を文字列で返す関数です。

早速ですが、実際に動きを見てみましょう。

以下のコードは、ファイルが存在するかどうかを確認し、その結果をMsgBoxで表示するものです。

Sub CheckFileWithDir()
Dim result As String

' 存在するファイルのパスを指定(必要に応じて変更してください)
result = Dir("C:\Test\sample.xlsx")
If result <> "" Then
 MsgBox "ファイルが見つかりました:" & result
Else
 MsgBox "ファイルは見つかりませんでした。"
End If
End Sub

ぜひ、3行目にご自身のフォルダ構造に合わせたパスを設定して実行してみてください。

パスの通りのファイルがある場合には、「ファイルが見つかりました:(ファイル名)」とメッセージが表示されるはずです。
一方、そのファイルが存在しない場合には「ファイルは見つかりませんでした。」と表示されます。

このように、Dir関数はファイルの有無を手軽にチェックできる便利な関数です。

まずは実際に実行してみて、Dir関数の基本を押さえましょう!

◼︎ワイルドカードであいまい検索

先ほどはパスを直接指定してファイル有無を確認する例を紹介しましたが、Dir関数を使うとあいまい検索をすることもできます。

例えば、次のコードは「C:\Test」フォルダの中から「2501」で始まるExcelファイルを探す例です:

Dim fileName As String
fileName = Dir("C:\Test\2501*.xlsx")
MsgBox fileName

このコードでは、最初に見つかった「2501報告書.xlsx」や「2501まとめ.xlsx」などのファイル名が返されます。

ここで使っている「*(アスタリスク)」は「0文字以上の任意の文字列」を表します。

一方、「?(クエスチョンマーク)」を使うと「任意の1文字」にマッチする検索も可能です。

例えば:

Dim fileName As String
fileName = Dir("C:\Test\2501?.xlsx")
MsgBox fileName

実際に、「Test」フォルダに「2501a.xlsx」を置いて実行した場合と「2501ab.xlsx」を置いた場合で比較すると、「2501a.xlsx」の時には検索条件に一致してファイル名が返されますが、「2501ab.xlsx」を置いた場合には空文字が返却されます。

①「2501a.xlsx」を置いて実行した場合はファイル名が表示される

2501a.xlsxを設置
2501a.xlsxと表示

①「2501ab.xlsx」を置いて実行した場合は空の文字が表示される

2501ab.xlsxを設置
空文字を表示

このように、「*」や「?」を活用することでワイルドカード検索もできるので、実務でも非常に役立ちます。

次の章で、ファイルの指定方法をもう少し見ていきましょう!

2.処理するファイルを絞り込む方法3パターン

この章では、Dir関数でファイルを指定する方法を深掘りしていきましょう。

柔軟に指定できるようになるため、3つの方法をご紹介します!

◼︎Instr関数でファイル名を検索する

InStr関数を使うと、ファイル名の中に特定の文字列が含まれているかを調べ、条件に一致した場合のみ処理するように書くことができます。
1章で紹介したワイルドカード検索と似ていますが、より複雑な条件にも対応できるのが特徴です。

例えば:

If InStr(file, "2501") > 0 And InStr(file, "報告書") > 0 Then
 ' 両方の条件に合うファイルにする処理を記述
End If

このコードでは、ファイル名に「2501」と「報告書」がどちらも含まれるファイル、という指定をしています。

このように、InStrなら複数の文字列を組み合わせた条件でも柔軟に対応できます。

◼︎拡張子で処理対象を制限する

ここでは、1章で紹介したワイルドカード検索の応用編として、拡張子を使ったファイルの絞り込み方法をご紹介します。

たとえば、「.xlsxファイルだけを処理したい」という際に便利です。

このような場合、Dir関数の検索条件にワイルドカードを使って、次のように書けます:

file = Dir("C:\Test\*.xlsx")

このコードは、「C:\Test」フォルダにある.xlsxで終わるファイルだけを対象に検索します。
つまり、.xlsmや.csvなどはこの時点で除外されるということです。

また、Dir(“*.xls*”)のように書けば、.xlsxも.xlsmも含めて検索することができます

このように、拡張子による絞り込みにはワイルドカードを活用してみましょう!

3.複数ファイルを順に処理する

1つのファイルを対象にした処理はシンプルでしたが、「フォルダ内のすべてのExcelファイルを順に処理したい」となると、少し工夫が必要です。
ここでは、その基本的な仕組みと書き方を見ていきましょう!

◼︎STEP1:1つ目のファイルを特定する

複数ファイルを処理するには、まずどのファイルから処理を始めるかを明確にする必要があります。

Dir関数を使って、以下のようにファイル名を取得しましょう:

Dim file As String
file = Dir("C:\Test\*.xlsx")

このコードは、「C:\Test」フォルダにある.xlsxファイルを検索し、最初に見つかった1件のファイル名を返します。
そして見つかったファイル名は、変数「file」に代入されます。

複数ファイルの処理の際にも、まずは1つ目のファイルを特定する必要があるため、ワイルドカード検索を活用して特定しましょう。

◼︎STEP2:次に処理するファイルを取得する

最初に処理するファイルをワイルドカードで指定したら、2番目以降のファイルを取得する処理を入れましょう。

2番目以降のファイルについては、パスで指定する必要はなくDir()と書くだけで大丈夫です。

file = Dir()

このように書くと、前回のDir(“検索条件”)で始まった検索状態が保持されており、次に見つかったファイル名が返されます。
さらにその次のファイルを取得するにも、また Dir() を使います。

Dir関数でファイル名を順に取得する時には、最初の1件目だけ条件付きで指定し、そのあとは引数なしで繰り返すということを覚えておきましょう。

◼︎STEP3:ファイルがなくなるまで繰り返す

最初のファイルを取得し、次のファイルも順に取得できるようになったら、いよいよ繰り返し処理の出番です!

ここでは、ファイルが見つかる限り処理を繰り返すために、Do While構文を使います。

Do While構文について詳しく学びたい方は、以下の記事を参照してください。

例えば:

Dim file As String
file = Dir("C:\Test\*.xlsx")

Do While file <> ""
 MsgBox "見つかったファイル:" & file
 file = Dir()
Loop

このコードでは、Dir(“検索条件”)で最初のファイルを取得し、その後は Dir() を呼び出して、次のファイルがなくなるまでループを続けます。
条件はとてもシンプルで、fileが空文字(””)になるまで繰り返すよう指定しています。

最初のパスの部分にご自身のフォルダのパスを入れて実行してみてください。
条件に一致するファイル名がメッセージボックスで順に表示され、最後のファイルまでいくと処理が完了するのを確認することができます。

このように、Dir関数とDo While構文を組み合わせることで指定フォルダのファイルを順に処理するマクロが出来上がりますので、ぜひ試してみてください。

4.Dir関数を使う時の注意点

Dir関数は便利ですが、指定方法に注意をしないと「なぜか動かない」「意図しない動作になる」といったトラブルが起こることもあります。

この章では、実装時につまずきやすいポイントやよくあるミスについて、事例を交えて解説します!

◼︎検索条件は1つしか保持できない

Dir関数を使う上でまず注意すべき点は、検索条件を1つしか保持できないという仕様です。
例えば、Dir(“条件”)でファイルを検索したあとに、別のDir呼び出しを挟んでしまうと、最初の検索条件はリセットされてしまいます。

次のようなコードは注意が必要です:

file = Dir("C:\Test\*.xlsx")
If Dir("C:\Log\*.txt") <> "" Then ' ここで検索状態がリセットされる
 ' ログファイルがある場合の処理
End If

file = Dir() ' 元の検索には戻れない

このように書くと、最後の「Dir()」では「”C:\Test\*.xlsx”」の検索結果ではなく「”C:\Log\*.txt”」の検索結果のファイル名を取得してしまいます。

例え「”C:\Test\*.xlsx”」の検索を再開したい場合でも、情報がリセットされているためまた最初のファイルから処理されていくことになります。

このように、Dirでの処理を複数パスで行ってしまうとトラブルの原因となってしまうので、1処理に1つまでしか使わないよう心がけましょう。

◼︎フルパスは取得できない

ここまで見てきた通り、Dir関数で取得できるのはファイル名のみ(例:「sample.xlsx」)で、パス情報(フォルダ名)は含まれていません
そのため、処理の中でファイルを開いたり、コピーしたりするときには、フォルダパスとファイル名を結合してフルパスを作成する必要があります。

例えば:

Dim folderPath As String
Dim file As String

folderPath = "C:\Test\"
file = Dir(folderPath & "*.xlsx")

Do While file <> ""
 Workbooks.Open folderPath & file
 file = Dir()
Loop

このように、Workbooks.OpenやFileCopyなど、フルパス指定が必要な場面では、パスとファイル名を連結して使いましょう。

◼︎ファイルが見つからない場合の処理の記載が必要

Dir関数を使ってファイルを検索する際、条件に一致するファイルが1件も見つからない可能性を考慮しておく必要があります。

例えば:

file = Dir("C:\Test\2501*.xlsx")
If file = "" Then
 MsgBox "該当ファイルが見つかりませんでした。"
 Exit Sub
End If

このように、Dirで何も見つからないケースに備えて分岐を設けることで、処理の安定性が大きく向上します。

見つからなかった場合の処理を記述せずに実行して該当するファイルが存在しなかった場合、そのあとの処理で実行時エラーが起きてしまう可能性があります。

エラーを起こすとマクロが中断されてしまうので、起こさないためにDirが空だった場合の処理も書いておくようにしましょう。

5.まとめ

この記事では、ファイルを検索して処理するときに使うDir関数について取り上げました。
改めて、学んだ内容を振り返りましょう。

◼︎Dir関数でできること

Dir関数は、VBAでファイルやフォルダを扱う際に役立つ、シンプルで柔軟な検索ツールです。
以下のように、目的ごとに活用方法を整理しておきましょう。

やりたいこと書き方例
ファイルの存在を確認したいDir(“C:\Test\sample.xlsx”)
拡張子でファイルを検索したいDir(“C:\Test\*.xlsx”)
名前の一部で条件を付けたいInStr(file, “2501”) > 0
複数の条件で絞り込みたいInStr(file, “2501”) > 0 And InStr(file, “報告書”) > 0
複数ファイルを順に処理したいDo While file <> “” + Dir()

この表で、Dir関数の基本機能とそれぞれの使い道がひと目で確認できます。

やりたい処理に合わせて、適切な書き方を選択しましょう!

◼︎Dir関数を使ううえで気をつけたい3つのポイント

Dir関数は扱いやすい反面、仕組みを正しく理解していないと意図しない動作になることがあります。

最後に、マクロに組み込むときに注意しておきたいポイントを3つに絞って振り返りましょう。

①検索状態は1つしか保持できない

→ 途中で別のDirを使うと検索状態がリセットされ、続きからの処理ができなくなる

② フルパスでの処理には結合が必要

→ Dirで返されるのはファイル名のみなので、フルパスを使う際にはfolderPath & fileのようにして指定する

③ ファイルがないときの処理を記述する

→ 検索結果が空文字(””)の可能性を考慮して、処理の分岐や終了を記述する

これらを押さえておけば、Dir関数を使ったファイル処理も安定して実務に活かせるマクロになります。

Dir関数は、VBAでファイルを扱ううえで欠かせない基本関数です。

今回学んだ検索・絞り込み・繰り返し処理のパターンを押さえれば、実務に役立つマクロが作りやすくなります。

ぜひ、ご自身の業務に合わせて応用してみてください!

\ Excelマクロ制作も承っています /

各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!

見積もり無料!超効率化!Excelマクロ開発します ルーティンワークの煩わしさに悩んでいる方へ