VBA Dir関数でワイルドカード検索する方法|フォルダ内のファイル名取得も解説

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
DIr関数について
サクッと結論

結果をサクッというと、まず fileName = Dir(FOLDER_PATH & "*.xlsx") で最初のファイル名を取得し、次からは fileName = Dir() で順番に取り出してください。

Dir 関数は、1つのフォルダ内のファイル名取得・ワイルドカード検索・ファイル存在チェックに向いています。サブフォルダまで探す処理や、別の Dir 検索をネストする処理は、FileSystemObject を使う方が安全です。

Excel VBAで「指定したフォルダ内のファイル名をセルに出したい」「拡張子が .xlsx のファイルだけ処理したい」「ファイルが存在するか確認したい」ときは、まず Dir 関数を使うのが定番です。

結論から言うと、1つのフォルダ内でファイル名を取得する、ワイルドカードで絞り込む、ファイル存在チェックをする だけなら Dir 関数で十分です。
一方で、サブフォルダまで再帰的に探す、フォルダをネストして順番に処理する、ファイルの更新日時やサイズもまとめて扱う 場合は、FileSystemObject を使った方が安全です。

Dir関数のイメージ
Dir関数は、指定した条件に一致するファイル名を順番に返します。

この記事では、現場でそのまま使えるコードを先に出し、その後で Dir() の意味、戻り値、ワイルドカード、attributes、注意点、FileSystemObjectとの使い分けまでまとめます。

検証・記述の前提は、Windows版ExcelのVBAです。VBA関数の仕様は2026年5月23日に Microsoft LearnのDir関数リファレンス で確認しています。実際に使うときは、サンプル内のフォルダパスを自分の環境に置き換えてください。

【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

この記事の探し方

スクロールできます
今やりたいこと確認する場所
まず動くコードをコピーしたいフォルダ内のExcelファイル名を取得する最短コード
*.xlsxReport_*.csv のように絞り込みたいワイルドカードでファイル名や拡張子を絞り込む
Dir() の2回目以降の意味が分からないDir()の2回目以降と戻り値の意味
フォルダ内のファイル名を一覧にしたいフォルダ内のファイル名を取得して順番に処理する実務例
ファイルがあるかどうか判定したいファイル存在チェックとフォルダ存在チェックを行う
サブフォルダまで検索したいDir関数はネスト・再帰処理できない
目次

VBA Dir関数でワイルドカード検索する基本コード

最初に、フォルダ内のExcelファイル名をシートに一覧表示するコードを載せます。
C:\サンプル\ の中から .xlsx ファイルだけを探し、Sheet1 のA列にファイル名を出力します。

Option Explicit

Sub ListXlsxFilesByDir()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim ws As Worksheet
    Dim fileName As String
    Dim nextRow As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ws.Range("A:A").ClearContents
    ws.Range("A1").Value = "ファイル名"

    nextRow = 2
    fileName = Dir(FOLDER_PATH & "*.xlsx")

    Do While fileName <> ""
        ws.Cells(nextRow, 1).Value = fileName
        nextRow = nextRow + 1
        fileName = Dir()
    Loop
End Sub

このコードで変更する場所は、基本的に2つです。

スクロールできます
変更する場所意味
FOLDER_PATH"C:\サンプル\"ファイルを探すフォルダ
"*.xlsx""*.csv""Report_*.xlsx"取得したいファイル名の条件

Dir(FOLDER_PATH & "*.xlsx") が最初の検索です。条件に一致した最初のファイル名が返ります。
次のファイル名を取るときは、引数なしで Dir() と書きます。ここが初心者の方がつまずきやすいポイントです。

Dir関数早見表

フォルダ内のExcelファイル名を取得する最短コード

「とにかく最初の1件だけ分かればよい」という場合は、ループを使わずに書けます。

Option Explicit

Sub GetFirstXlsxFileName()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim fileName As String

    fileName = Dir(FOLDER_PATH & "*.xlsx")

    If fileName <> "" Then
        Worksheets("Sheet1").Range("A1").Value = fileName
    Else
        Worksheets("Sheet1").Range("A1").Value = "該当ファイルなし"
    End If
End Sub

Dir 関数は、条件に一致するファイルが見つからないときに空文字 "" を返します。
そのため、If fileName <> "" Then と判定すれば、ファイルが見つかった場合だけ処理できます。

使用例1の結果
Dir関数で最初のファイル名を取得した結果です。

ワイルドカードでファイル名や拡張子を絞り込む

Dir 関数でよく使うワイルドカードは、*? です。

スクロールできます
ワイルドカード意味
*0文字以上の任意の文字*.xlsx売上*.csv
?任意の1文字????.txt
ワイルドカード早見表

実務でよく使う指定例は次のとおりです。

スクロールできます
書き方取得できるファイルの例使いどころ
*.xlsx売上.xlsx集計.xlsxExcelブックだけ取得したい
*.xls*売上.xlsxマクロ.xlsmxlsx、xlsmなどExcel系をまとめて拾いたい
Report_*.csvReport_202604.csv先頭の文字が決まっている
*2026*.xlsx売上_2026_集計.xlsxファイル名の途中に日付や年度が入る
????.txtdata.txt文字数が決まっている

拡張子を指定してファイルを取得するコードは、先ほどの基本コードの Dir の条件を変えるだけです。

Option Explicit

Sub ListCsvFiles()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim fileName As String
    Dim nextRow As Long

    nextRow = 2
    fileName = Dir(FOLDER_PATH & "*.csv")

    Do While fileName <> ""
        Worksheets("Sheet1").Cells(nextRow, 1).Value = fileName
        nextRow = nextRow + 1
        fileName = Dir()
    Loop
End Sub

"*.csv" の部分を変えれば、Excelファイル、テキストファイル、特定の接頭語を持つファイルなどを絞り込めます。
実務では「拡張子で絞る」「先頭の文字で絞る」「日付を含むファイルだけ拾う」という使い方が多いため、ワイルドカードはDir関数で最初に押さえたいポイントです。

使用例4の結果
拡張子を指定してファイル名を取得した結果です。

Dir()の2回目以降と戻り値の意味


Dir 関数は、1回目と2回目以降で書き方が変わります。

スクロールできます
呼び出し書き方役割
1回目Dir("C:\サンプル\*.xlsx")検索条件を指定して、最初の一致を返す
2回目以降Dir()同じ条件で、次の一致を返す
一致がなくなった後Dir() の戻り値が ""ループ終了の合図

重要なのは、Dir 関数が「前回の検索条件」を内部で覚えていることです。
だから2回目以降は、次のように引数なしで書けます。

fileName = Dir(FOLDER_PATH & "*.xlsx")

Do While fileName <> ""
    Debug.Print fileName
    fileName = Dir()
Loop

逆に、ループの最後で fileName = Dir() を書き忘れると、同じファイル名のままループが進まず、無限ループに近い状態になります。
Do While fileName <> ""fileName = Dir() はセットで覚えてください。

Dir関数の構文・属性・パス指定を理解する

Dir 関数の構文はシンプルです。

Dir関数の構成

Microsoft LearnのDir関数リファレンス では、Dir は指定したパターンや属性に一致するファイル名、ディレクトリ名、フォルダ名などを返す関数として説明されています。

スクロールできます
引数省略説明
pathname探したいファイル名、フォルダ名、パス、ワイルドカードを指定する
attributes読み取り専用、隠しファイル、フォルダなどの属性を指定する

Dir関数の構文と引数

pathname には、ファイル名だけでも、フォルダパス込みでも指定できます。

'カレントフォルダから探す
Debug.Print Dir("*.xlsx")

'指定フォルダから探す
Debug.Print Dir("C:\サンプル\*.xlsx")

通常は、フォルダパス込みで指定する方が安全です。
ファイル名だけで指定すると、VBAのカレントフォルダに依存するため、想定外の場所を探してしまうことがあります。

また、Dir 関数の戻り値は「ファイル名だけ」です。フルパスではありません。

Dim folderPath As String
Dim fileName As String
Dim fullPath As String

folderPath = "C:\サンプル\"
fileName = Dir(folderPath & "*.xlsx")

If fileName <> "" Then
    fullPath = folderPath & fileName
    Debug.Print fullPath
End If

ファイルを開く、リンクを作る、別フォルダへコピーする場合は、folderPath & fileName のように自分で結合します。

attributesで隠しファイルやフォルダを取得する

attributes を指定すると、通常ファイル以外も取得できます。

