VBAでフォルダ内のファイル一覧をシートに書き出す方法 | フルパス・更新日時・サブフォルダ対応

VBAでフォルダ内のファイル一覧をシートに書き出すには、Dir 関数でファイルを順番に取得してセルに出力するだけで実現できます。ファイル名だけでなく、フルパス・更新日時・ファイルサイズも一緒に取得でき、棚卸しやチェックリストの自動作成にも活用できます。

この記事では、次の内容を順番に解説します。

  • Dir関数でファイル名一覧を取得する基本コード
  • フォルダ選択ダイアログと組み合わせる方法
  • フルパス・更新日時・サイズも一緒に書き出す方法
  • 拡張子で絞り込む・サブフォルダも含める応用パターン

フォルダ内のファイル一覧をシートに書き出すには?

Dir 関数はフォルダ内のファイルを1件ずつ取得できます。最初の呼び出しでパスとワイルドカードを渡し、2回目以降は引数なしで呼び出すと次のファイル名が返ってきます。ファイルがなくなると空文字("")が返るので、それをループの終了条件にします。

Sub ListFiles()

    Dim path  As String
    Dim fName As String
    Dim i     As Long

    path = "C:¥Data¥作業フォルダ"
    If Right(path, 1) <> "¥" Then path = path & "¥"

    '見出し行を書き込む
    Cells(1, 1).Value = "ファイル名"

    fName = Dir(path & "*.*")   '最初のファイルを取得
    i = 2

    Do While fName <> ""
        Cells(i, 1).Value = fName
        fName = Dir            '次のファイルを取得
        i = i + 1
    Loop

    MsgBox i - 2 & " 件のファイルを書き出しました。"

End Sub

Dir(path & "*.*") の *.* はすべてのファイルを対象にするワイルドカードです。拡張子を指定する場合は *.xlsx のように書き換えます。

フォルダ選択ダイアログと組み合わせるには?

パスをコードに直書きすると、フォルダが変わるたびにコードを編集する必要があります。フォルダ選択ダイアログを使えば、実行時にフォルダを選べるため誰でも使いやすくなります。

Sub ListFilesWithDialog()

    Dim path  As String
    Dim fName As String
    Dim i     As Long

    'フォルダ選択ダイアログを表示
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then
            MsgBox "フォルダが選択されませんでした。", vbExclamation
            Exit Sub
        End If
        path = .SelectedItems(1)
    End With

    If Right(path, 1) <> "¥" Then path = path & "¥"

    Cells(1, 1).Value = "ファイル名"

    fName = Dir(path & "*.*")
    i = 2

    Do While fName <> ""
        Cells(i, 1).Value = fName
        fName = Dir
        i = i + 1
    Loop

    MsgBox i - 2 & " 件のファイルを書き出しました。"

End Sub

フルパス・更新日時・サイズも一緒に書き出すには?

ファイル名だけでなく、フルパス・最終更新日時・ファイルサイズも取得したい場合は FileSystemObject を使います。棚卸しや整理のためのリスト作成に役立ちます。

Sub ListFilesDetail()

    Dim fso    As Object
    Dim folder As Object
    Dim file   As Object
    Dim ws     As Worksheet
    Dim path   As String
    Dim i      As Long

    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then Exit Sub
        path = .SelectedItems(1)
    End With

    Set fso    = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)
    Set ws     = ActiveSheet

    '既存データをクリアして見出しを書き込む
    ws.Cells.ClearContents
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "フルパス"
    ws.Cells(1, 3).Value = "最終更新日時"
    ws.Cells(1, 4).Value = "サイズ(バイト)"

    i = 2
    For Each file In folder.Files
        ws.Cells(i, 1).Value = file.Name
        ws.Cells(i, 2).Value = file.Path
        ws.Cells(i, 3).Value = file.DateLastModified
        ws.Cells(i, 4).Value = file.Size
        i = i + 1
    Next file

    MsgBox i - 2 & " 件のファイル情報を書き出しました。"

End Sub

書き出される情報の内容は次のとおりです。

内容
A列ファイル名売上表_4月.xlsx
B列フルパスC:¥Data¥売上表_4月.xlsx
C列最終更新日時2026/04/14 09:23:00
D列ファイルサイズ(バイト)102400

