[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『GetDetailsOf(shellFolder.ParseName(file.Name), 316) でエラーが』(コーデック)
フォルダーをダイアログで指定して、その中の動画ファイル名と
それぞれの映像コーデック名を調べて書き出すEXCELのVBAのコードを考えてみました。
以下のコードで
「実行エラー 91」
「オブゼクト変数のまたはWithブロック変数が設定されていません。」
が出ます。
Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 316)
考えられる原因は、何でしょうか ?
Sub GetVideoCodecs()
Dim fso As Object Dim folder As Object Dim file As Object Dim shell As Object Dim shellFolder As Object Dim folderPath As String Dim row As Long
' フォルダー選択ダイアログを表示 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "動画ファイルが含まれるフォルダーを選択してください" .AllowMultiSelect = False If .Show = -1 Then folderPath = .SelectedItems(1) Else Exit Sub End If End With
' オブジェクトの初期化 Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(folderPath) Set shell = CreateObject("Shell.Application") Set shellFolder = shell.Namespace(folderPath)
' シートのクリア Cells.Clear
' ヘッダーの設定 Cells(1, 1).Value = "ファイル名" Cells(1, 2).Value = "映像コーデック"
row = 2
' フォルダー内のファイルを処理 For Each file In folder.Files ' 動画ファイルの拡張子をチェック(必要に応じて追加) If LCase(Right(file.Name, 4)) = ".mp4" Or _ LCase(Right(file.Name, 4)) = ".avi" Or _ LCase(Right(file.Name, 4)) = ".mov" Or _ LCase(Right(file.Name, 4)) = ".wmv" Then
' ファイル名を A 列に書き込み Cells(row, 1).Value = file.Name
' 映像コーデックを B 列に書き込み 'Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、 '参照設定ダイアログでMicrosoft Shell Controls And Automationのチェックボックスにチェックの事 Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 316)
row = row + 1 End If Next file
' オブジェクトの解放 Set shellFolder = Nothing Set shell = Nothing Set folder = Nothing Set fso = Nothing
MsgBox "処理が完了しました。", vbInformation End Sub
< 使用 Excel:Excel2021、使用 OS:Windows11 >
とりあえず、以下の2点を変更してみてください。
Set shellFolder = shell.Namespace(folderPath) → Set shellFolder = shell.Namespace(Trim(folderPath))
Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 316) → Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Path), 316) (´・ω・`) 2024/09/10(火) 12:02:25
Dim folderPath As String を Dim folderPath As Variant に変えてみて下さい。
(まる2021) 2024/09/10(火) 12:06:57
(重箱の隅) 2024/09/10(火) 12:12:36
コードをアドバイスに元付き変更するとエラーは出なくなりました。
但し、AIに聞いて作成した「映像コーデック」を書き込むコード
shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 316)
では、B列に「バージョンの状態」の文字列が全て書き込まれているので
パラメーターの「316」は違っているようです。
「映像コーデック」を調べるコードや情報をお持ちなら教えて下さい。
(コーデック) 2024/09/10(火) 13:17:26
316というマジックナンバーはOSバージョンによって異なります。 あなたの望む「映像コーデック」が取得できるかどうかは存じませんが 以下で番号に対する「項目名」が取得できます。 "c:\windows"のドライブ名は環境に応じて変更してください。
Sub 詳細表示時の列項目を列挙() Dim oShell As Object Dim oFolder As Object Dim i&, dirName dirName = "c:\windows" Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.Namespace(dirName) For i = 0 To 500 Cells(i + 1, 1) = i Cells(i + 1, 2) = oFolder.GetDetailsOf(Nothing, i) Next Set oFolder = Nothing Set oShell = Nothing End Sub
望むものがなければ、Windows プロパティ システムで試してみるとか...
https://learn.microsoft.com/ja-jp/windows/win32/properties/video-bumper
(まる2021) 2024/09/10(火) 13:44:26
頂いたコードをチェックしてみましたが、
316 は、 「バージョンの状態」と表示されていました。
他の番号で「コーデック」なる文字列は無いので
私が調べた方法は、全く的はずれなようです。
「Windows プロパティ システム」を見てみましたが
「コーデック」は見当たらないので他のアプローチが必要なようです。
例えば、以下のような方法とか ?
https://ameblo.jp/hiromi-0505/entry-12570644470.html
記事内に
「ファイルの数だけDOS窓が起動して消えていきます。」
と有るのファイル数が多いので出来ればこの方法は使いたくないです。
(コーデック) 2024/09/10(火) 14:19:58
動画について、詳しくありませんが「映像コーデック」というのは映像の圧縮方式の事でしょ。 当方の環境(Windows10)ではFolderオブジェクトのGetDetailsOfメソッドに「311」(ビデオ圧縮)を指定して レジストリからクラスIDを辿ることで「Microsoft H264 Video Decoder MFT」という結果は得られました。(「.mp4」形式の動画) この「H264」が映像コーデックじゃないんですか?
どんな結果が欲しいのか具体的に列挙できますか? そうすれば、より詳しい人から回答があるかもしれません。
(まる2021) 2024/09/10(火) 15:16:28
>(´・ω・`) 2024/09/10(火) 12:02:25 はダメでしたね。すみません。 ○Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 316) ×Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Path), 316) です。
私の環境(Windows11) では、ビデオ圧縮 は317 でした。 結果、 {34363248-0000-0010-8000-00AA00389B71} の様な文字列(GUID)が得られ、 https://gix.github.io/media-types/ と照合すると H264 であると判断できました。 (´・ω・`) 2024/09/10(火) 16:23:27
>この「H264」が映像コーデックじゃないんですか?
そうです。
「コーデック」では無く、「ビデオ圧縮」なのですね。
私の環境(Win11_Pro)でもビデオ圧縮 は317 でした。
以下に変更して
Cells(row, 2).Value = shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 317)
F8でコードを進めて行くと
For Each file In folder.Files
の次に
If LCase(Right(file.Name, 4)) = ".mp4" Or _
に行くはずが
Set shellFolder = Nothing
に処理が飛んでしまいます。
folder.pathはローカルウインドウでは、ターゲットのフォルダー名が表示されています。
今までは、「13:17:26」の時点ではA列にファイル名が表示されていたので
If LCase(Right(file.Name, 4)) = ".mp4" Or _
は判断されていたのに不思議です。
(コーデック) 2024/09/10(火) 16:52:49
当初のエラーの原因は遅延バインディングに起因するもので、ご自身のコード中のコメントにある参照設定を行って、 事前バインディングで各オブジェクトをきちんと型指定すれば発生しないはずです。
参考に..自分が試したコードは以下です。元のコードはほぼ、コーデックさんのものと同じです。 又、自分の環境(Win10)では「ビデオ圧縮」は「311」でしたがWin11では「317」のようなので修正してます。 前回に、指摘しましたがこの「311や317」はOSによって違う可能性があるので、 先にあげたWindowsプロパティシステムの「System.Video.Compression」プロパティから取得することでOSの違いは吸収できます。 後は、ffmpegやmediainfoのようなコマンドラインから利用できる外部ライブラリを利用する手もありです。ご自身で調査してみてください。 これにて、退席します。
Function GetVideoCompression$(ByVal clsID$) Static oShell As Object Dim strKey$, strValue$ On Error GoTo ErrProc If oShell Is Nothing Then Set oShell = CreateObject("WScript.Shell") strKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MediaFoundation\Transforms\Preferred\" & clsID strValue = oShell.RegRead(strKey) strKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\" & strValue & "\" strValue = oShell.RegRead(strKey) GetVideoCompression = strValue Exit Function ErrProc: GetVideoCompression = "" End Function Sub GetVideoCodecs() Dim fso As Object Dim folder As Object Dim file As Object Dim shell As Object Dim shellFolder As Object Dim folderPath Dim row As Long ' フォルダー選択ダイアログを表示 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "動画ファイルが含まれるフォルダーを選択してください" .AllowMultiSelect = False If .Show = -1 Then folderPath = .SelectedItems(1) Else Exit Sub End If End With ' オブジェクトの初期化 Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(folderPath) Set shell = CreateObject("Shell.Application") Set shellFolder = shell.Namespace(folderPath) ' シートのクリア Cells.Clear ' ヘッダーの設定 Cells(1, 1).Value = "ファイル名" Cells(1, 2).Value = "映像コーデック" row = 2 ' フォルダー内のファイルを処理 For Each file In folder.Files ' 動画ファイルの拡張子をチェック(必要に応じて追加) If LCase(Right(file.Name, 4)) = ".mp4" Or _ LCase(Right(file.Name, 4)) = ".avi" Or _ LCase(Right(file.Name, 4)) = ".mov" Or _ LCase(Right(file.Name, 4)) = ".wmv" Then ' ファイル名を A 列に書き込み Cells(row, 1).Value = file.Name ' 映像コーデックを B 列に書き込み 'Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、 '参照設定ダイアログでMicrosoft Shell Controls And Automationのチェックボックスにチェックの事 Cells(row, 2).Value = GetVideoCompression(shellFolder.GetDetailsOf(shellFolder.ParseName(file.Name), 317)) 'Win10=>311 row = row + 1 End If Next file ' オブジェクトの解放 Set shellFolder = Nothing Set shell = Nothing Set folder = Nothing Set fso = Nothing MsgBox "処理が完了しました。", vbInformation End Sub (まる2021) 2024/09/10(火) 17:48:21
指定フォルダーが間違っていました。
正規のフォルダーを指定したら「ガイド」の
{34363248-0000-0010-8000-00AA00389B71}
が表示されたので
以下のように変更する必要があり、どうすべきか?
{34363248-0000-0010-8000-00AA00389B71} (MFVideoFormat_H264)
考慮中です。
(コーデック) 2024/09/10(火) 18:28:15
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.