【VBAリファレンス】VBAでファイル一覧を高速生成する極意:FileSystemObjectを極める実践テクニック

スポンサーリンク

概要:なぜFileSystemObject(FSO)なのか

Excel VBAでファイル一覧を取得する方法はいくつか存在します。Dir関数を使う古き良き手法や、コマンドプロンプトのdirコマンドを呼び出す荒技もあります。しかし、業務の現場で「安定性」「メンテナンス性」「柔軟な拡張性」が求められる今、間違いなく最強の選択肢は「FileSystemObject(以下FSO)」です。

FSOは、Windowsのファイルシステムをオブジェクトとして操作するためのライブラリです。Dir関数では実現困難な「フォルダの階層構造を再帰的に辿る」「作成日時や更新日時、属性情報を一瞬で取得する」「パスの連結や分離をスマートに行う」といった操作を、直感的なコードで記述できます。本記事では、VBA中級者を目指す皆様へ、FSOを活用したファイル一覧作成の決定版とも言えるプロフェッショナルな実装手法を解説します。

詳細解説:FSOの基本構造とメリット

FSOを使用するには、参照設定を行う方法(Microsoft Scripting Runtime)と、Late Binding(実行時バインディング)を行う方法があります。配布先環境を選ばないという観点から、今回はCreateObject関数を用いたLate Bindingを採用します。

FSOの主要なオブジェクトは以下の3つです。
1. FileSystemObject:システム全体を司るルートオブジェクト。
2. Folder:フォルダを表現するオブジェクト。サブフォルダのコレクション(SubFolders)を持ちます。
3. File:ファイルを表現するオブジェクト。名前、パス、サイズ、日付などのプロパティを保持します。

これらを組み合わせることで、特定のフォルダ内を探索する「ループ処理」が非常に書きやすくなります。特に、再帰処理(自分自身を呼び出す関数)と組み合わせることで、どれほど深いフォルダ階層でも、一網打尽にファイル一覧を抽出することが可能になります。

サンプルコード:再帰処理を用いたファイル一覧抽出プログラム

以下は、指定したフォルダ以下の全ファイルを取得し、シートに書き出すための実務的なサンプルコードです。エラーハンドリングと処理速度を考慮した実装となっています。


Option Explicit

' 実行用メインプロシージャ
Sub ExportFileList()
    Dim fso As Object
    Dim targetFolder As String
    Dim ws As Worksheet
    
    ' 探索対象フォルダの指定(FileDialogの使用を推奨)
    targetFolder = "C:\Users\Example\Documents"
    
    Set ws = ThisWorkbook.Sheets(1)
    ws.Cells.Clear
    ws.Range("A1:D1").Value = Array("ファイル名", "パス", "サイズ(KB)", "更新日時")
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' 再帰処理の開始
    Call ListFilesRecursive(fso.GetFolder(targetFolder), ws, 2)
    
    ws.Columns("A:D").AutoFit
    Set fso = Nothing
    MsgBox "一覧作成が完了しました。", vbInformation
End Sub

' 再帰的にフォルダを探索するサブプロシージャ
Sub ListFilesRecursive(ByVal folder As Object, ByRef ws As Worksheet, ByRef row As Long)
    Dim file As Object
    Dim subFolder As Object
    
    ' ファイル情報の書き出し
    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.Size / 1024
        ws.Cells(row, 4).Value = file.DateLastModified
        row = row + 1
    Next file
    
    ' サブフォルダを再帰的に探索
    For Each subFolder In folder.SubFolders
        Call ListFilesRecursive(subFolder, ws, row)
    Next subFolder
End Sub

実務アドバイス:パフォーマンスとエラー回避のポイント

実務でこのコードを使用する際、考慮すべき「落とし穴」がいくつかあります。

1. 画面更新の停止:
大量のファイルを処理する場合、`Application.ScreenUpdating = False`を冒頭に入れ、処理後に`True`に戻してください。これだけで実行速度が数倍変わります。

2. アクセス権限エラーへの対応:
「システムフォルダ」や「アクセス権のない共有フォルダ」に遭遇すると、VBAは「許可されていません(エラー70)」で停止します。実務では必ず`On Error Resume Next`を適切な範囲で使用し、エラー発生時にそのフォルダをスキップするロジックを組み込むのが定石です。

3. 配列への格納:
セルに1行ずつ書き込む処理は、Excel VBAにおいて最も遅い処理の一つです。もし数千件以上のファイルを扱う場合は、一度「配列」に情報を格納し、最後に`Range`へ一括転記する方法を検討してください。

4. フォルダパスの末尾の処理:
FSOの大きな利点は、パスの結合に「BuildPath」メソッドが使えることです。`path & “\” & filename`と自力で結合すると、区切り文字の重複や欠落でバグを生みがちです。FSOを信じて任せることで、コードの堅牢性は飛躍的に向上します。

まとめ:FSOはあなたの最強の武器になる

FileSystemObjectは、単にファイル一覧を作るためだけのツールではありません。業務効率化における「自動化の基盤」です。ファイル整理、バックアップ、ログの集計、命名規則のチェックなど、応用範囲は無限大です。

本記事で紹介した再帰処理の考え方は、VBAにおける「アルゴリズムの基礎」です。最初は難解に感じるかもしれませんが、一度マスターすれば、手作業で数時間かかっていたフォルダ管理業務を、一瞬のクリックで終わらせる魔法の杖を手に入れたも同然です。

ぜひ、日々の業務の中でこのコードをベースに、自分なりのカスタマイズを加えてみてください。ファイル名に特定文字列が含まれる場合のみ抽出する、あるいは更新日時が古いものを抽出するなど、条件を一つ追加するだけで、あなたの現場に特化した強力なツールへと進化します。VBAスキルを磨き、生産性を極限まで高めていきましょう。

タイトルとURLをコピーしました