【Excel VBA】サブフォルダを含むファイル一覧を書き出す

はじめに

今回は、サブフォルダを含めたファイル一覧をExcelに書き出す方法について解説します。
ファイルの洗い出しなどで、フォルダパスを指定し再帰的にサブフォルダを含むファイル一覧を書き出したい時があるかと思います。
サンプルコードを用いてご紹介しますので、ぜひ最後までお付き合いください。

この記事を読むメリット
  • サブフォルダを含むファイル一覧の作成方法が分かります。
  • コピペで使える実践的なサンプルコードを掲載しています。

前提

実行後イメージ

本記事でご紹介するサンプルコードでは、以下赤枠箇所のファイル一覧を書き出すものです。

以下の画像では、「C:\Users\xxxx\AppData\Local\Microsoft\Office\16.0」というフォルダパスを入力値とし、サブフォルダを含めて一覧を書き出しています。
※画像はクリックで拡大できます。

ファイル一覧 - イメージ
ファイル一覧 – イメージ

出力可能な項目

先述した実行イメージでは以下を書き出していました。

  • フォルダパス
  • フォルダ名
  • ファイル名
  • 拡張子
  • ファイルサイズ

上記以外の項目も出力可能です。
FileSystemObjectの FolderオブジェクトとFileオブジェクトのプロパティに対応した項目が出力可能です。
詳細は以下を参照ください。(新しいタブで別記事が開きますのでご注意ください)

フォルダ関連の出力可能項目はこちら

ファイル関連の出力可能項目はこちら

実行前の準備

FileSystemObjectを使用するため、「Microsoft Scripting Runtime」の参照設定を有効にする必要があります。
お手数ですが、以下記事の手順に則って、参照設定を有効化をしてからサンプルコードを実行ください。

サンプルコード

ファイル一覧の取得

サブフォルダを含むファイル一覧を書き出すサンプルコードです。
ハイライトされている以下の行を修正したうえでご使用ください。

  • 13行目:検索を開始するフォルダパスを指定してください。
  • 16行目:データを書き出す行を指定してください。
めい

13行目をInputBoxにして、都度フォルダパスを入力可能にするのもオススメです!

サンプルコード
' ****************************************
' 概要 :ファイル一覧の書き出しを行う
' 引数 :なし
' 戻り値:なし
' ****************************************
Public Sub writeFileList()
    Dim fso As New FileSystemObject ' FileSystemObject
    Dim targetFolder As Folder      ' 検索対象Folderオブジェクト
    Dim targetFolderPath As String  ' 検索対象フォルダパス
    Dim startRowIndex As Long       ' 書き出し開始行Index

    ' 検索対象フォルダパスを入力させる
    targetFolderPath = "C:\Users\xxxx\AppData\Local\Microsoft\Office\16.0"

    ' 書き出し開始の行を設定
    startRowIndex = 2

    ' フォルダが存在した場合のみ処理を実行
    If fso.FolderExists(targetFolderPath) Then

        ' 検索対象のフォルダオブジェクトを生成する
        Set targetFolder = fso.GetFolder(targetFolderPath)
    
        ' ファイルの検索と書き出しを行う
        Call execFileSearch(fso, targetFolder, startRowIndex)
    End If

    ' オブジェクトの解放
    Set fso = Nothing
    Set targetFolder = Nothing
End Sub

' ****************************************
' 概要 :ファイルの検索を行う(サブフォルダーを含む)
' 引数 :fso             … FileSystemObject
'         folderObj       … 検索対象Folderオブジェクト
'         currentRowIndex … 書き出し行Index
' 戻り値:なし
' ****************************************
Private Sub execFileSearch( _
    ByVal fso As FileSystemObject, ByVal folderObj As Folder, ByRef currentRowIndex As Long)
    Dim fileObj As File         ' Fileオブジェクト
    Dim subFolderObj As Folder  ' サブフォルダ用 Folderオブジェクト

    ' 検索対象フォルダ配下のファイルをループする
    For Each fileObj In folderObj.Files

        ' ファイル情報を書き出し
        Call writeFileInfo(fso, fileObj, currentRowIndex)
    Next fileObj

    ' サブフォルダ情報を書き出し
    For Each subFolderObj In folderObj.SubFolders

        ' サブフォルダを対象とし、再度ファイルの検索を行う
        Call execFileSearch(fso, subFolderObj, currentRowIndex)
    Next subFolderObj

    ' オブジェクトの解放
    Set fileObj = Nothing
    Set subFolderObj = Nothing
End Sub

' ****************************************
' 概要 :ファイル情報の書き出し
' 引数 :fso             … FileSystemObject
'         folderObj       … Fileオブジェクト
'         currentRowIndex … 書き出し行Index
' 戻り値:なし
' ****************************************
Private Sub writeFileInfo(ByVal fso As FileSystemObject, ByVal fileObj As File, ByRef currentRowIndex As Long)

    ' マクロを実行しているブックの1番目のシートに書き出し
    With ThisWorkbook.Worksheets(1)

        ' フォルダ情報の書き出し
        .Cells(currentRowIndex, 1).Value = fileObj.ParentFolder.Path  ' フォルダパス
        .Cells(currentRowIndex, 2).Value = fileObj.ParentFolder.Name  ' フォルダ名
    
        ' ファイル情報の書き出し
        .Cells(currentRowIndex, 3).Value = fileObj.Name                       ' ファイル名
        .Cells(currentRowIndex, 4).Value = fso.GetExtensionName(fileObj.Name) ' 拡張子
        .Cells(currentRowIndex, 5).Value = fileObj.Size                       ' ファイルサイズ(Byte)
    End With

    ' 書き出し行Indexをインクリメント
    currentRowIndex = currentRowIndex + 1
End Sub

処理を分かりやすくするため、コメントを多くしています。
見づらい場合は、お手数ですが必要に応じて削除をお願いします。

最後に

今回は、サブフォルダを含むファイル一覧を書き出す方法について解説しました。

サンプルコードでは冗長的になるのを避けるため、ヘッダ部の書き出し・装飾や罫線などを引いていないため、追加でコーディング頂けると汎用的にご使用頂けると思います。
また、処理終了後にメッセージボックスを出力すると、より使いやすくなると思います。

本記事が皆さんのお力になれば幸いです!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA