【Excel VBA】Dir関数でフォルダ内のファイル一覧を取得する方法|拡張子指定・サブフォルダ対応
みなさんこんにちは。
Excel VBAで業務を自動化していると、指定したフォルダの中にあるファイルを順番に取得したい場面があるかと思います。
例えば、毎月届くExcelファイルを一覧化したり、複数のファイルを順番に開いて集計したりする場合には、フォルダ内にあるファイル名を取得する処理が必要になります。
このような処理で便利なのが、VBAのDir関数です。
今回は、Dir関数を使用してフォルダ内のファイル一覧を取得する方法について、全ファイルの取得、拡張子の指定、Excelシートへの出力、サブフォルダを含めて取得する方法まで順番にご紹介したいと思います。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- VBAでフォルダ内のファイル名を取得したい人
- 複数のExcelファイルを一括処理したい人
- 「*.xlsx」のように拡張子を指定してファイルを取得したい人
- サブフォルダ内のファイルまで一覧化したい人
- ファイル操作を使った業務自動化を作りたい人
といったところでしょうか。
今回使用するフォルダ
今回は、VBAを記述するExcelファイルと同じ場所に「テストフォルダ」を作成して、以下のようなファイルを用意します。
- 売上データ_01.xlsx
- 売上データ_02.xlsx
- 社員一覧.xlsx
- メモ.txt
- 説明資料.pdf

まずは、このフォルダに保存されているすべてのファイル名を取得してみます。
Dir関数の基本的な使い方
Dir関数は、指定したパスや検索条件に一致するファイル名・フォルダ名を取得する関数です。
最初のDir関数で検索するパスを指定すると、条件に一致した最初のファイル名が返されます。
2件目以降を取得するときは、引数を指定せずに Dir() を繰り返し実行します。
取得できるファイルがなくなると、Dir関数は空文字列を返します。
フォルダ内のすべてのファイルを取得する
まずは、指定したフォルダ内にあるすべてのファイル名をイミディエイトウィンドウへ表示してみます。
'========================================================
' 指定したフォルダ内にあるすべてのファイル名を取得する
'========================================================
Sub ファイル一覧を取得する()
'検索するフォルダのパスを格納する変数
Dim folderPath As String
'Dir関数で取得したファイル名を格納する変数
Dim fileName As String
'VBAを記述しているブックと同じ場所にある
'「テストフォルダ」を検索対象にする
folderPath = ThisWorkbook.Path & "\テストフォルダ\"
'「*.*」を指定してフォルダ内のファイルを取得する
'最初のDir関数では検索するパスを指定する
fileName = Dir(folderPath & "*.*")
'ファイル名が取得できている間は処理を繰り返す
Do While fileName <> ""
'取得したファイル名をイミディエイトウィンドウへ表示する
Debug.Print fileName
'2件目以降は引数を指定せずDir関数を実行する
'次のファイルが存在しない場合は空文字列が返される
fileName = Dir()
Loop
End Sub
ポイントになるのは、最初の Dir(folderPath & "*.*") で検索条件を指定し、2件目以降は Dir() だけを実行しているところです。
これを繰り返すことで、フォルダ内のファイルを1件ずつ順番に取得できます。
取得したファイル一覧をExcelシートへ出力する
実際の業務では、取得したファイル名を確認するためにExcelシートへ一覧として出力したいことも多いかと思います。
次のコードでは、A列にファイル名、B列にファイルのフルパスを出力します。
'========================================================
' 指定したフォルダ内のファイルをExcelシートへ一覧出力する
' A列:ファイル名
' B列:ファイルのフルパス
'========================================================
Sub ファイル一覧をシートへ出力する()
'検索するフォルダのパス
Dim folderPath As String
'Dir関数で取得したファイル名
Dim fileName As String
'結果を出力する行番号
Dim rowNum As Long
'検索対象となるフォルダを指定する
folderPath = ThisWorkbook.Path & "\テストフォルダ\"
'見出しを1行目に作成する
Cells(1, 1).Value = "ファイル名"
Cells(1, 2).Value = "フルパス"
'データは2行目から出力する
rowNum = 2
'フォルダ内の最初のファイルを取得する
fileName = Dir(folderPath & "*.*")
'ファイルが取得できている間は繰り返す
Do While fileName <> ""
'A列へファイル名を出力する
Cells(rowNum, 1).Value = fileName
'B列へフォルダパスとファイル名を結合した
'フルパスを出力する
Cells(rowNum, 2).Value = folderPath & fileName
'次のファイルを出力するため行番号を1つ増やす
rowNum = rowNum + 1
'次のファイル名を取得する
fileName = Dir()
Loop
End Sub

ここまでできれば、この一覧をもとにファイルを開いたり、ファイル名を判定したりする処理へ発展させることができます。
「*.xlsx」のように拡張子を指定して取得する
フォルダ内にPDFやテキストファイルなどが混在している場合、Excelファイルだけを取得したいこともあるかと思います。
その場合は、Dir関数へ指定する検索条件を変更します。
'========================================================
' フォルダ内にある「.xlsx」ファイルだけを一覧出力する
'========================================================
Sub Excelファイルだけを取得する()
'検索対象となるフォルダのパス
Dim folderPath As String
'Dir関数で取得したファイル名
Dim fileName As String
'結果を出力する行番号
Dim rowNum As Long
'検索するフォルダを指定する
folderPath = ThisWorkbook.Path & "\テストフォルダ\"
'出力先の見出しを作成する
Cells(1, 1).Value = "Excelファイル名"
'2行目から結果を出力する
rowNum = 2
'「*.xlsx」を指定することで
'拡張子が.xlsxのファイルだけを検索する
fileName = Dir(folderPath & "*.xlsx")
'該当するファイルがある間は処理を繰り返す
Do While fileName <> ""
'取得したExcelファイル名を出力する
Cells(rowNum, 1).Value = fileName
'次の出力行へ移動する
rowNum = rowNum + 1
'次の.xlsxファイルを取得する
fileName = Dir()
Loop
End Sub
*.xlsx の「*」は任意の文字列を表しています。
そのため、ファイル名が何であっても、拡張子が「.xlsx」であれば取得できます。
同じ考え方で、CSVファイルだけを取得したい場合は *.csv、PDFだけを取得したい場合は *.pdf と指定できます。

