はじめに
フォルダーに保存されたExcelファイルやテキストファイルの名前を、ワークシートにまとめて並べたいことがあります。ファイルを一つずつ確認して転記する代わりに、Excel VBAのDir関数を使えば、指定したフォルダー直下のファイル名を順番に取得できます。
この記事では、Windows版ExcelでC:\temp\を例に、取得したファイル名をC列、連番をB列の4行目から書き出す方法を説明します。コードの変更箇所と、うまく動かないときの確認点も分かるため、後からDir関数の書き方を思い出したいときにも使えます。
ファイル名一覧の取得方法とDir関数
Dir関数は、指定したパスやパターンに一致するファイル名を文字列で返すVBAの関数です。最初はDir("C:\temp\*")のように検索場所を渡し、2件目以降は引数のないDir()を繰り返します。次の名前がなくなると、空文字列""が返ります。https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dir-function
この仕組みをDo Whileループと組み合わせ、返されたファイル名を1行ずつ書き込みます。対象は指定フォルダーの直下だけです。サブフォルダーの中身を再帰的に取得する処理は、この記事には含めません。
後から見返すポイントは、最初のDir(FOLDER_PATH & "*", vbReadOnly)と、ループ末尾のDir()の2か所です。読み取り専用ファイルも含めるため、初回呼び出しにはvbReadOnlyを指定しています。隠しファイルやシステムファイルは本例の対象外です。
準備するフォルダーとExcelシート
最初に、WindowsのC:\temp\フォルダーを用意し、一覧化したいファイルを入れます。例としてreport.xlsx、memo.txt、list.csvの3ファイルがあるものとします。ファイル名はご自身の環境と異なっていて構いません。
次に、マクロを保存するExcelブックに、ファイル一覧という名前のワークシートを作成します。出力先はそのシートのB列・C列で、3行目が見出し、4行目以降がデータです。
| 変更する場所 | この例の設定 | 意味 |
|---|---|---|
FOLDER_PATH |
C:\temp\ |
ファイルを取得するフォルダー。末尾の\を付ける |
SHEET_NAME |
ファイル一覧 |
出力先のワークシート名 |
rowNum = 4 |
4 |
一覧を書き始める行 |
Cells(rowNum, 2) |
B列 | 連番の出力先 |
Cells(rowNum, 3) |
C列 | ファイル名の出力先 |
注意:マクロは出力先シートのB4:C最終行にある既存の値や数式を消去します。 必ず一覧専用シートを使うか、必要なデータを事前に退避してください。ほかのシートには書き込みません。
VBAコードと実行手順
次のコードを使用します。FOLDER_PATHを自分のフォルダーへ、SHEET_NAMEを自分が作成したシート名へ変更してから実行してください。
Option Explicit
Sub ListFileNames()
Const FOLDER_PATH As String = "C:\temp\"
Const SHEET_NAME As String = "ファイル一覧"
Dim ws As Worksheet
Dim fileName As String
Dim rowNum As Long
If Not CreateObject("Scripting.FileSystemObject").FolderExists(FOLDER_PATH) Then
MsgBox "フォルダーが見つかりません: " & FOLDER_PATH, vbExclamation
Exit Sub
End If
Set ws = ThisWorkbook.Worksheets(SHEET_NAME)
' 前回の結果を消去する(B4:C最終行)
ws.Range("B4:C" & ws.Rows.Count).ClearContents
ws.Range("B3").Value = "No."
ws.Range("C3").Value = "ファイル名"
rowNum = 4
fileName = Dir(FOLDER_PATH & "*", vbReadOnly)
Do While fileName <> ""
ws.Cells(rowNum, 2).Value = rowNum - 3
ws.Cells(rowNum, 3).Value = fileName
rowNum = rowNum + 1
fileName = Dir()
Loop
If rowNum = 4 Then
MsgBox "対象のファイルがありません。", vbInformation
Else
MsgBox (rowNum - 4) & "件のファイル名を取得しました。", vbInformation
End If
End Sub
実行する際は、ExcelのAlt+F11でVBAエディターを開き、「挿入」→「標準モジュール」にコードを貼り付けます。ブックはマクロ有効ブック(.xlsm)として保存し、Excelへ戻ってAlt+F8からListFileNamesを選びます。マクロの有効化は、ご自身で作成または内容を確認したファイルに限って行ってください。
このコードのFolderExistsはフォルダーが存在するかを先に確認するためだけに使い、ファイル名の列挙はDir関数で行います。ThisWorkbook.Worksheetsを指定するため、たまたま表示されている別のシートには出力しません。
コードの処理の流れ
まず、FolderExistsで対象フォルダーを確認します。存在しない場合はメッセージを表示して終了し、出力済みのセルには触れません。存在する場合はファイル一覧シートの古い出力結果を消去し、見出しを設定します。
次に、Dir(FOLDER_PATH & "*", vbReadOnly)で最初のファイル名を取得し、B列へ連番、C列へファイル名を書き込みます。ループの最後のDir()で次の名前を取得し、空文字列になったところで繰り返しを終了します。ファイル名の取得順が重要な場合は別途並べ替えが必要ですが、この記事では取得した順に一覧化します。
なお、Dirは再帰的に呼び出すことができません。サブフォルダー内のファイルをまとめて調べる用途とは分けて考えます。
出力結果と確認方法
上記3ファイルを例にした出力結果は、次のようになります。ファイルの表示順は環境や内容によって異なる場合があります。
| 行 | B列(No.) | C列(ファイル名) |
|---|---|---|
| 3 | No. | ファイル名 |
| 4 | 1 | list.csv |
| 5 | 2 | memo.txt |
| 6 | 3 | report.xlsx |
最初のデータが4行目から始まり、ファイル名がC列に表示されていれば成功です。フォルダー内に対象ファイルがない場合は、見出しだけを残して「対象のファイルがありません」と表示します。元のファイルを移動・削除・変更する処理ではなく、名前を読むだけのマクロです。
動かないときの確認事項
| 症状 | まず確認すること |
|---|---|
| 「フォルダーが見つかりません」と表示される | FOLDER_PATHが正しいか、フォルダーが実在するか、末尾に\があるか |
| 「インデックスが有効範囲にありません」と表示される | ファイル一覧というシートが、このマクロを保存したブック内にあるか |
| 「対象のファイルがありません」と表示される | フォルダーが空でないか。隠しファイル・システムファイルだけではないか |
| 結果が見当たらない | マクロを保存したブックのファイル一覧シート、B4・C4以降を見ているか |
| 想定外のデータが消えた | 本例ではB4:C最終行を消去する。専用シートを使っているか確認する |
Dirのパターンを"*.xlsx"にすればExcelファイルだけを取得できます。ただし、その場合はほかの種類のファイルは表示されません。まずは"*"で基本動作を確認してください。
まとめ
Excel VBAでフォルダー直下のファイル名一覧を作るには、Dir(FOLDER_PATH & "*")で最初の名前を取得し、Dir()を繰り返してワークシートへ書き込みます。今回のコードでは、ファイル名はC列の4行目以降、連番はB列へ出力されます。
後から使う際は、フォルダーパス・出力先シート名・開始行・出力列を確認すれば再利用できます。ファイルを探す範囲をサブフォルダーへ広げたい場合は、別の中心知識として扱います。
関連記事
- VBAでサブフォルダーのファイル名も取得する方法 — フォルダー直下だけでなく、階層内のファイルを調べたい場合。
- Excel・業務自動化ガイド — VBAのセル・シート・ファイル操作を関連知識から学びたい場合。