2013/10/12

【VBA】FileSearchの代わりにFileSystemObjectを使用する


 Office2003から2007以降のバージョンに変えた時に使えなくなる代表的なモノが「FileSearch」オブジェクトではないだろうか?

作業効率向上のため、ファイルを検索、読み込んで、編集して、書き込んで、保存のような使い方など…

そのため、Office2007、2010、2013などは「FileSystemObject」に替える必要がある。


【追記:2014/05/24
サブディレクトリ検索、ソート、拡張子フィルタを実装したテンプレートを作成した。
→ 【VBA】指定フォルダ配下のブックを操作するためのマクロテンプレート




Office 2003まで



Sub MyFileSearch(ByVal path As String)
    Dim fso As Object
    Set fso = Application.FileSearch

    With fso
        .LookIn = path              '--検索フォルダ
        .Filename = "*.csv"         '--ファイル名
        .SearchSubFolders = True    '--サブフォルダ検索

        If .Execute(SortBy:=msoSortByFileName _
                  , SortOrder:=msoSortOrderAscending) Then
            For i = 1 To .FoundFiles.Count Step 1
                '-- ファイルパスの取得
                Debug.Print .FoundFiles(i)
            Next
        End If
    End With
End Sub


FileSearchオブジェクトでは「SearchSubFolders」や「SortBy」を使うことで、サブディレクトリの検索や取得時にソートすることができた。

しかし、「FileSystemObject」ではサブディレクトリ検索は面倒になる。
ファイル取得時のソートはできない。



Office 2007以降



Sub MyFileSystemObject(path)
    Dim fso As Object
    Dim file, folder As Variant
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '-- フォルダパスの取得
    For Each folder In fso.GetFolder(path).SubFolders
        '-- サブディレクトリ内まで検索するには再帰的に関数を呼び出す
        MyFileSystemObject folder.path
    Next
    
    '-- ファイルパスの取得
    For Each file In fso.GetFolder(path).Files
        Debug.Print file.Path
    Next
End Sub


 サブディレクトリの検索は、9行目にあるように再帰的に関数を呼び出す必要がある。
ソースだけ見ればサッパリしたようなしていないような……。


 ファイル取得時のソートは、次回以降にまとめる。



【2013/10/19 追記】
  【VBA】FileSystemObjectでファイル名(拡張子)の指定+ソートして取得する 




以上

0 件のコメント :

コメントを投稿