【VBAリファレンス|実務向け】サブフォルダを含めてファイル一覧を取得する(WSHでDirコマンドを実行)|Excel VBA

スポンサーリンク

業務で特定のフォルダ配下にあるファイルを一括でリストアップしたい、というシーンは非常に多いものです。VBAの標準関数であるDir関数を使えばファイル一覧は取得できますが、サブフォルダまで含めようとすると再帰処理が必要になり、コードが少し複雑になってしまいます。

そこで今回は、Windows標準のDirコマンドをWSH(Windows Script Host)経由で呼び出すことで、サブフォルダまで含めたファイル一覧を「爆速」で取得するテクニックをご紹介します。

なぜDirコマンドを使うのか?

VBAで再帰処理(フォルダを潜る処理)を書くよりも、OSのコマンドを使った方が圧倒的に処理速度が速いからです。特にファイル数が数千、数万とある場合、この差は顕著になります。

サンプルコード

以下のコードは、指定したフォルダ内のCSVファイルを探し、そのパスとファイル名をシートに出力します。

Sub GetFilesList()
Const SEARCH_DIR As String = “C:\Work” ‘ 検索対象フォルダ
Const SEARCH_FILE As String = “.csv” ‘ 検索対象ファイル
Dim tmpFile As String, strCmd As String
Dim buf() As Byte, FileList() As String

‘ 一時ファイルのパス作成
tmpFile = Environ(“TEMP”) & “\Dir.tmp”

‘ コマンド文字列の組み立て
‘ /b:ファイル名のみ /s:サブフォルダを含む /a:-d:フォルダを除外
strCmd = “Dir “”” & SEARCH_DIR & “\” & SEARCH_FILE & “”” /b/s/a:-d > “”” & tmpFile & “”””

‘ WSHで実行
With CreateObject(“Wscript.Shell”)
.Run “cmd /c” & strCmd, 0, True
End With

‘ 結果を読み込み
Open tmpFile For Binary As #1
ReDim buf(1 To LOF(1))
Get #1, , buf
Close #1
Kill tmpFile ‘ 一時ファイルの削除

‘ 文字列変換と配列格納
FileList = Split(StrConv(buf, vbUnicode), vbCrLf)

‘ シートへの書き出し処理(簡略化のためフルパスで出力)
ActiveSheet.UsedRange.ClearContents
Range(“A1”).Resize(UBound(FileList) + 1, 1).Value = Application.Transpose(FileList)
End Sub

実装のポイント

1. コマンドプロンプトを非表示にする
Runメソッドの引数で「0」を指定することで、黒い画面(コマンドプロンプト)を一瞬も表示させずに処理を完了させることができます。

2. バイナリモードでの読み込み
Dirコマンドの結果を一度テキストファイルに書き出し、それをVBAで読み込む手順をとっています。この際、Binaryモードで読み込むことで、巨大なファイルリストであっても非常に高速にメモリへ展開可能です。

3. 属性の制御
Dirコマンドの /a オプションを使えば、「隠しファイルのみ」「フォルダのみ」といった絞り込みも自由自在です。

使い分けの考え方

・FSO(File System Object)を使う場合:
ファイルの作成日時やサイズなど、詳細なプロパティまで細かく取得したい場合に適しています。
・今回のようなDirコマンドを使う場合:
とにかく「ファイル名の一覧を高速に取得したい」という場合に最適です。

実務においては、処理速度が求められる大規模なフォルダ探索の際、ぜひこの手法を思い出してください。コードの記述量も少なく、メンテナンス性も高いおすすめのテクニックです。

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