サブフォルダ内のファイルも取得する場合
ここまでのコードで取得できるのは、指定したフォルダの直下にあるファイルです。
サブフォルダの中にあるファイルまで取得したい場合は、少し考え方を変える必要があります。
Microsoft Learnでも、Dir関数は再帰的に呼び出すことができないと説明されています。
そのため、今回はDir関数を再帰呼び出しせず、確認するフォルダをCollectionへ順番に追加して処理する方法をご紹介します。
'========================================================
' 指定したフォルダと、その配下にあるサブフォルダから
' すべてのファイルを取得してシートへ一覧出力する
'
' Dir関数は再帰的に呼び出せないため、
' 処理対象のフォルダをCollectionへ追加して順番に処理する
'========================================================
Sub サブフォルダを含めてファイル一覧を取得する()
'これから確認するフォルダを保持するCollection
Dim targetFolders As Collection
'現在処理しているフォルダのパス
Dim folderPath As String
'ルートとなる最初のフォルダ
Dim rootFolder As String
'取得したファイル名
Dim fileName As String
'取得したサブフォルダ名
Dim subFolderName As String
'結果を出力する行番号
Dim rowNum As Long
'Collectionを作成する
Set targetFolders = New Collection
'最初に検索するフォルダを指定する
rootFolder = ThisWorkbook.Path & "\テストフォルダ\"
'最初に確認するフォルダとしてCollectionへ追加する
targetFolders.Add rootFolder
'出力先の見出しを作成する
Cells(1, 1).Value = "フォルダ"
Cells(1, 2).Value = "ファイル名"
'2行目から結果を出力する
rowNum = 2
'確認するフォルダがなくなるまで処理を繰り返す
Do While targetFolders.Count > 0
'Collectionの先頭から処理対象のフォルダを取得する
folderPath = targetFolders(1)
'取得済みのフォルダはCollectionから削除する
targetFolders.Remove 1
'------------------------------------------------
'現在のフォルダに存在するファイルを取得する
'------------------------------------------------
'現在のフォルダ内にある最初のファイルを取得する
fileName = Dir(folderPath & "*.*")
'ファイルが存在する間は繰り返す
Do While fileName <> ""
'念のため、取得した対象がフォルダではないことを確認する
If (GetAttr(folderPath & fileName) And vbDirectory) = 0 Then
'A列へファイルが保存されているフォルダを出力する
Cells(rowNum, 1).Value = folderPath
'B列へファイル名を出力する
Cells(rowNum, 2).Value = fileName
'次の出力行へ移動する
rowNum = rowNum + 1
End If
'次のファイルを取得する
fileName = Dir()
Loop
'------------------------------------------------
'現在のフォルダに存在するサブフォルダを取得する
'------------------------------------------------
'vbDirectoryを指定して
'現在のフォルダ内にある項目を取得する
subFolderName = Dir(folderPath & "*", vbDirectory)
'取得できる項目がある間は繰り返す
Do While subFolderName <> ""
'「.」と「..」は現在のフォルダと親フォルダを表すため除外する
If subFolderName <> "." And subFolderName <> ".." Then
'取得した項目がフォルダであることを確認する
If (GetAttr(folderPath & subFolderName) And vbDirectory) = vbDirectory Then
'見つかったサブフォルダを
'次に確認するフォルダとしてCollectionへ追加する
targetFolders.Add folderPath & subFolderName & "\"
End If
End If
'次の項目を取得する
subFolderName = Dir()
Loop
Loop
End Sub
このコードでは、サブフォルダを見つけた時点ではその中をすぐに処理せず、Collectionへ追加しています。
現在のDir関数による検索が完了した後で、Collectionに追加されたフォルダを1つずつ取り出して同じ処理を行うことで、Dir関数を再帰呼び出しせずに階層下のファイルを取得しています。

Dir関数を使うと複数ファイルの一括処理へ発展できる
Dir関数でファイル名を取得できるようになると、次のような処理へ発展させることができます。
- 取得したExcelファイルをWorkbooks.Openで順番に開く
- 複数のExcelファイルからデータを一括集計する
- 指定した拡張子のファイルだけを別フォルダへ移動する
- ファイル名に特定の文字が含まれているものだけを処理する
特に、毎月同じ形式のExcelファイルを集計するといった定型業務との相性が良いため、業務自動化では使用する機会も多い処理になるかと思います。
参考情報
Dir関数の仕様については、Microsoft Learnでも確認できます。
最後に
いかがでしたでしょうか。
今回は、Excel VBAのDir関数を使用してフォルダ内のファイル一覧を取得する方法についてご紹介しました。
Dir関数を使用すれば、フォルダ内のすべてのファイルを取得するだけでなく、「*.xlsx」のように拡張子を指定して必要なファイルだけを取得することもできます。
また、サブフォルダを含めて処理する場合は、Dir関数を再帰的に呼び出さないように処理対象のフォルダを順番に管理することがポイントになります。
複数ファイルを一括で開いたり、集計したりする処理の基本にもなりますので、少しでも参考になればと思います。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
