概要:なぜ「ファイル一覧作成」がVBA学習の登竜門なのか
VBA100本ノックの第26本目、「指定フォルダ内のファイル一覧を取得する」という課題は、実務における自動化の第一歩であり、避けては通れない非常に重要なテーマです。多くの初心者は、Dir関数を使ってループを回す方法から学び始めますが、プロフェッショナルなエンジニアを目指すのであれば、FileSystemObject(FSO)を用いたアプローチを習得することが不可欠です。
この課題を通じて習得すべきは、単にファイル名を表示することだけではありません。フォルダ階層の構造、拡張子によるフィルタリング、そしてエラーハンドリングを含めた「堅牢なコード」を書くための基礎体力を養うことです。本記事では、実務でそのまま使えるレベルのコード解説と、なぜFSOを使うべきなのかという技術的な背景を深く掘り下げていきます。
詳細解説:Dir関数 vs FileSystemObject
VBAでファイル操作を行う場合、大きく分けて「Dir関数」と「FileSystemObject」の二つの選択肢があります。
Dir関数は、VBAに標準で組み込まれている関数であり、外部参照を設定する必要がないというメリットがあります。しかし、再帰処理(サブフォルダまで含めた探索)が非常に書きにくく、コードの可読性も低いという欠点があります。
一方、FileSystemObject(Microsoft Scripting Runtime)は、オブジェクト指向的にファイルやフォルダを操作できる強力なライブラリです。
1. 階層構造の探索が容易(再帰関数との相性が抜群)
2. ファイルの属性(作成日時、最終更新日時、ファイルサイズ)へのアクセスが直感的
3. エラーハンドリングが構造化しやすい
本ノックでは、このFileSystemObjectを採用し、保守性が高く拡張性のあるコードを作成することを目的とします。
サンプルコード:実務で使えるフォルダ内ファイル一覧取得
以下のコードは、指定したフォルダ内のファイルをすべて取得し、アクティブシートに一覧として出力するものです。参照設定を行わずに実行できるよう、あえて「遅延バインディング」を採用しています。
Sub GetFileList()
' FSOオブジェクトを生成
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
' 対象フォルダのパスを指定
Dim folderPath As String
folderPath = "C:\TestFolder" ' ここを適宜変更してください
' フォルダが存在するか確認
If Not fso.FolderExists(folderPath) Then
MsgBox "指定されたフォルダが見つかりません。", vbCritical
Exit Sub
End If
Dim targetFolder As Object
Set targetFolder = fso.GetFolder(folderPath)
' 出力用シートの初期化
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Cells.Clear
ws.Range("A1:D1").Value = Array("ファイル名", "パス", "サイズ(KB)", "更新日時")
Dim fileItem As Object
Dim rowIdx As Long
rowIdx = 2
' ファイルを順次処理
For Each fileItem In targetFolder.Files
With ws
.Cells(rowIdx, 1).Value = fileItem.Name
.Cells(rowIdx, 2).Value = fileItem.Path
.Cells(rowIdx, 3).Value = Round(fileItem.Size / 1024, 2)
.Cells(rowIdx, 4).Value = fileItem.DateLastModified
End With
rowIdx = rowIdx + 1
Next fileItem
' 列幅の自動調整
ws.Columns("A:D").AutoFit
MsgBox "ファイル一覧の作成が完了しました。", vbInformation
End Sub
実務アドバイス:拡張性のためのエンジニアリング
このコードを実務で活用する際、単に「一覧を出すだけ」では不十分なケースがほとんどです。以下の3点に注意することで、ツールとしての品質が一段と向上します。
1. 再帰処理の検討:
もしサブフォルダ内のファイルも取得したい場合は、再帰関数(自分自身を呼び出す関数)を実装する必要があります。プログラミングにおいて、再帰は「関数の中で同じ関数を呼び出す」という仕組みです。フォルダの中にフォルダがある場合、FileSystemObjectを使ってサブフォルダコレクションをループ処理させることで、階層を問わず全ファイルを網羅できます。
2. フィルタリングの徹底:
実務では「特定の拡張子(.xlsxなど)だけ抽出したい」という要望が必ず発生します。`If LCase(fso.GetExtensionName(fileItem.Path)) = “xlsx” Then` のような条件分岐をループ内に入れることで、不要なファイルを弾く設計にしましょう。
3. エラーハンドリングの重要性:
ネットワークドライブや権限のないシステムフォルダを指定した場合、VBAはエラーで停止します。`On Error Resume Next` を多用するのは推奨されませんが、フォルダのアクセス権限チェックなど、例外処理を丁寧に行うことが、ユーザーに優しいツールを作る秘訣です。
まとめ:VBA100本ノックで養うべき「設計眼」
VBA100本ノックの第26本目は、単なるファイル操作の演習ではありません。それは、複雑な業務を小さなステップに分解し、それをオブジェクトという部品を使って組み立てるという、プログラミングの「設計眼」を養うための重要なマイルストーンです。
FileSystemObjectを自在に操れるようになると、ファイルの名前を一括変更したり、特定の条件でファイルを移動させたり、さらにはログファイルを自動生成したりといった、業務効率化の幅が劇的に広がります。
コードを書くときは、常に「もし将来的に要件が変わったら、どこを修正すべきか?」という視点を持ってください。変数名一つ、条件分岐一つにこだわるその姿勢こそが、ベテランエンジニアへの第一歩です。まずはこの26本目のコードを書き写し、デバッグを繰り返しながら、自分なりのカスタマイズを加えてみてください。その過程で得た知識は、あなたのPCスキルの大きな財産となるはずです。
