Sub Sample1()
Dim FSO As Variant, SHell As Variant, Folder As Variant
Dim Songs As Variant, i As Long, Target As String
Songs = Application.GetOpenFilename(FileFilter:="MP3ファイル,*.mp3", MultiSelect:=True)
If Not IsArray(Songs) Then Exit Sub
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SHell = CreateObject("Shell.Application")
Set Folder = SHell.Namespace(FSO.GetFile(Songs(1)).ParentFolder.Path)
For i = 1 To UBound(Songs)
Target = FSO.GetFile(Songs(i)).Name
Cells(i, 1) = Folder.GetDetailsOf(Folder.ParseName(Target), 0)
Cells(i, 2) = Folder.GetDetailsOf(Folder.ParseName(Target), 21)
Next i
Set Folder = Nothing
Set SHell = Nothing
Set FSO = Nothing
End Sub
思いのほか長くなったので、ちょっと解説します。
最初の2行は変数の宣言。これはいいですね。
Songs = Application.GetOpenFilename(FileFilter:="MP3ファイル,*.mp3", MultiSelect:=True)
If Not IsArray(Songs) Then Exit Sub
は、MP3ファイルを選択するところです。MultiSelect:=Trueで複数選択可にしていますので、[キャンセル]ボタンがクリックされたかどうかは、返り値が配列かどうかで見ています。
続く
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SHell = CreateObject("Shell.Application")
Set Folder = SHell.Namespace(FSO.GetFile(Songs(1)).ParentFolder.Path)
は、オブジェクト(インスタンス)の生成です。最初のFSOは、おなじみのFileSystemObjectです。今回のメイン処理である「MP3のタグ情報」は、WSHのShellオブジェクトを使います。それが、CreateObject("Shell.Application")です。
Set Folder = SHell.Namespace(FSO.GetFile(Songs(1)).ParentFolder.Path)
もしかすると、他にもっと良い手があるかもしれませんが、とりあえず今回はこれで。
以上の処理を除いて、実際にタグ情報を取得しているのが下記の部分です。
Sub Sample1()
Dim FSO As Variant, SHell As Variant, Folder As Variant
Dim Songs As Variant, i As Long, Target As String
Songs = Application.GetOpenFilename(FileFilter:="MP3ファイル,*.mp3", MultiSelect:=True)
If Not IsArray(Songs) Then Exit Sub
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SHell = CreateObject("Shell.Application")
Set Folder = SHell.Namespace(FSO.GetFile(Songs(1)).ParentFolder.Path)
For i = 1 To UBound(Songs)
Target = FSO.GetFile(Songs(i)).Name
Cells(i, 1) = Folder.GetDetailsOf(Folder.ParseName(Target), 0)
Cells(i, 2) = Folder.GetDetailsOf(Folder.ParseName(Target), 21)
Next i
Set Folder = Nothing
Set SHell = Nothing
Set FSO = Nothing
End Sub
選択されたMP3ファイル群は、配列Songsに格納されています。
For i = 1 To UBound(Songs)
で、順番に選択されたファイルを取り出します。
配列Songsに格納されているのは「C:\Music\001.mp3」のようにパスを含んでいますので、
Target = FSO.GetFile(Songs(i)).Name
とファイル名(だけ)を取得して、変数Targetに格納します。
変数Targetは、このままでは単なる文字列ですから、
Folder.ParseName(Target)
として、FolderItemオブジェクトに変換します。
Sub Sample2()
Dim objShell, objFolder, i As Long
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\")
For i = 0 To 1000 ''十分に大きい数字
Debug.Print i, objFolder.GetDetailsOf("", i)
If objFolder.GetDetailsOf("", i) = "長さ" Then MsgBox "長さ:" & i
Next i
Set objFolder = Nothing
Set objShell = Nothing
End Sub