今回は以前にご紹介した以下のネタの合わせ技で、
指定したフォルダ内(サブフォルダ含む)の全てのMP3ファイルの情報を抽出、
一旦セルに全て展開してみようと思います。
合わせ技コード
早速ですが2つのネタを合わせて、多少の修正を加えたのが以下のコードです。
Dim MusicFileProperty() As Variant Dim n As Long Sub GetMusicFileProperty() n = 0 'FileSearchで抽出したMP3ファイルのアドレスを蓄積するための配列 ReDim MusicFileProperty(n) Dim StartTime As Double ’① 'サブルーチンFileSearchで、指定したフォルダ内の全てのMP3ファイルを検索する FileSearch "G:\Music\" 'FileSearchで取得したMP3ファイルのタグ情報をセルに転記する ReDim Preserve MusicFileProperty(UBound(MusicFileProperty) - 1) Range("A2").Resize(UBound(MusicFileProperty) + 1, 10).Value = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(MusicFileProperty)) 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 '拡張子がmp3のファイルのタグ情報を配列へ取り込む If LCase(myFSO.GetExtensionName(MusicFile)) = "mp3" Then MusicFileProperty(n) = Song_Property(myFSO.GetFile(MusicFile).Path) n = n + 1 ReDim Preserve MusicFileProperty(n) End If Next '再帰処理でフォルダ内のフォルダの中身を検索 For Each myFolder In myFSO.GetFolder(RootFolder).SubFolders FileSearch myFSO.GetFolder(myFolder).Path Next Set myFSO = Nothing End Sub '------------------------------------------------------------------------- Function Song_Property(MusicFilePath As String) As Variant Dim FSO As FileSystemObject Dim objShell As Variant Dim objFolder As Variant Dim i As Long Dim n As Long Dim MusicFilePropertyColumn As Variant Dim Song As Variant Dim myArray(9) As Variant Set FSO = New FileSystemObject Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.Namespace(FSO.GetFile(MusicFilePath).parentfolder & "\") Song = FSO.GetFile(MusicFilePath).Name '② MusicFilePropertyColumn = Array(14, 15, 16, 20, 21, 26, 27, 180, 195, 220) For i = 0 To 9 myArray(i) = objFolder.getdetailsof(objFolder.parsename(Song), MusicFilePropertyColumn(i)) Next i Song_Property = myArray End Function
①各自の環境に合わせて音楽フォルダを指定してください。
②MP3タグのうち必要な項目を選択して、抽出したタグ情報を配列に格納。
1つの配列の中に1曲分の情報がまとまっていて、それをSong_Property関数の返り値としています。
上記のコードを新規ブックのモジュールにコピペして、「Microsoft Scripting Runtime」 に参照設定を行えば、正常に動くと思います。
まとめ
指定したフォルダ以下のMP3ファイルからタグ情報を抽出して、セルに展開することができました。
実際に実行してみると多少の問題はあるのですが、当初予定していた動作は出来ているのでこのまま進めていこうと思います。
次回はタグ情報をセルに展開するのではなく、SQLite3データベースに取り込んでみようと思います。
おまけ
多少の問題
・抽出処理にちょっと時間がかかりすぎている(16,000件で13分)
・タグ情報が抽出できていない曲がある
気になるのでそこは原因追求・ブラッシュアップしていきたい。