【Excel】VBAのFileSystemObjectでファイル一覧を取得!Excelにフォルダ内容を書き出す方法

【Excel】VBAのFileSystemObjectでファイル一覧を取得!Excelにフォルダ内容を書き出す方法
🛡️ 超解決

Excelで特定のフォルダ内にあるファイル名やフォルダ名の一覧を取得したい場面があるでしょう。手作業でコピー&ペーストするのは手間がかかり、ミスも発生しやすいです。VBAのFileSystemObjectを使えば、これらの作業を自動化できます。

この記事では、VBAのFileSystemObjectを使ってフォルダ内のファイル一覧を取得し、Excelシートに書き出す方法を解説します。この方法を習得すれば、ファイル管理の効率が大幅に向上します。

ADVERTISEMENT

VBAでファイル一覧を取得する仕組み

Excel VBAでファイルやフォルダを操作する際、FileSystemObjectは非常に強力なツールです。このオブジェクトは、ファイルシステムへのアクセスを可能にし、ファイルの作成、削除、コピー、移動、そして一覧の取得といった様々な操作を実行できます。

FileSystemObjectを利用することで、指定したフォルダ内のすべてのファイルとサブフォルダをプログラムで列挙できます。各ファイルやフォルダのプロパティ(名前、サイズ、更新日時など)も取得できるため、Excelシートへの出力に必要な情報を効率的に収集することが可能です。

お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

FileSystemObjectでファイル一覧を取得するVBAコード

ここでは、指定したフォルダ内のファイル名と更新日時を取得し、Excelシートに書き出すVBAコードを紹介します。コードを実行すると、指定したフォルダの内容がExcelシートに一覧表示されます。

  1. VBAエディタを開く
    ExcelでAltキーとF11キーを同時に押してVBAエディタを開きます。
  2. 標準モジュールを挿入する
    VBAエディタのメニューで「挿入」>「標準モジュール」を選択します。
  3. コードを貼り付ける
    表示されたコードウィンドウに、以下のVBAコードをコピー&ペーストします。

【VBAコード】

Sub GetFileListToExcel()

    Dim fso As Object
    Dim targetFolder As Object
    Dim fileItem As Object
    Dim folderPath As String
    Dim ws As Worksheet
    Dim rowNum As Long

    ' フォルダパスを指定してください
    folderPath = "C:\Users\YourUsername\Documents\TestFolder" ' ここを実際のフォルダパスに変更してください

    ' FileSystemObjectを作成
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' 指定したフォルダが存在するか確認
    If Not fso.FolderExists(folderPath) Then
        MsgBox "指定されたフォルダが存在しません。パスを確認してください。", vbExclamation
        Exit Sub
    End If

    ' 対象フォルダを取得
    Set targetFolder = fso.GetFolder(folderPath)

    ' 作業対象のシートを設定(アクティブシートを使用)
    Set ws = ThisWorkbook.ActiveSheet
    ws.Cells.ClearContents ' シートの内容をクリア

    ' ヘッダー行を書き込む
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "更新日時"
    ws.Cells(1, 3).Value = "サイズ(バイト)"
    ws.Cells(1, 4).Value = "種類"
    ws.Range("A1:D1").Font.Bold = True ' ヘッダーを太字にする

    ' ファイル一覧を書き込む
    rowNum = 2 ' 2行目から開始
    For Each fileItem In targetFolder.Files
        ws.Cells(rowNum, 1).Value = fileItem.Name
        ws.Cells(rowNum, 2).Value = fileItem.DateLastModified
        ws.Cells(rowNum, 3).Value = fileItem.Size
        ws.Cells(rowNum, 4).Value = fso.GetExtensionName(fileItem.Name) ' ファイル拡張子を取得
        rowNum = rowNum + 1
    Next fileItem

    ' フォルダ一覧を書き込む(必要に応じて)
    ' For Each folderItem In targetFolder.SubFolders
    '     ws.Cells(rowNum, 1).Value = folderItem.Name
    '     ws.Cells(rowNum, 2).Value = folderItem.DateLastModified
    '     ws.Cells(rowNum, 3).Value = "<フォルダ>"
    '     ws.Cells(rowNum, 4).Value = "フォルダ"
    '     rowNum = rowNum + 1
    ' Next folderItem

    ' 列幅を自動調整
    ws.Columns("A:D").AutoFit

    MsgBox "ファイル一覧の取得が完了しました。", vbInformation

    ' オブジェクト変数を解放
    Set fileItem = Nothing
    Set targetFolder = Nothing
    Set fso = Nothing
    Set ws = Nothing

End Sub
  1. コードのカスタマイズ
    コード内の `folderPath = “C:\Users\YourUsername\Documents\TestFolder”` の部分を、実際にファイル一覧を取得したいフォルダのパスに書き換えてください。
  2. マクロの実行
    VBAエディタでF5キーを押すか、Excelシートに戻り「開発」タブ > 「マクロ」から「GetFileListToExcel」を選択して「実行」ボタンをクリックします。

