概要
指定フォルダ内のmp3ファイルのプロパティを取得します。
結果はデスクトップに「ファイルリスト_yymmdd_hhmm.xlsx」という名前で出力されます。
ソース
GetDetailsOf メソッドでプロパティを取得しています。(IDはWindows10で確認)
出力しているのは私がよく見るものだけですが、コメントにID書いてあるので、他の項目を出力したい場合はカスタマイズしてください。
Option Explicit
Option Base 1
Dim FilePaths() 'ファイルパス
Sub フォルダ内のMP3の情報を取得する()
'------------------------------------------------------------------------------
'フォルダ内のMP3の情報を取得する
'------------------------------------------------------------------------------
Dim StartTime As Date '開始時刻
StartTime = Now() '開始時刻
Dim EndTime As Date '終了時刻
Dim WSH As Variant 'WSH(Windows Scripting Host)
Dim FSO As Object 'ファイルシステムオブジェクト
Dim DefaultPath As String 'ファイルダイアログのデフォルト表示パス
Dim strFolderPath As String 'ダイアログで指定されたフォルダパス
Dim objFolder As Object 'フォルダオブジェクト
Dim objFiles As Object 'ファイルオブジェクト
Dim objF As Object 'ファイルオブジェクト用for文変数
Dim lngFileCount As Long '処理するファイル数
Dim MsgRtn As String 'メッセージボックスの返り値
Dim intDepth As Integer '階層数
Dim i As Long
Dim k As Long
Dim Shell As Object 'Shell.Application
Dim objShellFolder As Object 'Shell.Namespace
Dim xlsWorkbookOutput As Workbook '結果を出力するExcelファイル
Const strBaseName As String = "ファイルリスト" '結果を出力するファイル名の固定文字列部
Const strExtName As String = "xlsx" '結果を出力するファイル名の拡張子
Dim strDate As String '結果を出力するファイル名の日時部
Dim strOutputFileName As String '結果を出力するファイル名
Const intColHeadColer As Long = 12566463 '表見出しの色(グレー「白、背景 1、黒 + 基本色 25%」)
Dim x As Long '出力列
Dim y As Long '出力行
Dim temp As Long '一時領域(ソート用、デフォルトシート数)
'--------------------------------------
'開始メッセージ
'--------------------------------------
MsgRtn = MsgBox("処理を開始しますか?" & vbCrLf & vbCrLf, _
vbOKCancel + vbInformation, Title:="開始")
If MsgRtn = vbCancel Then Exit Sub
'--------------------------------------
'フォルダを取得
'--------------------------------------
'フォルダダイアログ
Set WSH = CreateObject("WScript.Shell")
DefaultPath = WSH.SpecialFolders("Desktop") & "\" 'デスクトップ。"\"まで入れる。
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = DefaultPath 'デフォルトフォルダをデスクトップにする
If .Show = True Then
strFolderPath = .SelectedItems(1)
End If
End With
'フォルダダイアログで「キャンセル」したので終了
If strFolderPath = "" Then Exit Sub
'フォルダ取得
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = FSO.GetFolder(strFolderPath)
'--------------------------------------
'階層数の指定
'--------------------------------------
Do
MsgRtn = InputBox("階層数を指定してください。" & vbCrLf & vbCrLf & _
"※指定したフォルダの階層を1として、何階層下まで取得するか指定します。デフォルトは1です。", _
"階層数の指定", 1)
'キャンセル
If MsgRtn = "" Then
Exit Sub
End If
'数字
If IsNumeric(MsgRtn) = True Then
'0以下
If MsgRtn <= 0 Then
'もう1度入力
MsgBox "1以上の数値を入力してください。", _
vbOKOnly + vbExclamation, Title:="エラー"
'5以上
ElseIf MsgRtn >= 5 Then
intDepth = CInt(MsgRtn)
MsgRtn = MsgBox(MsgRtn & " 階層が指定されました。ファイルが多い場合には時間がかかりますが、続行しますか?", _
vbOKCancel + vbInformation, Title:="5階層以上指定")
If MsgRtn = vbOK Then
Exit Do
End If
'それ以外
Else
intDepth = CInt(MsgRtn)
Exit Do
End If
'数字以外
Else
MsgBox "1以上の数値を入力してください。", _
vbOKOnly + vbExclamation, Title:="エラー"
End If
Loop
'--------------------------------------
'ファイルリスト取得
'--------------------------------------
Erase FilePaths 'ファイルリスト用変数を初期化
'ファイルリスト取得を呼び出す
GetMP3FileList objFolder, intDepth, 0
On Error Resume Next
lngFileCount = UBound(FilePaths) 'ファイルが1つもない場合UBoundがエラーになる
If Err.Number <> 0 Then
'終了メッセージ
MsgBox "指定されたフォルダにはファイルが1つもないので、終了します。", _
vbOKOnly + vbExclamation, Title:="エラー"
Exit Sub
End If
On Error GoTo 0
'--------------------------------------
'ファイルパスをソート
'--------------------------------------
For i = 1 To lngFileCount
For k = lngFileCount To 1
If FilePaths(i) > FilePaths(k) Then
temp = FilePaths(i)
FilePaths(i) = FilePaths(k)
FilePaths(k) = temp
End If
Next k
Next i
'--------------------------------------
'出力ファイル作成
'--------------------------------------
'カーソル砂時計表示
Application.Cursor = xlWait
'新規ブック作成
temp = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
Set xlsWorkbookOutput = Workbooks.Add
Application.SheetsInNewWorkbook = temp
'シート名
xlsWorkbookOutput.ActiveSheet.Name = "ファイルリスト"
'フォント
xlsWorkbookOutput.Styles("Normal").Font.Name = "MS ゴシック"
'ルートフォルダ名をA1に出力
With xlsWorkbookOutput.ActiveSheet.Cells(1, 1)
.NumberFormatLocal = "@"
.Value = strFolderPath
End With
'列の幅・見出し設定
x = 3
y = 1
xlsWorkbookOutput.ActiveSheet.Columns(1).ColumnWidth = 4
xlsWorkbookOutput.ActiveSheet.Columns(2).ColumnWidth = 30
xlsWorkbookOutput.ActiveSheet.Columns(3).ColumnWidth = 70
xlsWorkbookOutput.ActiveSheet.Columns(4).ColumnWidth = 8
xlsWorkbookOutput.ActiveSheet.Columns(5).ColumnWidth = 9
xlsWorkbookOutput.ActiveSheet.Columns(6).ColumnWidth = 8
xlsWorkbookOutput.ActiveSheet.Columns(7).ColumnWidth = 40
xlsWorkbookOutput.ActiveSheet.Columns(8).ColumnWidth = 25
xlsWorkbookOutput.ActiveSheet.Columns(9).ColumnWidth = 25
xlsWorkbookOutput.ActiveSheet.Columns(10).ColumnWidth = 6
xlsWorkbookOutput.ActiveSheet.Columns(11).ColumnWidth = 20
xlsWorkbookOutput.ActiveSheet.Cells(x, 1) = "No"
xlsWorkbookOutput.ActiveSheet.Cells(x, 2) = "サブフォルダ"
xlsWorkbookOutput.ActiveSheet.Cells(x, 3) = "ファイル名"
xlsWorkbookOutput.ActiveSheet.Cells(x, 4) = "サイズ(MB)"
xlsWorkbookOutput.ActiveSheet.Cells(x, 4).ShrinkToFit = True '縮小して全体を表示する
xlsWorkbookOutput.ActiveSheet.Cells(x, 5) = "長さ"
xlsWorkbookOutput.ActiveSheet.Cells(x, 6) = "トラック番号"
xlsWorkbookOutput.ActiveSheet.Cells(x, 6).ShrinkToFit = True '縮小して全体を表示する
xlsWorkbookOutput.ActiveSheet.Cells(x, 7) = "タイトル"
xlsWorkbookOutput.ActiveSheet.Cells(x, 8) = "参加アーティスト"
xlsWorkbookOutput.ActiveSheet.Cells(x, 9) = "アルバム"
xlsWorkbookOutput.ActiveSheet.Cells(x, 10) = "年"
xlsWorkbookOutput.ActiveSheet.Cells(x, 11) = "ジャンル"
'サイズ(MB)の書式
xlsWorkbookOutput.ActiveSheet.Columns("D:D").NumberFormatLocal = "0.0_ "
'表見出しの背景色
xlsWorkbookOutput.ActiveSheet.Range(Cells(x, 1), Cells(x, 11)).Interior.Color = intColHeadColer
'印刷設定
Application.PrintCommunication = False
With xlsWorkbookOutput.ActiveSheet.PageSetup
.PrintTitleRows = "$1:$3"
.CenterFooter = "&P"
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
Application.PrintCommunication = True
'--------------------------------------
'出力ファイル保存
'--------------------------------------
strDate = Format(Now(), "_yymmdd-hhmm")
strOutputFileName = strBaseName & strDate
i = 0
Do
If FSO.FileExists(DefaultPath & "\" & strOutputFileName & "." & strExtName) = False Then
Exit Do
Else
'ファイル名
i = i + 1
strOutputFileName = strBaseName & strDate & "_" & i
End If
Loop
'ファイルを保存
xlsWorkbookOutput.SaveAs Filename:=DefaultPath & strOutputFileName & "." & strExtName
'--------------------------------------
'MP3の情報取得して出力
'--------------------------------------
Set Shell = CreateObject("Shell.Application")
For i = 1 To lngFileCount
'ファイルを保存(入力20ファイルごとに出力ファイルを保存)
If i Mod 20 = 0 Then
xlsWorkbookOutput.Save
End If
'ステータスバー表示
Application.StatusBar = Left(Format(i / lngFileCount, "0.0%") & " (" & i & "/" & lngFileCount & ") " & FilePaths(i), 125)
DoEvents
'--------------------------------------
'結果をExcelに出力
'--------------------------------------
'出力行
x = x + 1
'No
xlsWorkbookOutput.ActiveSheet.Cells(x, y) = i
'フォルダ名(ルートフォルダは出力しない)
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 1).NumberFormatLocal = "@"
If FSO.GetParentFolderName(FilePaths(i)) = strFolderPath Then
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 1) = Replace(FSO.GetParentFolderName(FilePaths(i)), strFolderPath, "")
Else
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 1) = Replace(FSO.GetParentFolderName(FilePaths(i)), strFolderPath & "\", "")
End If
'ファイル名
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 2).NumberFormatLocal = "@"
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 2) = FSO.GetFilename(FilePaths(i))
'サイズ(MB)
If FSO.GetFile(FilePaths(i)).Size > 0 Then
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 3) = FSO.GetFile(FilePaths(i)).Size / 1024 / 1024
End If
' xlsWorkbookOutput.ActiveSheet.Cells(x, y + 3) = & FileLen(FilePaths(i)) /1024/1024 'ファイル名に日本語または英語以外が含まれるとサイズ取得がエラーになる(例:フランス語のアクサン記号とか)
Set objShellFolder = Shell.Namespace(FSO.GetParentFolderName(FilePaths(i)))
With objShellFolder
'GetDetailsOfのID(Windows 10の場合)
'0,名前
'1,サイズ
'2,項目の種類
'3,更新日時
'4,作成日時
'5,アクセス日時
'6,属性
'7,オフラインの状態
'8,利用可能性
'9,認識された種類
'10,所有者
'11,分類
'12,撮影日時
'13,参加アーティスト
'14,アルバム
'15,年
'16,ジャンル
'17,指揮者
'18,タグ
'19,評価
'20,作成者
'21,タイトル
'22,件名
'23,分類項目
'24,コメント
'25,著作権
'26,トラック番号
'27,長さ
'28,ビット レート
'29,保護
'30,カメラのモデル
'31,大きさ
'32,カメラの製造元
'33,会社
'34,ファイルの説明
'35,マスター キーワード
'36,マスター キーワード
':(37以降もあるが、使わないと思われるので、ここまで)
'長さ
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 4) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 27)
'トラック番号
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 5) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 26)
'タイトル
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 6) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 21)
'参加アーティスト
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 7) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 13)
'アルバム
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 8) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 14)
'年
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 9) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 15)
'ジャンル
xlsWorkbookOutput.ActiveSheet.Cells(x, y + 10) = .GetDetailsOf(.ParseName(FSO.GetFilename(FilePaths(i))), 16)
End With
Set objShellFolder = Nothing
Next i
'--------------------------------------
'終了
'--------------------------------------
'ステータスバー表示デフォルト
Application.StatusBar = False
'カーソル砂時計表示
Application.Cursor = xlDefault
'ファイルを保存
xlsWorkbookOutput.Save
'ウィンドウアクティブ
AppActivate Application.Caption
'終了メッセージ
EndTime = Now() '終了時刻
MsgBox "終了しました。" & vbLf & vbLf & _
"処理時間:" & Format(EndTime - StartTime, "hh:mm:ss") & vbLf & _
"出力ファイル:" & DefaultPath & xlsWorkbookOutput.Name & vbCrLf & vbCrLf, _
vbOKOnly + vbInformation, Title:="終了"
'オブジェクトクリア
Set WSH = Nothing
Set FSO = Nothing
Set objFolder = Nothing
Set objFiles = Nothing
Set objF = Nothing
Set xlsWorkbookOutput = Nothing
Set Shell = Nothing
Set objShellFolder = Nothing
End Sub
Sub GetMP3FileList(objFolder As Object, intDepth As Integer, lngFileCount As Long)
'--------------------------------------
'ファイルリスト取得(再帰呼び出し)
' 結果はモジュールレベル変数「FilePaths」に格納
'--------------------------------------
Dim objSubFolder As Object 'サブフォルダ
Dim objFiles As Object 'ファイル
Dim objF As Object '変数
Dim intNextDepth As Integer '次の階層数
Dim i As Long
Dim FSO As Object 'ファイルシステムオブジェクト
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objSubFolder = objFolder.subFolders
Set objFiles = objFolder.Files
intNextDepth = intDepth - 1
'フォルダ配下
'objSubFolder.Countがとれない特殊フォルダは配下ごと無視
On Error Resume Next
i = objSubFolder.Count
If Err.Number = 0 Then
If objSubFolder.Count > 0 Then
For Each objF In objSubFolder
If intNextDepth > 0 Then
'再帰呼び出し
GetMP3FileList objF, intNextDepth, lngFileCount
End If
Next objF
End If
End If
'ファイル
If objFiles.Count > 0 Then
For Each objF In objFiles
If objF Is Nothing Then
'システム系でNothingが返ってくることがあるので飛ばす
ElseIf Left(objF.Name, 2) = "~$" Then
'~$で始まる一時ファイルは後のページ数取得がエラーになるので飛ばす
ElseIf Left(objF.Name, 1) = "$" Then
'$で始まるファイルは後のページ数取得がエラーになるので飛ばす
ElseIf LCase(FSO.GetExtensionName(objF.Name)) = "mp3" Then
'ファイルカウント
lngFileCount = lngFileCount + 1
'ファイルパスを取得するための動的配列を定義
If lngFileCount = 1 Then
ReDim FilePaths(lngFileCount)
Else
ReDim Preserve FilePaths(lngFileCount)
End If
'ファイルパスを配列に格納
FilePaths(lngFileCount) = objF
Else
'他のファイルは読まない
End If
Next objF
End If
Set objSubFolder = Nothing
Set objFiles = Nothing
Set objF = Nothing
End Sub
補足
2021/7/31 380行目のコード(再帰呼び出しのメソッド名)が誤っていましたので、修正しました。ご報告いただいた方、ご連絡ありがとうございました。

