VBAテクニック集 VBA一覧 文法・構文 関数・イベント

【VBA】Dir関数の活用法|ファイル操作を自動化する実務向け完全ガイド

Excel VBAで業務自動化を進めていくと、ほぼ必ず直面するのが「フォルダ内のファイルをまとめて処理したい」という要望です。
月次のExcelファイルを一括で集計したい、CSVをすべて読み込んで統合したい、特定の拡張子だけを抽出して処理したい──こうした場面は、実務では日常的に発生します。

このようなファイル操作の基盤となるのが Dir関数 です。
しかし現場では、
・サンプルをコピペして何となく使っている
・Dirを2回使ったら動かなくなった
・フォルダが変わると急にエラーが出る
・なぜループが終わらないのか分からない
といった悩みを抱えているケースが非常に多く見られます。

この記事では、VBAのDir関数の基本構造から、実務で安定して使うための設計・応用パターンまでを、考え方重視で徹底的に解説します。
最後まで読むことで、「Dir関数はどういう仕組みで動いているのか」「どんな使い方が危険なのか」「実務ではどう設計すれば壊れないのか」が明確になり、ファイル操作マクロを安心して書けるようになります。

目次

✅ 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の基礎中の基礎です。

今回の内容を意識して使えば、
「動くけど不安なマクロ」から
「実務で安心して任せられるマクロ」へと、
確実にステップアップできます。

参考:【VBA】SubとFunctionの違いとは?役割・使い分け・設計基準を徹底解説

    -VBAテクニック集, VBA一覧, 文法・構文, 関数・イベント