実行後、アクティブなExcelシートに指定したフォルダ内のファイル名、更新日時、サイズ、種類(拡張子)が表示されます。コメントアウトされている部分を有効にすれば、サブフォルダ名も取得できます。

ファイル一覧取得時の注意点と応用

FileSystemObjectは非常に便利ですが、いくつか注意すべき点があります。また、応用することでさらに活用の幅が広がります。

ファイルパスの指定方法

フォルダパスを指定する際は、バックスラッシュ `\` を2つ重ねる `\` か、またはパスをダブルクォーテーションで囲み、パスの前に `&` をつける方法が推奨されます。これは、VBAにおいて `\` がエスケープ文字として解釈される場合があるためです。

例: `”C:\Users\YourUsername\Documents\TestFolder”` または `”C:” & “\Users\YourUsername\Documents\TestFolder”`

セキュリティ警告について

Excelでマクロを含むファイルを開いた際に、セキュリティ警告が表示されることがあります。これは、悪意のあるマクロが実行されるのを防ぐための機能です。FileSystemObjectはファイルシステムにアクセスするため、この警告が表示されることがあります。

信頼できるソースからのファイルである場合は、「コンテンツの有効化」をクリックしてマクロを有効にしてください。マクロのセキュリティ設定は「ファイル」>「オプション」>「トラストセンター」>「トラストセンターの設定」で調整できますが、セキュリティリスクを理解した上で設定を変更することが重要です。

エラーハンドリングの追加

指定したフォルダが存在しない場合や、ファイルへのアクセス権がない場合などにエラーが発生する可能性があります。コードにエラーハンドリングを追加することで、予期せぬエラーでマクロが停止するのを防ぎ、より安定した処理を実現できます。

例えば、 `On Error Resume Next` をコードの先頭に追加し、エラー発生後に処理を継続させる方法があります。ただし、エラーが発生した原因を特定しにくくなるため、デバッグが難しくなる場合もあります。必要に応じて、 `On Error GoTo ErrorHandler` を使用して、特定のエラー処理ルーチンにジャンプさせる方法も有効です。

取得情報の拡張

FileSystemObjectは、ファイル名や更新日時以外にも、ファイルサイズ (`fileItem.Size`)、ファイル属性 (`fileItem.Attributes`)、ファイルパス (`fileItem.Path`) など、多くのプロパティを持っています。これらの情報をExcelシートに書き出すことで、より詳細なファイル管理リストを作成できます。

例えば、ファイルサイズをKBやMB単位で表示するように計算したり、特定の拡張子を持つファイルだけを抽出したりする処理を組み込むことが可能です。これにより、ディスク容量の確認や、特定の種類のファイル検索などが容易になります。

サブフォルダの再帰処理

現在のコードは指定したフォルダ直下のファイルしか取得しません。もし、サブフォルダ内のファイルもすべて取得したい場合は、再帰処理(関数自身を呼び出す処理)を実装する必要があります。

例えば、フォルダを処理する関数を作成し、その関数内でサブフォルダを見つけたら、そのサブフォルダに対して同じ関数を呼び出すようにします。これにより、階層構造が深いフォルダでも、すべてのファイル一覧を正確に取得できます。

【再帰処理のイメージ】

Sub ProcessFolder(ByVal currentFolderPath As String)
    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(currentFolderPath)

    ' ファイルを処理
    For Each file In folder.Files
        ' ここでファイル情報をExcelに書き出す処理
        Debug.Print file.Path
    Next file

    ' サブフォルダを処理
    For Each subFolder In folder.SubFolders
        ProcessFolder subFolder.Path ' 再帰呼び出し
    Next subFolder

    Set fso = Nothing
    Set folder = Nothing
    Set subFolder = Nothing
    Set file = Nothing
End Sub

' メインルーチンから呼び出す
Sub GetFileListRecursive()
    Dim startPath As String
    startPath = "C:\Users\YourUsername\Documents\TestFolder" ' 開始フォルダパス
    ProcessFolder startPath
    MsgBox "再帰処理によるファイル一覧取得が完了しました。", vbInformation
End Sub

この再帰処理を実装することで、複雑なフォルダ構造を持つデータでも、網羅的にファイル情報を収集することが可能になります。

ADVERTISEMENT

まとめ

この記事では、Excel VBAのFileSystemObjectを使用して、指定したフォルダ内のファイル一覧を取得し、Excelシートに書き出す方法を解説しました。

FileSystemObjectを活用することで、ファイルパスの指定、セキュリティ警告への対処、エラーハンドリングの追加、取得情報の拡張、そして再帰処理によるサブフォルダ内のファイル取得まで、様々なレベルでファイル管理を自動化できます。

このVBAコードを基に、ご自身の業務に合わせてパスや取得項目をカスタマイズし、ファイル管理の効率化に役立ててください。

📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】