この記事でできること
フォルダの中にあるファイル名を、1つずつ手作業でExcelに入力していませんか?
ファイルが10個ならまだしも、50個、100個となると気が遠くなりますよね。しかも手入力だとファイル名の打ち間違いも起きやすく、地味にストレスがたまる作業です。
この記事のVBAを使えば、その作業がワンクリック・数秒で終わります。実際に動くコードをコピペするだけなので、VBAの知識はゼロでOKです。
最小5行のコードから始められるので、まずは試してみてください。
- 対象:ファイル名を手入力している人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
自分も以前は、フォルダの中身を手作業で一つずつExcelに打ち込んでいた。ファイルが50個を超えると、もう金曜の午後はそれだけで終わっていた。正直めんどくさかったし、打ち間違いも地味にストレスだった。
VBAで自動化してからは、ボタン1つで数秒。あの作業時間がゼロになった。もっと早く知りたかった。
同じ手間に悩んでいる人が、この記事でサクッと自動化できるようになればうれしい。
なお、フォルダ内のファイル一覧を取得した後、サブフォルダも含めて再帰的に検索したい場合は FileSystemObjectでサブフォルダを再帰検索してファイル一覧を取得する方法 を参照。
どんな場面で使う?
- 月末のファイル棚卸しで、フォルダ内の全ファイル名をExcelにまとめて報告する
- 共有フォルダの中身を一覧化して、不要ファイルの整理リストを作る
- 納品物の一覧表を作成するとき、フォルダ内のファイル名を自動で転記する
- 更新日時やサイズを取得して、古いファイルや巨大ファイルを特定する
完成イメージ(Before / After)
Before(実行前)

空のExcelシート。フォルダにはファイルが10個入っている。
After(実行後)

