【VBAリファレンス|実務向け】Excel VBAで「特定のフォルダ内のファイル」を高速検索して一覧化する手法

スポンサーリンク

導入

Excelの標準機能にもファイル検索機能は存在しますが、業務で「特定のフォルダにある大量のファイルから、特定の条件に合うファイル名だけを抽出してリスト化したい」という場面は多いはずです。標準機能で手動検索を繰り返すのは時間の無駄ですし、ミスも発生します。今回は、VBAを使ってフォルダ内のファイルを高速に検索し、ファイル名やパスをワークシートに書き出す手法を解説します。この技術を習得すれば、ファイル整理やデータ集計の自動化が一気に加速します。

基礎知識

VBAでファイル検索を行う際、最も汎用性が高く「実務的」なのが Dir関数 です。Dir関数は、指定したパスやパターン(ワイルドカード)に一致するファイル名を一つずつ取得する関数です。
・ワイルドカード:「(アスタリスク)」を使うことで、「Aで始まるすべてのファイル(A)」や「拡張子がxlsxのファイル(.xlsx)」といった指定が可能になります。
・ループ処理:Dir関数は最初に見つかったファイルを返し、引数を空にして再度呼び出すと次のファイルを返します。これを利用して、Do Whileループでリストの最後まで回すのが基本形です。

実装/解決策

以下の手順で実装を行います。
1. 検索したいフォルダのパスを指定する。
2. Dir関数で最初のファイルを取得する。
3. ファイル名が空になるまでループを回し、ワークシートに転記する。
4. 次のファイルを取得する。

サンプルプログラム

以下のコードは、指定したフォルダ内にある全てのExcelファイル(.xlsx)を検索し、A列にファイル名を書き出すマクロです。

Sub SearchFiles()
Dim targetFolder As String
Dim fileName As String
Dim rowNum As Long

‘ 検索対象のフォルダパスを指定(末尾に \ を付けること)
targetFolder = “C:\Users\Public\Documents\”

‘ 転記先の初期行
rowNum = 1

‘ Dir関数で最初のファイルを取得(.xlsxに絞り込み)
fileName = Dir(targetFolder & “.xlsx”)

‘ ファイルが見つからなくなるまでループ
Do While fileName <> “”
‘ シートにファイル名を書き出し
Cells(rowNum, 1).Value = fileName

‘ 次のファイルを取得
fileName = Dir()
rowNum = rowNum + 1
Loop

MsgBox “検索が完了しました。”
End Sub

応用・注意点

1. サブフォルダの検索:Dir関数は指定フォルダの直下のみを検索します。サブフォルダまで深く検索したい場合は「FileSystemObject (FSO)」を使用する必要があります。
2. エラー回避:フォルダパスが存在しない場合、Dir関数はエラーを返さない代わりに空文字を返すことがあります。必ず If Dir(targetFolder, vbDirectory) = “” Then のようにして、フォルダの存在チェックを行う癖をつけましょう。
3. 処理速度:数千件のファイルを扱う場合、セルへの転記を一つずつ行うと遅くなります。配列に格納して一括出力するか、Application.ScreenUpdating = False を使って画面更新を停止させることで、大幅に高速化できます。

まずは上記のコードで、身近なフォルダのファイルリスト化から試してみてください。ここから「ファイル名に含まれる特定の文字でフィルタリングする」といった条件を追加するだけで、実務で即戦力となる検索ツールに進化させることができます。

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