Excel VBAで業務自動化を進めていくと、ほぼ必ず直面するのが「フォルダ内のファイルをまとめて処理したい」という要望です。
月次のExcelファイルを一括で集計したい、CSVをすべて読み込んで統合したい、特定の拡張子だけを抽出して処理したい──こうした場面は、実務では日常的に発生します。
このようなファイル操作の基盤となるのが Dir関数 です。
しかし現場では、
・サンプルをコピペして何となく使っている
・Dirを2回使ったら動かなくなった
・フォルダが変わると急にエラーが出る
・なぜループが終わらないのか分からない
といった悩みを抱えているケースが非常に多く見られます。
この記事では、VBAのDir関数の基本構造から、実務で安定して使うための設計・応用パターンまでを、考え方重視で徹底的に解説します。
最後まで読むことで、「Dir関数はどういう仕組みで動いているのか」「どんな使い方が危険なのか」「実務ではどう設計すれば壊れないのか」が明確になり、ファイル操作マクロを安心して書けるようになります。
目次
- ✅ Dir関数とは何かを正しく理解する
- ・Dir関数の基本的な役割
- ・Dir関数は状態を持つ関数である
- ✅ Dir関数の基本構文を理解する
- ・最小構成のDir関数
- ・Dir関数はパスではなく「名前」を返す
- ✅ Dir関数を使った基本的なループ構造
- ・標準的なDirループ構文
- ・この構造が意味すること
- ✅ Dir関数でよくある誤解と失敗パターン
- ・Dirを途中で別用途に使ってしまう
- ・Dirは同時に1系統しか使えない
- ✅ 拡張子を指定してファイルを取得する方法
- ・Excelファイルのみ取得する例
- ・CSVファイルのみ取得する例
- ・複数拡張子を扱う場合の考え方
- ✅ フォルダの存在確認にDir関数を使う
- ・フォルダ存在チェックの基本例
- ・この使い方が便利な理由
- ✅ ファイル存在チェックとしてのDir関数
- ・ファイル存在確認の例
- ・注意点
- ✅ Dir関数とVBAによるファイル一括処理
- ・Excelファイルを順に開く例
- ✅ Dir関数と処理速度の関係
- ・遅くなる原因の例
- ✅ Dir関数とエラーが出やすいポイント
- ・よくあるトラブル
- ・0件の場合の設計
- ✅ Dir関数とExit Subを組み合わせた安全設計
- ・安全な基本形
- ✅ FileSystemObjectとの違いを理解する
- ・Dir関数の特徴
- ・FSOの特徴
- ✅ Dir関数を使った実務設計の考え方
- ・実務で意識すべきポイント
- ✅ Dir関数と業務自動化の発展
- ✅ まとめ:Dir関数を正しく理解し、実務で使えるVBAを作る
✅ Dir関数とは何かを正しく理解する
Dir関数は、VBAでフォルダ内のファイルやフォルダ名を取得するための関数です。
一見シンプルですが、その内部動作を理解していないと、思わぬ不具合を引き起こします。
この章を飛ばして使い始めると、「動く時もあるが、理由が分からず止まるマクロ」になりがちです。
まずは、Dir関数の本質を整理しましょう。
・Dir関数の基本的な役割
Dir関数は、指定した条件に一致する
ファイル名またはフォルダ名を1つずつ返す
ための関数です。
ポイントは、「1つずつ」という点です。
Dir関数は一覧を一気に返すのではなく、内部的に順番を保持しながら、次の対象を返す仕組みになっています。
・Dir関数は状態を持つ関数である
Dir関数は、呼び出し状態(内部カーソル)を持っています。
この性質を理解していないと、後述する「Dirを2回使うと壊れる問題」に直面します。
✅ Dir関数の基本構文を理解する
まずは、Dir関数の最も基本的な使い方を確認します。
ここを曖昧にしたまま応用に進むと、必ず混乱します。
・最小構成のDir関数
Sub DirBasic()
Dim fileName As String
fileName = Dir("C:\Data\*.xlsx")
MsgBox fileName
End Sub
このコードでは、
指定フォルダ内で最初に見つかったExcelファイル名が1つ返ります。
・Dir関数はパスではなく「名前」を返す
返ってくるのは、
sample.xlsx
のようなファイル名のみです。
フルパスが必要な場合は、
自分でパスを結合する必要があります。
✅ Dir関数を使った基本的なループ構造
Dir関数は、単体で使うよりも、ループ処理と組み合わせるのが基本です。
・標準的なDirループ構文
Sub DirLoop()
Dim fileName As String
fileName = Dir("C:\Data\*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir
Loop
End Sub
・この構造が意味すること
- 最初のDirで検索条件を指定
- 以降のDirは「次のファイル」を取得
- 取得できなくなると空文字が返る
この仕組みを理解することが、Dir関数活用の第一歩です。
✅ Dir関数でよくある誤解と失敗パターン
Dir関数はシンプルな反面、誤解されやすいポイントが多くあります。
実務で頻発する失敗例を整理します。
・Dirを途中で別用途に使ってしまう
fileName = Dir("C:\Data\*.xlsx")
If Dir("C:\Other\") <> "" Then
' 処理
End If
このようなコードを書くと、
Dirの状態が上書きされ、元のループが壊れます。
・Dirは同時に1系統しか使えない
Dir関数は、
1つの検索状態しか保持できません。
複数フォルダを同時に探索したい場合は、
- ループを分ける
- 別の仕組みを使う
といった設計が必要です。
✅ 拡張子を指定してファイルを取得する方法
実務で最も多いのが、特定拡張子のファイルだけを扱うケースです。
・Excelファイルのみ取得する例
fileName = Dir("C:\Data\*.xlsx")
・CSVファイルのみ取得する例
fileName = Dir("C:\Data\*.csv")
・複数拡張子を扱う場合の考え方
Dir関数は、
*.xlsx;*.xls
のような指定はできません。
そのため、
- 拡張子ごとにDirを回す
- 取得後にIf文で判定
といった設計が必要になります。
参考:【Excel】ファイル形式(拡張子)とは|初心者でも理解できる基本と違い・選び方を徹底解説
✅ フォルダの存在確認にDir関数を使う
Dir関数は、ファイル取得だけでなく、存在確認にもよく使われます。
・フォルダ存在チェックの基本例
If Dir("C:\Data\", vbDirectory) = "" Then
MsgBox "フォルダが存在しません"
Exit Sub
End If
・この使い方が便利な理由
- 追加の関数が不要
- 処理前チェックが簡単
ただし、
ファイル取得用のDirと混在させない
ことが重要です。
✅ ファイル存在チェックとしてのDir関数
特定ファイルが存在するかどうかを調べる用途でも、Dir関数はよく使われます。
・ファイル存在確認の例
If Dir("C:\Data\sample.xlsx") = "" Then
MsgBox "ファイルが存在しません"
Exit Sub
End If
・注意点
この用途でDirを使った後に、
同じSub内でDirループを行うと、
状態が初期化されてしまいます。
参考:【VBA】Boolean型とは?True/Falseの使い方と実務での注意点を徹底解説
✅ Dir関数とVBAによるファイル一括処理
Dir関数が最も力を発揮するのは、
「ファイルを1つずつ開いて処理する」
場面です。
・Excelファイルを順に開く例
Sub OpenFiles()
Dim fileName As String
Dim wb As Workbook
fileName = Dir("C:\Data\*.xlsx")
Do While fileName <> ""
Set wb = Workbooks.Open("C:\Data\" & fileName)
' 処理
wb.Close False
fileName = Dir
Loop
End Sub
この構造は、
Excel統合・集計・変換処理の基礎
になります。
✅ Dir関数と処理速度の関係
Dir関数自体は非常に高速です。
遅くなる原因のほとんどは、Dirの中で何をしているかにあります。
・遅くなる原因の例
- ファイルを開く回数が多い
- セルを1つずつ操作している
- 画面更新を止めていない
Dirは「きっかけ」であり、
処理設計全体が速度を左右します。
✅ Dir関数とエラーが出やすいポイント
Dir関数自体はエラーを出しにくい関数ですが、
使い方を誤ると、後続処理でエラーが発生します。
・よくあるトラブル
- フォルダパスの最後の「\」忘れ
- ファイルが0件だった場合の考慮漏れ
- 取得した名前をフルパスと誤解
・0件の場合の設計
fileName = Dir("C:\Data\*.xlsx")
If fileName = "" Then
MsgBox "対象ファイルがありません"
Exit Sub
End If
✅ Dir関数とExit Subを組み合わせた安全設計
Dir関数は、Exit Subと非常に相性が良い構文です。
・安全な基本形
Sub SafeDir()
Dim fileName As String
fileName = Dir("C:\Data\*.xlsx")
If fileName = "" Then
MsgBox "処理対象がありません"
Exit Sub
End If
Do While fileName <> ""
' 処理
fileName = Dir
Loop
End Sub
この設計により、
無駄な処理やエラーを未然に防げます。
参考:【VBA】Exit Subの基本~実用的な使い方|処理制御と安全なマクロ設計を完全解説
✅ FileSystemObjectとの違いを理解する
Dir関数と比較されやすいのが、FileSystemObject(FSO)です。
・Dir関数の特徴
- 軽量
- 準備不要
- 高速
・FSOの特徴
- 情報が豊富
- サブフォルダ操作が容易
- やや重い
単純なファイル列挙はDir関数、
複雑な操作はFSO
という使い分けが、実務では一般的です。
✅ Dir関数を使った実務設計の考え方
Dir関数を使う際は、
「Dirは1回の処理専用」
という意識が非常に重要です。
・実務で意識すべきポイント
- 1つのSubで1系統のDir
- 存在チェックと列挙を混在させない
- フルパスは自分で組み立てる
- 0件時の処理を必ず書く
これだけで、トラブルは大幅に減ります。
✅ Dir関数と業務自動化の発展
Dir関数を正しく使えるようになると、
- ファイル統合
- CSV取り込み
- 自動バックアップ
- ログ処理
といった業務自動化の幅が一気に広がります。
Dir関数は、
VBAファイル操作の土台となる構文
と言っても過言ではありません。
✅ まとめ:Dir関数を正しく理解し、実務で使えるVBAを作る
- Dir関数はファイル・フォルダを1件ずつ取得する関数
- 内部状態を持つため、同時利用は不可
- ループ構造の理解が最重要
- 存在チェックと列挙処理は分けて設計
- Exit Subと組み合わせて安全設計
- 単純処理はDir、複雑処理はFSO
Dir関数は、
シンプルだが奥が深い、VBAの基礎中の基礎です。
今回の内容を意識して使えば、
「動くけど不安なマクロ」から
「実務で安心して任せられるマクロ」へと、
確実にステップアップできます。