概要
Excel VBAを用いてフォルダ内のファイル一覧を取得する際、最も基本的かつ強力なツールとなるのが「Dir関数」です。本稿では、前回の基礎編に続き、Dir関数の真価を発揮させる「再帰処理」や「属性の制御」、そして実務で頻繁に遭遇する「エラーハンドリング」を含めた高度な実装手法を解説します。単にファイル名をセルに書き出すだけでなく、業務効率化ツールとして完成度を高めるためのテクニックを網羅しました。
詳細解説
Dir関数は、指定したパス内のファイル名(またはフォルダ名)を文字列として返す関数です。この関数の最大の特長は、第一引数にパスを指定して呼び出した後、第二引数を省略して呼び出すことで「次のファイル」を順次取得できる点にあります。
しかし、実務で直面する課題は「サブフォルダを含めた全ファイルの一覧作成」や「隠しファイル・システムファイルの除外」です。これらを解決するためには、以下の3つのステップを深く理解する必要があります。
1. 属性の活用:Dir関数の第二引数には、vbDirectoryやvbHiddenなどの定数を指定できます。これにより、通常のファイルだけでなくフォルダ名も取得可能になります。
2. ループの制御:Dir関数は静的なメモリを保持しているため、複数の処理を同時に走らせる場合には注意が必要です。必ず一つの処理が終了してから次のループへ移るロジックを組むことが鉄則です。
3. エラーと例外:存在しないパスやアクセス権限のないフォルダに対してDirを実行すると、予期せぬエラーが発生します。Dir関数を使う前には、必ずDir関数そのものが空(””)を返す状態や、Dir関数の戻り値を判定するチェックロジックが必要です。
サンプルコード
以下のコードは、指定したフォルダ内にある全てのファイル(サブフォルダは含まず)を抽出し、そのサイズと更新日時までを取得する実務型のサンプルです。
Sub GetFileListWithDetails()
Dim targetFolder As String
Dim fileName As String
Dim rowNum As Long
' フォルダパスの設定
targetFolder = "C:\TestFolder\"
' フォルダの存在確認
If Dir(targetFolder, vbDirectory) = "" Then
MsgBox "指定されたフォルダが見つかりません。", vbCritical
Exit Sub
End If
' ヘッダーの作成
Cells(1, 1).Value = "ファイル名"
Cells(1, 2).Value = "サイズ(Byte)"
Cells(1, 3).Value = "更新日時"
rowNum = 2
' Dir関数でファイルを取得
fileName = Dir(targetFolder & "*.*", vbNormal)
Do While fileName <> ""
' セルに情報を書き込む
Cells(rowNum, 1).Value = fileName
Cells(rowNum, 2).Value = FileLen(targetFolder & fileName)
Cells(rowNum, 3).Value = FileDateTime(targetFolder & fileName)
' 次のファイルへ
fileName = Dir()
rowNum = rowNum + 1
Loop
MsgBox "一覧作成が完了しました!", vbInformation
End Sub
実務アドバイス
Dir関数を実務で使いこなすための「ベテランの知恵」を3点伝授します。
第一に「パスの末尾処理」です。フォルダパスの末尾に「\」が含まれているかいないかで、Dir関数の挙動は大きく変わります。文字列の末尾が「\」でないことを確認し、もし欠けていれば自動的に付与する関数を作成しておくのがプロの流儀です。
第二に「FileSystemObject(FSO)との使い分け」です。Dir関数は軽量で高速ですが、複雑な階層構造(サブフォルダの深掘り)には不向きです。サブフォルダを含めた再帰的な処理が必要な場合は、FSOを使用することをお勧めします。しかし、単純な直下の一覧取得であれば、Dir関数の方が圧倒的にメモリ消費が少なく、動作も軽快です。用途に応じて使い分ける判断力が重要です。
第三に「処理の停止」です。万が一、無限ループに陥った際に備えて、DoEvents関数をループ内に記述することを推奨します。これにより、マシンのフリーズを防ぎ、ユーザーが「Esc」キーで処理を中断できる余地を残すことができます。
まとめ
Dir関数は、VBAにおけるファイル操作の「基本にして究極」です。今回紹介した手法をマスターすることで、手作業で行っていたファイル名の一覧作成という単調な業務を、数秒で完了する自動化タスクへと昇華させることができます。
重要なのは、コードを動かすことだけではありません。「もしフォルダが空だったら?」「もしファイル名に特殊文字が含まれていたら?」といったエッジケースを想定した堅牢なコードを書くことこそが、プログラミングスキルの向上に直結します。本稿のサンプルをベースに、皆様の業務環境に合わせてカスタマイズを繰り返してください。VBAの学習において、実際に手を動かし、試行錯誤する時間は何物にも代えがたい財産となります。さあ、今すぐエディタを開き、自分だけの自動化ツールを作り上げましょう。
