
Contents
この記事でできること
フォルダの中にあるファイル名を、1つずつ手作業でExcelに入力していませんか? VBAを使えば、コードをコピペして実行するだけで、指定フォルダ内の全ファイル名がExcelシートに一覧出力されます。この記事では、VBAが初めての方でも迷わずできるよう、最小限のコード(5行)から手順を解説します。
- 対象:ファイル名を手入力している人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
完成イメージ(Before / After)
Before(実行前)
空のExcelシート。フォルダにはファイルが10個入っている。
After(実行後)
| A | |
|---|---|
| 1 | 売上報告_202601.xlsx |
| 2 | 売上報告_202602.xlsx |
| 3 | 在庫リスト.xlsx |
| 4 | 議事録_0115.docx |
| 5 | 写真_001.jpg |
| … | … |
A列にファイル名が1行ずつ並ぶ。
実行前の準備
バックアップを取る
既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ってください。コード内の Cells.Clear でシートのデータがすべてクリアされます。
Excelをマクロ有効ブック(.xlsm)で保存する
- Excelを開く(新規でも既存でもOK)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。
一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
標準モジュールを挿入する
- VBEのメニュー「挿入」→「標準モジュール」をクリック
- 右側に白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
- コード内の
folderPathを自分の対象フォルダのパスに書き換える - Alt + F8 を押す(または VBE上で F5)
- 「GetFileList」を選択して「実行」
- Sheet1 を開き、A列にファイル名が並んでいることを確認する
フォルダパスの確認方法: エクスプローラーでフォルダを開き、アドレスバーをクリックするとパスが表示される。それをコピーして使う。
パスの末尾に \ を忘れないこと。 例:C:\Users\tanaka\Documents\報告書\
コード(最小版)— ファイル名だけ取得
まずはこれだけで動く。フォルダ内のファイル名を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") を自分のシート名に書き換えること。
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 何も出力されない | フォルダパスの末尾に \ がない |
パスの末尾に \ を必ず付ける。例:C:\Data\ |
| 2 | 「実行時エラー ’76’: パスが見つかりません」 | フォルダパスが間違っている、またはフォルダが存在しない | エクスプローラーのアドレスバーからパスをコピーして貼り付ける |
| 3 | マクロを保存したのに次回開くと消えている | .xlsx で保存してしまった | 「名前を付けて保存」→ ファイルの種類を .xlsm に変更する |
| 4 | 既存のデータが消えた | Cells.Clear が先頭にあるため、シートの全データがクリアされた |
出力用に新しいシートを追加してから実行する。または Cells.Clear の行を削除する |
| 5 | 日本語フォルダ名でエラーになる | 一般的にはDir関数は日本語パスに対応しているが、特殊文字(# % など)がパスに含まれると問題になる場合がある |
フォルダ名に特殊文字を使わない。または短いパスに移動してから実行する |
FAQ
Q1: サブフォルダ内のファイルも含めたい
Dir関数は1階層のみ対象。サブフォルダも含めるには 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でパス・更新日時・サイズも取得
もっとカスタマイズしたい場合
「特定の拡張子だけ抽出したい」「サブフォルダも含めたい」「一覧をメールで自動送信したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- 対象フォルダのパス構成(階層の深さ)
- 出力したい項目(ファイル名以外に何が必要か)
- ファイルの数(目安)