前に VBA で FileSystemObject を使った再帰的なファイル検索をした気がするけど、当時の記憶でネットワークドライブに対してファイル検索を行うコードを書いたら超絶遅い。マジで「こんなん使ってられませんわ!」レベル。
ふと、思い出して Dir
関数使ってみたらめちゃめちゃ早い。どれくらい早いかっていうと5分かかるものが10秒で終わるレベル。FileSystemObject は .SubFolders
メソッドも .Files
メソッドも遅い。
とりあえず Collection の先頭に起点となるフォルダを突っ込んで、そこから全サブフォルダを再起検索。それからサブフォルダをループで回してファイル検索。コマンドプロンプトだと dir /s /a-d
だけで出来るんだけどなぁ…。
Option Explicit Sub macro() Dim dirstack As New Collection dirstack.Add "C:\Windows" Dim i As Long i = 1 Dim strName As String Do strName = Dir(dirstack(i) & "\", vbDirectory) Do While strName <> "" If (GetAttr(dirstack(i) & "\" & strName) And vbDirectory) = vbDirectory _ And strName <> "." _ And strName <> ".." _ Then dirstack.Add dirstack(i) & "\" & strName End If strName = Dir() Loop i = i + 1 If i > dirstack.Count Then Exit Do End If Loop i = i + 1 Dim f as Variant For Each f in dirstack strName = Dir(f & "\" & "*.log") Do While strName <> "" Cells(i, 1) = f & "\" & strName strName = Dir() i = i + 1 Loop Next f Columns.Sort _ Key1:=Columns(1), _ Order1:=xlAscending, _ Header:=xlGuess, _ MatchCase:=False, _ Orientation:=xlTopToBottom Columns.AutoFit End Sub
Dir
関数はファイル名順に処理してくれないのが欠点だけど .Sort
メソッドがそこそこ速いのでこれはなんとかなりそう。