前回、「FileSearchの代わりにFileSystemObjectを使用する」で紹介したとおり、Office2007以上は
FileSearch
オブジェクトが使えなくなり、FileSystemObject
を使うようになった。FileSystemObject
に替えることで、下記のことができなくなった。- サブディレクトリ配下の検索
- ファイル名でソート
- ファイル名(拡張子)の指定
1.サブディレクトリの検索は、こちらを参照→ 【VBA】FileSearchの代わりにFileSystemObjectを使用する
今回は、「2.ファイル名でソート」と「3.ファイル名(拡張子)の指定」をメインに紹介する。
【追記:2014/05/24】
サブディレクトリ検索、ソート、拡張子フィルタを実装したテンプレートを作成した。
→ 【VBA】指定フォルダ配下のブックを操作するためのマクロテンプレート
ファイル名でソート
FileSearchの場合
下記の通り、ものっそい簡単にソートできる。
If fso.Execute(SortBy:=msoSortByFileName _
, SortOrder:=msoSortOrderAscending) Then
~~ 処理 ~~
End If
FileSystemObjectの場合
配列に入れて、クイックソートなりシェルソートなりでソートする手もあるが、ADOを使用すると比較的簡単にファイル名のソートができる。
'-- "FILENAMEフィールドを作成"
Dim ado As Object
Set ado = CreateObject("ADODB.Recordset")
ado.Fields.Append "FILENAME", 200, 300, 32
ado.Open
'-- GetFolderでパスを取得しAdoに格納
For Each file In fso.GetFolder(path).Files
ado.AddNew
ado.Fields(0) = file
ado.Update
Next
'-- FILENAMEでソート
ado.Sort = "FILENAME ASC"
ado.MoveFirst
'-- 処理実行
Do Until ado.EOF
~~ 処理 ~~
ado.MoveNext
Loop
ado.Close
Set ado = Nothing
ファイル名(拡張子)の指定
FileSearchの場合
これまた、ものっそい簡単に、しかも取得時にファイル名を指定して特定のファイルだけ取得できる。
Dim fso As FileSearch
Set fso = Application.FileSearch
'--ファイル名(CSVファイルを取得)
fso.Filename = "*.csv"
~~ 取得処理 ~~
FileSystemObjectの場合
FileSearchと違い、取得時にファイル名を指定できないため、取得してからフルイにかける必要がある。
~~ 取得処理 ~~
If LCase(fso.GetExtensionName(filename)) = "csv" Then
~~ 処理 ~~
End If
以上
コメント欄をありがとう。
返信削除多くの記事が、ツッコミどころ満載な中途半端なコードで、「コメント受け付けません」というスタンスを取る中、コメント欄のある記事はとても有用で、向上心があるように感じられて好印象です。中途半端なコードを野放しにしてる人は、DOBON.NETを見習えと思います。
FileSearchのような便利な機能が廃止されたのは残念ですね。
FileSystemObject の場合、取得するファイルの順番がバラバラになりがちなので、実業務では名前順や更新日時順に並び替える実装も必要になることが多いですね。
Adoでのサンプル有難うございます。
実装方法の選定に利用させていただきました。
結局FileSystemObject で取得したFIleオブジェクトを配列に格納して、Nameプロパティでソートする形にしました。理由はその方が誰でも思いつきやすい形だと判断したからです。後の保守、自分が対応するとも限らない状況では、見て分かりやすい形の方がよいという考えです。
ソートのコードはChatGPTに任せればすぐですしね。