mattintosh note

どこかのエンジニアモドキの備忘録

FileSystemObject さんが遅い

前に 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 メソッドがそこそこ速いのでこれはなんとかなりそう。