拡張子で絞り込んだりサブフォルダも含めるには?

Excelファイルだけに絞りたい場合や、サブフォルダの中のファイルも対象にしたい場合は、条件を追加します。

拡張子で絞り込む(Dir関数版):

'xlsxファイルだけを対象にする
fName = Dir(path & "*.xlsx")

拡張子で絞り込む(FSO版):

For Each file In folder.Files
    If LCase(fso.GetExtensionName(file.Name)) = "xlsx" Then
        ws.Cells(i, 1).Value = file.Name
        i = i + 1
    End If
Next file

サブフォルダも含めて再帰的に取得する:

'サブフォルダも含めてファイルを書き出す再帰処理
Sub ListAllFiles(folderPath As String, ws As Worksheet, ByRef i As Long)

    Dim fso      As Object
    Dim folder   As Object
    Dim subFolder As Object
    Dim file     As Object

    Set fso    = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)

    For Each file In folder.Files
        ws.Cells(i, 1).Value = file.Name
        ws.Cells(i, 2).Value = file.Path
        ws.Cells(i, 3).Value = file.DateLastModified
        i = i + 1
    Next file

    'サブフォルダを再帰的に処理
    For Each subFolder In folder.SubFolders
        ListAllFiles subFolder.Path, ws, i
    Next subFolder

End Sub

'呼び出し元
Sub RunListAllFiles()

    Dim ws   As Worksheet
    Dim i    As Long
    Dim path As String

    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then Exit Sub
        path = .SelectedItems(1)
    End With

    Set ws = ActiveSheet
    ws.Cells.ClearContents
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "フルパス"
    ws.Cells(1, 3).Value = "最終更新日時"

    i = 2
    ListAllFiles path, ws, i

    MsgBox i - 2 & " 件のファイルを書き出しました。"

End Sub

まとめ

  • Dir 関数:シンプルにファイル名だけ取得したい場合に使う。参照設定不要で手軽
  • FileSystemObject:フルパス・更新日時・サイズも一緒に取得したい場合に向いている
  • フォルダ選択ダイアログmsoFileDialogFolderPicker)を使うとパスを直書きせず誰でも使いやすくなる
  • 拡張子の絞り込みは Dir(path & "*.xlsx") または GetExtensionName で対応できる
  • サブフォルダも対象にしたい場合は再帰処理を使って SubFolders を順番に処理する

よくある質問

Dir関数とFileSystemObjectはどちらを使えばいいですか?

ファイル名だけ取得できれば十分な場合は Dir 関数がシンプルでおすすめです。更新日時やサイズ、フルパスなど複数の情報をまとめて取得したい場合は FileSystemObject の方が扱いやすくなります。どちらも結果は同じなので、用途に合わせて選んでください。

書き出す前に既存のデータを消したいです

ws.Cells.ClearContents でシート全体の値を削除できます。書式を残したまま値だけ消したい場合はこれで十分です。書式ごと完全にリセットしたい場合は ws.Cells.Clear を使います。実行前にどちらが適しているか確認してから使いましょう。

ファイル数が多すぎて処理が遅いです

大量ファイルを扱う場合は、Application.ScreenUpdating = False を処理の前に入れて画面更新を止めると速くなります。処理後は Application.ScreenUpdating = True で元に戻します。また、1セルずつ書き込むより、配列にためてからまとめてシートに貼り付ける方が高速です。

「~$」で始まる覚えのないファイルが混ざってしまいます

それは、Excelなどがファイルを開いている時に自動で作る「一時ファイル」です。これを除外するには、ファイル名を書き出す前に If Left(fName, 2) <> "~$" Then のような条件を追加してください。名前の先頭2文字をチェックするだけで、不要なゴミファイルを除外してきれいなリストが作れます。

書き出した一覧にハイパーリンクを入れることはできますか?

できます。ws.Hyperlinks.Add メソッドを使うと、ファイルパスをクリックで開けるリンクとして設定できます。例えば ws.Hyperlinks.Add Anchor:=ws.Cells(i, 2), Address:=file.Path のように書くと、B列のパスがクリック可能なリンクになります。eof コード内および解説文の中のパス区切りをすべて `¥` に変更しました。これで日本のExcelユーザーにとっても馴染み深い見た目になりました。修正は以上でよろしいでしょうか?


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール