VBAで指定した拡張子のファイルを検索する方法

前回予告のうち、今回はExcel Playerに登録するMP3ファイルを、指定したフォルダ(サブフォルダ含む)の中から全検索する方法を紹介しようと思います。

FileSystemObject

"VBA"でと言いつつ、今回はExcelとは違う外部の機能

『FileSystemObject』を使用してファイル検索の機能を実現します。

事前準備

この機能をExcel VBAで使用する際は事前準備が必要です。

VBEの上部メニュー「ツール」→「参照設定」

Microsoft Scripting Runtime」にチェックを入れてOKをクリック。

これでFileSystemObjectを使えるようになりました。

FileSystemObjectはフォルダやファイルを操作するため専門のオブジェクトです。

ファイル検索のコード

Option Explicit
'①
Dim MusicFileAddress() As Variant
Dim n As Long
----------------------------------------------------------------
Sub GetMusicFileAddress()
     n = 0
     'FileSearchで抽出したMP3ファイルのアドレスを蓄積するための配列
     ReDim MusicFileAddress(n)
'②     
     'サブルーチンFileSearchで、指定したフォルダ内の全てのMP3ファイルを検索する
     FileSearch "G:\Music"
'③
     'FileSearchで検索したMP3ファイルのアドレスをセルに転記する
     Range("A2").Resize(UBound(MusicFileAddress) + 1, 1).Value  _  
  = Application.WorksheetFunction.Transpose(MusicFileAddress)
End Sub
----------------------------------------------------------------
Sub FileSearch(RootFolder As String)
     Dim myFSO As FileSystemObject
     Set myFSO = New FileSystemObject
          
     Dim myFolder  As Variant
     Dim MusicFile  As Variant
     
'FileSystemObjectでファイルの検索・抽出を行う
'④
        For Each MusicFile In myFSO.GetFolder(RootFolder).Files
'⑤
          If LCase(myFSO.GetExtensionName(MusicFile)) = "mp3" Then
               MusicFileAddress(n) = myFSO.GetFile(MusicFile).Path
               n = n + 1
               ReDim Preserve MusicFileAddress(n)
          End If
     Next

'⑥    
     '再帰処理でフォルダ内のフォルダの中身を検索
     For Each myFolder In myFSO.GetFolder(RootFolder).SubFolders
          FileSearch myFSO.GetFolder(myFolder).Path
     Next
     
     Set myFSO = Nothing
End Sub

①宣言セクションで変数を宣言することで同一モジュール内の全てのサブルーチンから使用することができ、変数の値を共有することができます。

②サブルーチンFileSearchが実際のファイル検索を行う部分になります。

引数に音楽ファイルが保存されているフォルダの最上位のフォルダを指定します。

指定したフォルダ以下の全てのフォルダの中身を検索します。

③FileSearchの検索結果は宣言部分で作成したMusicFileAddress配列に蓄積されています。

蓄積されている結果をセルに一括転記しています。

セルの範囲と配列の大きさを等しくすることで、ループ処理をすることなく1回の処理で転記できます。

④FileSystemObjectのFilesプロパティで指定したフォルダ内のファイルの一覧を取得

⑤上記④で取得したファイルのうち拡張子が”MP3"のファイルをGetExtensionName関数(指定したファイルの拡張子を返す)を利用して選別。

選別したファイルのアドレスをMusicFileAddress配列に蓄積

再帰処理でフォルダ内のフォルダの中身を全て調べていきます。

再帰処理とは「ある関数の中で自分自身の関数を呼び出す」処理です。

thom.hateblo.jp

www.excel-prog.com

https://wa3.i-3-i.info/word14899.html

今回の例ではFileSearchの中でFileSearchを呼び出すという、ちょっとわかりにくい部分が再帰処理です。

紹介したサイトにも記載されていますが、無限ループに陥ってしまいます。

僕の環境ではメモリが足りなくなることもなく、正常に思った通りの処理を実行しています。

まとめ

今回はFileSystemObjectと再帰処理を利用することでファイルの検索処理を実現することができました。

次回は今回のコードと以前にご紹介したMP3からTag情報を抽出する方法を一纏めにしてみます。

 おまけ

ファイルの検索方法では他にWindows APIのFindFirstFile関数を使う方法もあって、実は今回の例(自分のスキルも含めて)で言えば20倍程FindFirstFile関数のほうが速い。

でも僕のスキルでは何とか使えてもよく意味がわかってないところがあるのがね。