スクロールできます
定数主な用途
vbNormal0属性のない通常ファイル
vbReadOnly1読み取り専用ファイルも含める
vbHidden2隠しファイルも含める
vbSystem4システムファイルも含める
vbDirectory16フォルダも含める
vbAlias64Macintoshのエイリアス用

複数の属性を含めたい場合は、Or でつなぎます。

fileName = Dir("C:\サンプル\*.*", vbHidden Or vbReadOnly)

ただし、vbDirectory を指定すると「フォルダだけ」が返るわけではありません。通常ファイルも混ざることがあります。
フォルダかどうかを厳密に判定したい場合は、GetAttrvbDirectory 属性を確認します。

If (GetAttr("C:\サンプル\集計") And vbDirectory) = vbDirectory Then
    Debug.Print "フォルダです"
End If

フォルダパスの最後のバックスラッシュに注意する

Dir 関数でフォルダパスとファイル名を結合するときは、フォルダパスの最後に \ が必要です。

'OK
fileName = Dir("C:\サンプル\" & "*.xlsx")

'NGになりやすい
fileName = Dir("C:\サンプル" & "*.xlsx")

2つ目は、結果的に C:\サンプル*.xlsx のような文字列になってしまいます。
これでは「サンプルフォルダ内のxlsx」ではなく、「Cドライブ直下でサンプルから始まるxlsx」のような意味になり、意図した検索になりません。

フォルダパス
フォルダパスの最後にバックスラッシュがあるか確認します。

必要であれば、フォルダパスの最後に \ を補う関数を作っておくと安心です。

Private Function AddTrailingBackslash(ByVal folderPath As String) As String
    If Len(folderPath) = 0 Then
        AddTrailingBackslash = ""
    ElseIf Right$(folderPath, 1) = "\" Then
        AddTrailingBackslash = folderPath
    Else
        AddTrailingBackslash = folderPath & "\"
    End If
End Function

使う側は次のように書けます。

Dim folderPath As String

folderPath = AddTrailingBackslash("C:\サンプル")
Debug.Print Dir(folderPath & "*.xlsx")

VBAのコード上では \ と表示されますが、環境やフォントによっては円マークのように見えることがあります。意味は同じパス区切りです。

バックスラッシュ
Windowsのフォルダパスではバックスラッシュを使います。
円マーク
環境によってはバックスラッシュが円マークのように表示されます。

フォルダ内のファイル名を取得して順番に処理する実務例

ここからは、現行記事でも扱っている使用例を残しつつ、実務で使いやすい形に整理します。
サンプルでは、次のようなフォルダにファイルが入っている前提です。

このフォルダを使用して解説します
サンプルフォルダ内のファイルを使ってDir関数の動きを確認します。

実務コードの選び方

ここでは、フォルダ内のファイル名を取得する処理を、目的別に分けて確認します。
最初は「ファイル名を1件だけ取る」「一覧にする」「条件で絞る」「順番に開く」の4方向で考えると選びやすいです。

スクロールできます
やりたいこと確認するコード主に使う書き方
最初に見つかったファイル名だけ取得したい使用例1: 最初のファイル名を取得するDir(folderPath & "*.*")
フォルダ内の通常ファイルをすべて一覧にしたい使用例2: すべての通常ファイル名を取得するDir() でループ
隠しファイルや読み取り専用ファイルも含めたい使用例3: 属性付きで取得するvbHidden Or vbReadOnly
拡張子を指定して取得したい使用例4: 拡張子で絞り込むDir(folderPath & "*.xlsx")
Excelファイルを順番に開いて処理したい使用例5: Excelファイルを順番に開くWorkbooks.Open folderPath & fileName
一覧をクリックして開けるようにしたいハイパーリンク付きのファイル一覧を作るHyperlinks.Add
ファイルやフォルダがあるか確認したいファイル存在チェックとフォルダ存在チェックを行うLen(Dir(...)) > 0

使用例1: 指定したフォルダの最初のファイル名を取得する

Option Explicit

Sub GetFirstFileName()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim fileName As String

    fileName = Dir(FOLDER_PATH & "*.*")

    If fileName <> "" Then
        Worksheets("Sheet1").Range("A1").Value = fileName
    Else
        Worksheets("Sheet1").Range("A1").Value = "ファイルが見つかりません"
    End If
End Sub
使用例1: 指定したフォルダの最初のファイル名を取得するの結果です

最初の1件だけ必要な場合は、この書き方で十分です。
ただし、取得順は必ずしも自分が見ているエクスプローラーの並び順と同じとは限りません。順番が重要な場合は、いったん配列に入れて並べ替える設計にします。

使用例2: フォルダ内のすべての通常ファイル名を取得する

Option Explicit

Sub ListAllNormalFiles()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim ws As Worksheet
    Dim fileName As String
    Dim nextRow As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ws.Range("A:B").ClearContents
    ws.Range("A1").Value = "ファイル名"
    ws.Range("B1").Value = "フルパス"

    nextRow = 2
    fileName = Dir(FOLDER_PATH & "*.*")

    Do While fileName <> ""
        ws.Cells(nextRow, 1).Value = fileName
        ws.Cells(nextRow, 2).Value = FOLDER_PATH & fileName
        nextRow = nextRow + 1
        fileName = Dir()
    Loop
End Sub

Dir() をループの最後に書くことで、次のファイル名へ進みます。
A列にはファイル名、B列にはフルパスを出しているため、後続処理でファイルを開くときにも使いやすくなります。

使用例2: フォルダ内のすべての通常ファイル名を取得するの結果

使用例3: 隠しファイルや読み取り専用ファイルも含めて取得する

Option Explicit

Sub ListFilesWithAttributes()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim fileName As String
    Dim nextRow As Long

    nextRow = 2
    fileName = Dir(FOLDER_PATH & "*.*", vbHidden Or vbReadOnly)

    Do While fileName <> ""
        Worksheets("Sheet1").Cells(nextRow, 1).Value = fileName
        nextRow = nextRow + 1
        fileName = Dir()
    Loop
End Sub

通常の Dir(FOLDER_PATH & "*.*") では、隠しファイルなどが意図どおりに拾えないことがあります。
隠しファイルや読み取り専用ファイルも対象にするなら、attributesvbHidden Or vbReadOnly のように指定します。

使用例3の結果

使用例4: 拡張子を指定してファイルを取得する

拡張子指定は、ワイルドカードの代表例です。

Option Explicit

Sub ListXlsmFiles()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim fileName As String
    Dim nextRow As Long

    nextRow = 2
    fileName = Dir(FOLDER_PATH & "*.xlsm")

    Do While fileName <> ""
        Worksheets("Sheet1").Cells(nextRow, 1).Value = fileName
        nextRow = nextRow + 1
        fileName = Dir()
    Loop
End Sub

*.xlsm にすればマクロ有効ブックだけ、*.csv にすればCSVだけを取得できます。
*.xls* のように書くと、.xls.xlsx.xlsm などをまとめて拾えます。

使用例5: フォルダ内のExcelファイルを順番に開く

ファイル名を取得するだけでなく、取得したファイルを順番に開いて処理することもできます。

Option Explicit

Sub OpenAllXlsxFiles()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim fileName As String
    Dim wb As Workbook

    fileName = Dir(FOLDER_PATH & "*.xlsx")

    Do While fileName <> ""
        Set wb = Workbooks.Open(FOLDER_PATH & fileName)

        'ここにブックごとの処理を書く
        Debug.Print wb.Name

        wb.Close SaveChanges:=False
        fileName = Dir()
    Loop
End Sub
使用例5: フォルダ内のExcelファイルを順番に開くの結果

このコードは、対象フォルダ内の .xlsx ファイルを1つずつ開き、処理後に保存せず閉じます。
実務で使うときは、'ここにブックごとの処理を書く の部分に、転記、集計、印刷、PDF化などの処理を入れます。

注意点として、開いたブックに変更を加える場合は SaveChanges:=False のままでよいか必ず確認してください。保存が必要な処理では、保存先や上書き条件を別途設計します。

動画で学ぶなら PR・アフィリエイト

Dir関数だけでなく、複数ブック処理やファイル操作まで理解したい方は、VBA講座も確認しておくと迷いにくいです

この記事のコードだけでも、フォルダ内のファイル名取得や存在チェックは試せます。ただ、Dir() のループ、Workbooks.Open、複数Excelファイルの集計、エラー処理までまとめて身につけたい場合は、動画講座で実際の操作画面を見ながら学ぶと理解しやすくなります。

見るべきポイント ファイル操作・ブック操作・ループ処理まで扱っているか
失敗しにくい選び方 更新日・無料プレビュー・返金条件を確認
向いている人 コピペだけでなく、実務用にコードを直せるようになりたい人

※価格・割引・返金条件・講座内容は変わる場合があります。購入前にUdemy上で最新情報をご確認ください。

ファイル名を一覧にするだけでなく、セルをクリックして対象ファイルを開けるようにしたい場合は、Hyperlinks.Add を使います。
Excelの Hyperlinks.Add は、指定したセルや図形にリンクを追加するメソッドです。引数は Microsoft LearnのHyperlinks.Addメソッド でも確認できます。

Option Explicit

Sub ListFilesWithHyperlinks()
    Const FOLDER_PATH As String = "C:\サンプル\"

    Dim ws As Worksheet
    Dim fileName As String
    Dim nextRow As Long
    Dim fullPath As String

    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ws.Range("A:B").ClearContents
    ws.Range("A1").Value = "ファイル名"
    ws.Range("B1").Value = "フルパス"

    nextRow = 2
    fileName = Dir(FOLDER_PATH & "*.*", vbHidden Or vbReadOnly)

    Do While fileName <> ""
        fullPath = FOLDER_PATH & fileName

        ws.Hyperlinks.Add _
            Anchor:=ws.Cells(nextRow, 1), _
            Address:=fullPath, _
            TextToDisplay:=fileName

        ws.Cells(nextRow, 2).Value = fullPath

        nextRow = nextRow + 1
        fileName = Dir()
    Loop
End Sub

この形にしておくと、フォルダ内のファイル一覧をExcel上で管理できます。
現場では、月次ファイルの確認、提出物の一覧化、添付資料のリンク集作成などで使いやすいです。

ハイパーリンク付きファイル一覧の結果

ファイル存在チェックとフォルダ存在チェックを行う

Dir 関数は、ファイル存在チェックにも使えます。

Option Explicit

Public Function FileExistsByDir(ByVal targetPath As String) As Boolean
    FileExistsByDir = (Len(Dir(targetPath)) > 0)
End Function

使い方は次のとおりです。

Sub CheckFileSample()
    If FileExistsByDir("C:\サンプル\売上.xlsx") Then
        MsgBox "ファイルがあります"
    Else
        MsgBox "ファイルがありません"
    End If
End Sub

フォルダ存在チェックも Dir(folderPath, vbDirectory) で書けますが、厳密には通常ファイルも返る可能性があるため、GetAttr で判定する方が安全です。

Option Explicit

Public Function FolderExistsByGetAttr(ByVal folderPath As String) As Boolean
    On Error GoTo NotFound

    FolderExistsByGetAttr = ((GetAttr(folderPath) And vbDirectory) = vbDirectory)
    Exit Function

NotFound:
    FolderExistsByGetAttr = False
End Function

ファイルだけなら Dir、フォルダを厳密に判定したいなら GetAttr または FileSystemObject と覚えると、誤判定を減らせます。

Dir関数でできないこと・FAQ・次に読む記事

Dir 関数は便利ですが、万能ではありません。
特に重要なのが、Dir関数はネストや再帰処理に向かない という点です。
この場合は対策としてFileSystemObjectを使用しましょう。

Dir関数はネスト・再帰処理できない

Microsoft LearnのDir関数リファレンスでも、Dir 関数を再帰的に呼び出すことはできないと説明されています。
理由は、Dir 関数が内部に持つ検索状態が1つだけだからです。

たとえば、外側の Dir でフォルダ一覧を回している途中に、内側で別の Dir(path) を始めると、外側の検索状態が上書きされます。

'このようなネストは避ける
folderName = Dir("C:\サンプル\*", vbDirectory)

Do While folderName <> ""
    If folderName <> "." And folderName <> ".." Then
        If (GetAttr("C:\サンプル\" & folderName) And vbDirectory) = vbDirectory Then
            fileName = Dir("C:\サンプル\" & folderName & "\*.xlsx")

            Do While fileName <> ""
                Debug.Print fileName
                fileName = Dir()
            Loop
        End If
    End If

    'ここで外側のDir検索状態が崩れている可能性がある
    folderName = Dir()
Loop

このように、外側と内側で同時に Dir を使う処理は壊れやすくなります。
「フォルダの中のサブフォルダまで順番に見たい」「階層をたどりたい」という場合は、Dir で無理に書かず、FileSystemObjectに切り替えた方が安全です。

Dir関数は単一フォルダ向き、FileSystemObjectはサブフォルダ再帰処理向きです。

サブフォルダまで検索するならFileSystemObjectを使う

FileSystemObject は、ファイルシステムへアクセスするためのオブジェクトです。
Microsoft LearnのFileSystemObjectオブジェクト では、FileExistsFolderExistsGetFolderGetFileName など、ファイルやフォルダを扱うメソッドが整理されています。

サブフォルダまで再帰的にファイルを一覧化するなら、次のように書きます。

Option Explicit

Sub ListFilesRecursiveByFso()
    Const ROOT_FOLDER As String = "C:\サンプル"

    Dim fso As Object
    Dim rootFolder As Object
    Dim ws As Worksheet
    Dim nextRow As Long

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set rootFolder = fso.GetFolder(ROOT_FOLDER)
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ws.Range("A:C").ClearContents
    ws.Range("A1").Value = "ファイル名"
    ws.Range("B1").Value = "フルパス"
    ws.Range("C1").Value = "親フォルダ"

    nextRow = 2
    WriteFilesInFolder rootFolder, ws, nextRow
End Sub

Private Sub WriteFilesInFolder(ByVal targetFolder As Object, _
                               ByVal ws As Worksheet, _
                               ByRef nextRow As Long)
    Dim fileItem As Object
    Dim subFolder As Object

    For Each fileItem In targetFolder.Files
        ws.Cells(nextRow, 1).Value = fileItem.Name
        ws.Cells(nextRow, 2).Value = fileItem.Path
        ws.Cells(nextRow, 3).Value = targetFolder.Path
        nextRow = nextRow + 1
    Next fileItem

    For Each subFolder In targetFolder.SubFolders
        WriteFilesInFolder subFolder, ws, nextRow
    Next subFolder
End Sub

このコードでは、参照設定なしで使えるように CreateObject("Scripting.FileSystemObject") を使っています。
サブフォルダの中にさらにサブフォルダがある場合も、WriteFilesInFolder が自分自身を呼び出して階層を下っていきます。

Dir でできることを無理に広げるより、次の基準で切り替える方が読みやすく、壊れにくいです。

Dir関数・FileSystemObject・Shellの使い分け

スクロールできます
方法向いていること苦手なこと
Dir 関数単一フォルダ内のファイル名取得、ワイルドカード検索、簡単な存在チェックネスト、再帰処理、詳細なファイル情報取得
FileSystemObjectサブフォルダ再帰、ファイルサイズや更新日時の取得、フォルダ存在チェックDir よりコード量が増える
Shellエクスプローラーでフォルダを開く、外部アプリを起動するファイル一覧の取得や条件検索には向かない

初心者の方は、まず Dir 関数で「1つのフォルダ内のファイルを順番に処理する」感覚をつかむのがおすすめです。
その後、サブフォルダやファイル情報まで扱いたくなったら、FileSystemObjectへ進むと理解しやすくなります。

Dir関数のよくあるエラー・FAQ・まとめ

最後に、Dir関数でつまずきやすい原因と対策をまとめます。

よくあるエラーと対策

スクロールできます
症状主な原因対策
何も取得できないフォルダパスが違う、最後の \ がない、拡張子条件が合っていないDebug.Print FOLDER_PATH & "*.xlsx" で実際の検索文字列を確認する
同じファイル名のまま進まないループ内の最後で fileName = Dir() を書いていないDo While の最後に必ず Dir() を入れる
途中で外側のループが崩れるDir をネストして別の検索を始めているネストが必要ならFileSystemObjectへ切り替える
フォルダ名も混ざるvbDirectory で通常ファイルも返る場合があるGetAttr でフォルダかどうか判定する
隠しファイルが出ないattributes を指定していないvbHiddenvbReadOnly を指定する
取得順が思った順番と違うOSやファイルシステムの並び順に依存する配列やコレクションに入れてから並べ替える
ファイルを開けないDir の戻り値がファイル名だけなのに、フルパスにしていないfolderPath & fileName でフルパスを作る

困ったときは、まず Debug.Print で「VBAが実際に探しているパス」を確認してください。

Debug.Print FOLDER_PATH & "*.xlsx"
Debug.Print fileName

この2つを出すだけで、パスの結合ミス、拡張子ミス、Dir() の進め忘れに気づきやすくなります。

FAQ

VBAのDir関数とは何ですか?

指定したパスやワイルドカード条件に一致するファイル名、フォルダ名を返すVBA関数です。単一フォルダ内のファイル名取得や存在チェックでよく使います。

Dir() と引数なしで書くのはなぜですか?

1回目の Dir(pathname) で検索条件を指定し、2回目以降の Dir() で同じ条件に一致する次のファイル名を取得するためです。一致がなくなると戻り値は空文字 "" になります。

Dir 関数の戻り値はフルパスですか?

フルパスではなく、基本的にはファイル名だけです。ファイルを開く場合やリンクを作る場合は、folderPath & fileName のようにフォルダパスと結合します。

Dir$Dir の違いは何ですか?

実務上はほぼ同じ目的で使われます。Dir$ は戻り値が文字列型に固定される書き方です。初心者はまず Dir で覚えれば問題ありません。

サブフォルダ内のファイルもDir関数で取得できますか?

Dir 関数だけで再帰的にサブフォルダをたどるのは避けた方がよいです。Dirは再帰呼び出しに向かないため、サブフォルダまで検索するならFileSystemObjectを使います。

Access VBAでもDir関数は使えますか?

基本的な考え方は同じです。ただし、この記事のコードはExcelのシート出力や Workbooks.Open を含むため、Access VBAで使う場合は出力先や開く処理をAccess向けに置き換えてください。

スポンサーリンク

ポイントのおさらい

Dir 関数は、Excel VBAでファイルやフォルダを扱う最初の入口として非常に便利です。

スクロールできます
覚えること要点
ワイルドカード*.xlsxReport_*.csv のように条件を絞れる
1回目のDirDir(folderPath & "*.xlsx") のように検索条件を指定する
2回目以降のDirDir() で次のファイルへ進む
終了条件戻り値が "" になったら一致なし
フルパスDir の戻り値はファイル名なので、必要なら folderPath & fileName を作る
注意点Dirはネスト・再帰処理に向かない
代替手段サブフォルダ検索はFileSystemObjectを使う

まずは、この記事の最初に載せた ListXlsxFilesByDir を自分のフォルダパスに置き換えて動かしてみてください。
そのうえで、拡張子指定、存在チェック、ハイパーリンク付き一覧、FileSystemObjectの再帰処理へ広げると、フォルダ内ファイル処理のかなり多くを自動化できます。

次の段階では、ChatGPTやCursorに「このDir関数のコードを自分のフォルダ構成に合わせて直す」よう依頼すると、実務用のコードへ広げやすくなります。AIでコードを作る場合も、この記事で説明した Dir() の進み方、戻り値、ネスト不可の注意点を理解しておくと、出力されたコードの確認がしやすくなります。

毎日同じフォルダ処理を繰り返している場合は、VBAだけでなくPower AutomateやAIコード生成との使い分けも検討できます。この記事ではDir関数の基本に集中し、より広い自動化手段の比較は別記事で確認できるようにするのが読みやすいです。

Schedika ローカルガントチャート
PR・自社製品 無料Liteあり

ファイル一覧を作ったあとの、提出状況や締切管理に困っていませんか?

Dir関数でファイル一覧を自動で作れるようになると、次に出てくる悩みが「集めたファイルの提出状況や締切をどう管理するか」です。Excelで工程表を毎月作り直している場合は、ローカルで動くガントチャートアプリ Schedika に置き換えると、ファイル一覧作成と進捗管理を分けて扱いやすくなります。

  • 外部送信なし
  • Excelへ提出しやすい
  • ブラウザで起動

※Schedikaは筆者が作成した自社製品です。無料Lite版とStandard版の違い、動作環境、価格はリンク先で確認できます。

VBAの基礎を続けて確認したい場合は、次の記事もあわせて読むとつながりやすいです。

スクロールできます
次に読みたい内容関連記事
取得したファイル名を配列に入れて並べ替えたいVBAの配列を使いこなす
ファイルを別名保存したいVBAでWorkbooks.SaveAsを使う方法
一覧の最終行を取得したいVBAで最終行・最終列を取得する方法
Outlook添付やメール送信につなげたいVBAでOutlookを操作する方法
VBAの記事を一覧で探したいサイトマップ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次