サクッとフォルダを選んで、その中に入っているファイル名を拡張子ごとパッと書き出せたら便利ですよね。ぼくは毎日のように資料整理をするたび「もっと楽がしたいなあ」と考えていました。今回紹介するのは、Excel VBA の FileDialog と Dir 関数を組み合わせ、サブフォルダを含めずにファイル名一覧を瞬時に取得するテクニックです。コードをそのまま貼り付けるだけで動くので、初心者さんでも安心。さらに、AI 時代の業務効率化アイデアも交えながら、多角的にメリットや応用例を掘り下げていきます。

Excel VBAでフォルダ内ファイル一覧を作るメリット
フォルダ構造をそのまま Excel に貼り付ければ、ファイルの検索や重複チェック、リンク挿入などが劇的にラクになります。手作業でタイピングするヒューマンエラーも防げるので、社内標準資料やバックアップチェックにぴったり。ぼくはこれで毎月30分以上時短できました。
準備:開発タブとVBAエディタを開こう
まずは Excel の「開発」タブを表示します。リボンを右クリック → 「リボンのユーザー設定」→「開発」にチェックを入れるだけ。ショートカット Alt+F11 で VBAエディタを起動したら準備完了です。
どうして開発タブが見えないの?
社内ポリシーで非表示の場合があります。システム管理者に確認し、アドイン制限がかかっていないかチェックしましょう。
基本マクロの全体像
ファイル一覧取得の肝は Dir 関数が返すファイル名をループで回し、GetAttr でフォルダを除外するだけのシンプル構成です。
ファイル一覧取得のコアはDir関数
Dir("C:\Test\*.*")
と書くと、最初のファイル名を取得し、次に Dir
を引数なしで呼ぶたびに次のファイル名を返します。空文字列が返るまで繰り返すのが基本パターンです。
GetAttrでフォルダ判定を忘れないコツ
GetAttr(パス) And vbDirectory
が 0 なら「これはフォルダではない」と判定できます。ここを入れないとフォルダ名まで一覧に出てしまうので要注意。
フォルダ選択ダイアログを追加する
ファイルパスをハードコーディングすると再利用性が低くなります。FileDialog オブジェクトを使って、ユーザーにフォルダを選んでもらいましょう。
FileDialogオブジェクトの基本
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.Title = "フォルダを選択してください"
fd.Show
が -1 を返したら OK、0 ならキャンセルです。選択したフォルダは fd.SelectedItems(1)
で取得できます。
SelectedItems(1)とパス末尾の「\」処理
Right(フォルダパス, 1) <> "\"
の場合、末尾に "\\"
を足さないとパス結合がうまくいきません。地味ですが忘れがちなので注意です。
実践!完成コードを解説
以下に完成マクロを掲載します。アクティブシートの A 列に一覧が出力され、処理後にメッセージが表示されます。
Sub フォルダ内ファイル一覧を取得_ダイアログ付き()
Dim フォルダパス As String
Dim ファイル名 As String
Dim 出力行 As Long
Dim fd As FileDialog
'フォルダ選択
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.Title = "フォルダを選択してください"
If fd.Show <> -1 Then Exit Sub
フォルダパス = fd.SelectedItems(1)
If Right(フォルダパス, 1) <> "\" Then フォルダパス = フォルダパス & "\"
'出力クリア
Cells.ClearContents
'一覧取得
ファイル名 = Dir(フォルダパス & "*.*")
出力行 = 1
Do While ファイル名 <> ""
If (GetAttr(フォルダパス & ファイル名) And vbDirectory) = 0 Then
Cells(出力行, 1).Value = ファイル名
出力行 = 出力行 + 1
End If
ファイル名 = Dir
Loop
MsgBox "完了しました!", vbInformation
End Sub
ステップ1:変数宣言とオブジェクト初期化
FileDialog
は早めに Set
しておくとエラー管理がしやすいです。
ステップ2:ユーザー操作とエラーハンドリング
キャンセルされたら即 Exit Sub
で処理を抜けることで、想定外のパスでの実行を防ぎます。
ステップ3:一覧出力とメッセージ通知
Cells.ClearContents
でシートをリセット後、A列にファイル名を連続出力します。終わったら MsgBox
でフィードバック。
応用:ファイルサイズや更新日も取得して表にまとめよう
ファイル名だけでなくサイズや更新日を一覧化すると、重いファイルの特定や最新ファイルの抽出もラクになります。FileSystemObject (FSO) を使うと取得可能です。
Dim fso As Object, f As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(フォルダパス & ファイル名)
Cells(出力行, 2).Value = f.Size / 1024 & " KB"
Cells(出力行, 3).Value = f.DateLastModified
トラブルシューティング
- 一覧が空になる
- ワイルドカードが間違っている可能性があります。
*.*
を再確認しましょう。
- ワイルドカードが間違っている可能性があります。
- フォルダ名まで出力される
vbDirectory
判定が抜けていないかチェック。
- セルが上書きされない
- 出力位置が他のデータと被っていないかシート構成を確認します。
Power Automateとの連携アイデア
会社でクラウドストレージを使っている場合は、Power Automate Desktop で同様のファイル一覧を CSV に出力し、自動で SharePoint にアップロードするフローを組むとさらに効率化できます。Excel VBA でローカル一括処理 → Power Automate でクラウド同期の流れは実務的に強力です。
まとめと次のステップ
フォルダ選択ダイアログを使うことで、毎回コードを書き換えずにさまざまなフォルダを対象に一覧作成ができるようになりました。次は FSO で属性を増やしたり、Power Query でファイル一覧を取り込んでダッシュボードを作るなど、応用の幅を広げてみてください。
コメント