2013/10/19

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


 前回、「FileSearchの代わりにFileSystemObjectを使用する」で紹介したとおり、Office2007以上はFileSearchオブジェクトが使えなくなり、FileSystemObjectを使うようになった。


FileSystemObjectに替えることで、下記のことができなくなった。

  1. サブディレクトリ配下の検索
  2. ファイル名でソート
  3. ファイル名(拡張子)の指定

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




以上

1 件のコメント :

  1. コメント欄をありがとう。
    多くの記事が、ツッコミどころ満載な中途半端なコードで、「コメント受け付けません」というスタンスを取る中、コメント欄のある記事はとても有用で、向上心があるように感じられて好印象です。中途半端なコードを野放しにしてる人は、DOBON.NETを見習えと思います。

    FileSearchのような便利な機能が廃止されたのは残念ですね。
    FileSystemObject の場合、取得するファイルの順番がバラバラになりがちなので、実業務では名前順や更新日時順に並び替える実装も必要になることが多いですね。
    Adoでのサンプル有難うございます。
    実装方法の選定に利用させていただきました。

    結局FileSystemObject で取得したFIleオブジェクトを配列に格納して、Nameプロパティでソートする形にしました。理由はその方が誰でも思いつきやすい形だと判断したからです。後の保守、自分が対応するとも限らない状況では、見て分かりやすい形の方がよいという考えです。
    ソートのコードはChatGPTに任せればすぐですしね。

    返信削除