| A | |
|---|---|
| 1 | 売上報告_202601.xlsx |
| 2 | 売上報告_202602.xlsx |
| 3 | 在庫リスト.xlsx |
| 4 | 議事録_0115.docx |
| 5 | 写真_001.jpg |
| … | … |
A列にファイル名が1行ずつ並ぶ。
今回の検証条件と結果
この記事のコードは、フォルダ直下のファイルを一覧化する用途に絞って確認しています。検証用フォルダには、Excelファイル・テキストファイル・画像ファイルを合計3件置き、別にサブフォルダを1つ作りました。
| 確認したこと | 結果 | 記事内コードでの扱い |
|---|---|---|
| フォルダ直下に3ファイルある状態 | 直下の3件を一覧対象として扱える | まずはDir関数版で十分 |
| サブフォルダ内にもファイルがある状態 | 直下だけを見るコードではサブフォルダ内を含めない | サブフォルダも必要なら再帰処理に切り替える |
| 拡張子が混在している状態 | 指定しなければxlsx、txt、jpgなどをまとめて取得対象にする | Excelだけに絞る場合は *.xlsx を使う |
| 出力先シートに既存データがある状態 | Cells.Clear を使うと既存データも消える |
実務では出力専用シートを分けるのが安全 |
つまり、このコードは「指定フォルダ直下のファイルを棚卸しする」用途に向いています。サブフォルダまで含める、拡張子を絞る、既存一覧に追記する、といった要件が出た時点で実務版へ広げる判断になります。
実行前の準備
バックアップを取る
既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ってください。コード内の Cells.Clear でシートのデータがすべてクリアされます。
このコードを試す前に決めること
先に決めるのは、VBEの開き方よりも「どのフォルダを、どの粒度で一覧にするか」です。ここが曖昧なまま実行すると、ファイルが出ない、サブフォルダが拾えない、既存データを消した、という失敗につながります。
| 決めること | おすすめ | 理由 |
|---|---|---|
| 対象フォルダ | まずはテスト用フォルダを作る | 本番フォルダでいきなり試すと、出力先シートのクリアで既存データを消す可能性があるため |
| 取得範囲 | 最初はフォルダ直下だけ | Dir関数版の動きがシンプルで、結果を確認しやすいため |
| 出力先 | 空のSheet1または出力専用シート | Cells.Clear で全セルをクリアするため |
| 取得項目 | 最初はファイル名だけ、実務ではパス・更新日時・サイズも追加 | ファイル棚卸しや不要ファイル整理では、名前だけだと判断材料が足りないため |
準備ができたら、標準モジュールにコードを貼り付け、folderPath を自分のフォルダパスに変更します。エクスプローラーのアドレスバーからコピーしたパスは末尾に \ が付かないことが多いので、ここだけは最初に確認してください。
コード(最小版)— ファイル名だけ取得
まずはこれだけで動く。フォルダ内のファイル名をA列に書き出す。
Sub GetFileList()
Dim folderPath As String
Dim fileName As String
Dim row As Long
' ★ ここを自分のフォルダパスに書き換える(末尾の \ を忘れずに)
folderPath = "C:\Users\(ユーザー名)\Desktop\対象フォルダ\"
' 出力先シートをクリア(※既存データがあると消えるので注意)
Worksheets("Sheet1").Cells.Clear
' 最初のファイル名を取得
fileName = Dir(folderPath)
row = 1
' ファイルがなくなるまで繰り返す
Do While fileName <> ""
Worksheets("Sheet1").Cells(row, 1).Value = fileName
row = row + 1
fileName = Dir() ' 次のファイルを取得
Loop
MsgBox row - 1 & " 件のファイルを出力しました。", vbInformation
End Sub
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
パスの入力が面倒な場合(ダイアログで選択する方法):
folderPath = "..." の行を以下に置き換えると、実行時にフォルダ選択ダイアログが表示される。
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
folderPath = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With
コード(実務版)— パス・更新日時・サイズも取得
業務で使うなら、ファイル名だけでなくフルパス・更新日時・サイズも欲しい場合が多い。以下はFileSystemObjectを使った実務版。
Sub GetFileListDetail()
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim row As Long
Dim ws As Worksheet
' ★ ここを自分のフォルダパスに書き換える
Dim folderPath As String
folderPath = "C:\Users\(ユーザー名)\Desktop\対象フォルダ\"
' FileSystemObject を作成(参照設定不要)
Set fso = CreateObject("Scripting.FileSystemObject")
' フォルダが存在するかチェック
If Not fso.FolderExists(folderPath) Then
MsgBox "フォルダが見つかりません:" & folderPath, vbExclamation
Exit Sub
End If
Set folder = fso.GetFolder(folderPath)
Set ws = Worksheets("Sheet1")
' 出力先シートをクリア(※既存データがあると消えるので注意)
ws.Cells.Clear
' ヘッダー行
ws.Cells(1, 1).Value = "ファイル名"
ws.Cells(1, 2).Value = "フルパス"
ws.Cells(1, 3).Value = "更新日時"
ws.Cells(1, 4).Value = "サイズ(KB)"
row = 2
' フォルダ内の各ファイルを処理
For Each file In folder.Files
ws.Cells(row, 1).Value = file.Name
ws.Cells(row, 2).Value = file.Path
ws.Cells(row, 3).Value = file.DateLastModified
ws.Cells(row, 4).Value = Round(file.Size / 1024, 1)
row = row + 1
Next file
MsgBox row - 2 & " 件のファイルを出力しました。", vbInformation
Set file = Nothing
Set folder = Nothing
Set fso = Nothing
End Sub
CreateObject を使っているため、参照設定は不要。そのままコピペで動く。
この実務版を使い始めてからは、毎月のファイル棚卸しが劇的にラクになった。更新日時でソートすれば「最近触ったファイル」がすぐわかるし、サイズも見えるから不要なファイルの整理にも使える。
シート名を変更している場合は Worksheets("Sheet1") を自分のシート名に書き換えること。
取得したファイル一覧をもとに、ExcelファイルをPDFに一括変換する といった次のステップに進むこともできる。
Dir関数版とFileSystemObject版の判断基準
このテーマで迷いやすいのが、Dir関数で書くべきか、FileSystemObjectで書くべきかです。どちらが上位互換というより、用途が少し違います。
| やりたいこと | 向いている書き方 | 判断理由 |
|---|---|---|
| フォルダ直下のファイル名だけを一覧化したい | Dir関数版 | 短く書けて、VBA初心者でも処理の流れを追いやすい |
| フルパス、更新日時、サイズも出したい | FileSystemObject版 | Fileオブジェクトから属性情報を自然に取り出せる |
| サブフォルダ内も含めたい | FileSystemObjectの再帰処理 | Dir関数版だけだと階層をたどる処理が読みにくくなりやすい |
| とにかく最初に動くものを見たい | Dir関数版 | コード量が少なく、フォルダパスの確認に集中できる |
自分なら、読者に渡すテンプレートや月次の棚卸しにはFileSystemObject版を使います。更新日時とサイズが一緒に出ると、古いファイルや容量の大きいファイルをその場で判断できるからです。一方で、VBAを初めて触る人に説明するなら、まずDir関数版で「ファイル名が1行ずつ出る」感覚をつかむ方が早いです。
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 何も出力されない | フォルダパスの末尾に \ がない |
パスの末尾に \ を必ず付ける。例:C:\Data\ |
| 2 | 「実行時エラー ’76’: パスが見つかりません」 | フォルダパスが間違っている、またはフォルダが存在しない | エクスプローラーのアドレスバーからパスをコピーして貼り付ける |
| 3 | マクロを保存したのに次回開くと消えている | .xlsx で保存してしまった | 「名前を付けて保存」→ ファイルの種類を .xlsm に変更する |
| 4 | 既存のデータが消えた | Cells.Clear が先頭にあるため、シートの全データがクリアされた |
出力用に新しいシートを追加してから実行する。または Cells.Clear の行を削除する |
| 5 | 日本語フォルダ名でエラーになる | 一般的にはDir関数は日本語パスに対応しているが、特殊文字(# % など)がパスに含まれると問題になる場合がある |
フォルダ名に特殊文字を使わない。または短いパスに移動してから実行する |
| 6 | 何も出力されないが、エラーも出ない | 自分も最初これに気づかず30分悩んだのだが、パスの末尾の \ を忘れると、Dir関数は空文字を返すだけでエラーにならない。しかもフォルダが正しくてもファイルが0件として扱われる |
パスの末尾に \ があるかをまず確認する。コピペしたパスが C:\Data で終わっていたら C:\Data\ に直す |
VBAでファイル一覧が取得できないときの対処法
「コードを実行したのにファイルが1件も出力されない」という場合、原因はフォルダパスの末尾に \ が付いていないことがほとんどだ。Dir関数はパス末尾に \ がないと空文字を返すだけでエラーにならないため、気づきにくい。エクスプローラーのアドレスバーからパスをコピーし、末尾に \ を追加すれば解決する。
VBAのDir関数でサブフォルダのファイルが取得できないときの対処法
「フォルダを指定したのにサブフォルダの中身が出てこない」という場合、Dir関数は1階層のファイルしか取得しない仕様が原因だ。サブフォルダも含めて取得するにはFileSystemObjectの再帰処理が必要になる。詳しくは FileSystemObjectでサブフォルダを再帰検索してファイル一覧を取得する方法 を参照。
実務で使う前に決めておきたい運用ルール
ファイル一覧を出すマクロは、作った本人のPCだけで動かすなら比較的簡単です。ただ、同じ部署の人に渡して使ってもらう場合は、保存場所、共有フォルダー、OneDriveの同期状態、Windowsの表示言語によってパスの見え方が変わることがあります。以前、同じ部署へマクロを配布したときも、相手のPCだけパス指定の見え方が違い、そこで時間を使いました。
そのため、ファイル一覧マクロでは、最初に「どのフォルダーを対象にするか」を人によって変えない運用にしておくと安定します。たとえば、マクロ入りブックと同じ場所に対象フォルダーを置く、またはファイルダイアログで毎回フォルダーを選ぶ、という形にしておくと、ユーザー名やデスクトップ名の違いに引っ張られにくくなります。
配布前チェック
- 対象フォルダー名を部署内でそろえる
- 個人のデスクトップ直下を前提にしない
- OneDriveや共有フォルダーでは、同期が終わってから実行する
- 一時ファイル(~$で始まるExcelファイル)を一覧に含めるか決める
- 出力先シートを毎回クリアするか、履歴として追記するか決める
特にExcelファイルを対象にする場合、開いているブックの一時ファイルが混ざることがあります。一覧表を確認用に使うだけなら大きな問題にならないこともありますが、後続処理でコピーや削除まで行うなら、対象外にする条件を先に決めておくほうが安全です。
If Left(fileName, 2) <> "~$" Then
'一時ファイルではない場合だけ一覧に出す
End If
実務で詰まりやすい失敗例
このマクロは短いですが、失敗するときはだいたい同じ場所で止まります。特に多いのは、フォルダパス、出力先シート、取得範囲の3つです。
失敗例1: パスの末尾にバックスラッシュがない
C:\Data のように末尾の \ がないまま Dir(folderPath) を実行すると、期待したファイル一覧にならないことがあります。エクスプローラーからコピーした直後はこの形になりやすいので、記事内の最小版では末尾の \ を明示しています。
失敗例2: Sheet1以外のシートで実行している
コード内で Worksheets("Sheet1") を指定しているため、シート名を「一覧」などに変えている場合はその名前に合わせる必要があります。出力されないのではなく、別のシートに出ているだけ、ということもあります。
失敗例3: サブフォルダの中まで拾えると思っている
最小版はフォルダ直下だけを見るコードです。サブフォルダの中身まで一覧化したい場合は、FileSystemObjectでフォルダを再帰的にたどる構成に変えます。ここを分けて考えると、コードの読みやすさも保てます。
FAQ
Q1: サブフォルダ内のファイルも含めたい
Dir関数は1階層のみ対象。サブフォルダも含めるには FileSystemObject の再帰処理が必要になる。詳しくは FileSystemObjectでサブフォルダを再帰検索してファイル一覧を取得する方法 を参照。
Q2: .xlsx だけなど、特定の拡張子に絞りたい
最小版なら Dir(folderPath & "*.xlsx") と書き換える。実務版なら If fso.GetExtensionName(file.Name) = "xlsx" Then で条件分岐する。ファイル一覧を取得した後に ファイル名を一括変更(リネーム)する方法 と組み合わせると、特定の拡張子のファイルだけまとめてリネームすることもできる。
Q3: ネットワークドライブ(\\server\share)でも使える?
一般的にはUNCパス(\\サーバー名\共有名\)でも動作する。ただしアクセス権限がない場合はエラーになる。社内サーバーの場合はIT部門に確認すること。
Q4: 実行するたびに前回の結果が残ってしまう
コードの先頭に Cells.Clear が入っているため、通常は毎回クリアされる。もし残っている場合は、出力先シート名がコード内の指定と一致しているか確認する。
Q5: 100件以上のファイルがあっても大丈夫?
数千件程度なら問題ない。数万件を超える場合は Application.ScreenUpdating = False をコードの先頭に追加すると高速化できる。
Q6: サイズが「0」と表示されるファイルがある
0KBのファイルは空ファイル(中身がないファイル)。ファイル自体は存在するが、データが書き込まれていない状態。
まとめ
この記事で、指定フォルダ内のファイル名をExcelに自動一覧出力できるようになった。
- 最小版:Dir関数でファイル名だけ取得。まずはこれで十分
- 実務版:FileSystemObjectでパス・更新日時・サイズも取得
ファイル一覧の取得は、VBAによるファイル操作の出発点になる。ここで取得した一覧をもとに、ファイル名を一括変更(リネーム)する や 複数Excelファイルを1つに統合する といった次の自動化に進められる。
次にやりたくなること
ファイル一覧の取得ができるようになったら、次はこんな自動化にも挑戦してみましょう。
- ファイル名を一括変更(リネーム)する方法
→ 取得した一覧をベースにリネーム表を作れば、ファイル名の整理も一瞬で終わる。
- 複数Excelファイルを1つに統合する方法
→ フォルダ内のExcelデータを1シートにまとめたいときに。一覧取得と組み合わせると、どのファイルを統合するか事前に確認できる。
- ExcelファイルをPDFに一括変換する方法
→ 取得した一覧のExcelファイルをまとめてPDF化したいときに。


コメント