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




以上

0 件のコメント :

コメントを投稿