[[20240910112328]] 『GetDetailsOf(shellFolder.ParseName(file.Name),』(コーデック) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


>「オブゼクト変数のまたはWithブロック変数が設定されていません。」
というエラーは絶対出ません。

(重箱の隅) 2024/09/10(火) 12:12:36


´・ω・`さん、まる2021さん  アドバイス感謝します。

コードをアドバイスに元付き変更するとエラーは出なくなりました。

但し、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


まる2021さん、 追加のアドバイスありがとうございます。

頂いたコードをチェックしてみましたが、
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

´・ω・`、まる2021さん、 追加のアドバイスありがとうございます。

>この「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.