MSIでインストールされたソフトウェアの情報を取得

Windowsインストーラー(MSI)でインストールされたソフトウェアの情報を取得する。

WMI(Windows Management Instrumentation)を利用してWindowsインストーラー(MSI)でインストールされたソフトウェアの情報を取得します。
VBAでWMIから情報を取得するにはSWbemLocatorオブジェクトのConnectServerメソッドを利用してコンピューター上の WMIへ接続することで取得できます。
MSIでインストールされたソフトウェアの情報は接続したWMIの Win32_Productクラス から取得します。

'************************************************************************
' MSI でインストールされたソフトウェアの一覧を取得
'************************************************************************
Sub getMSIProduct()

    '出力用シートの追加
    Dim sShtNm As String: sShtNm = "InstallList"
    Call addSheet(sShtNm)

    'SWbemLocatorオブジェクトを作成してWMIに接続
    Dim oWMI As Object
    Set oWMI = CreateObject("WbemScripting.SWbemLocator").ConnectServer
    
    'オブジェクト取得のクエリを実行
    Dim oQrySet As Object
    Set oQrySet = oWMI.ExecQuery("SELECT * FROM Win32_Product")
    
    'インストールされたソフトウェアの一覧を作成
    With Sheets(sShtNm)
        .Cells(1, 1) = "プロダクト名"
        .Cells(1, 2) = "バージョン"
        .Cells(1, 3) = "ベンダー"
        .Cells(1, 4) = "インストール日"
        .Cells(1, 5) = "識別番号"
        .Cells(1, 6) = "インストールパッケージ名"
        .Cells(1, 7) = "インストールパッケージの識別子"
    
        Dim oPRDCT As Object
        Dim i As Long
        i = 2
        For Each oPRDCT In oQrySet
            .Cells(i, 1) = oPRDCT.Name
            .Cells(i, 2) = oPRDCT.Version
            .Cells(i, 3) = oPRDCT.Vendor
            .Cells(i, 4) = oPRDCT.InstallDate
            .Cells(i, 5) = oPRDCT.IdentifyingNumber
            .Cells(i, 6) = oPRDCT.PackageName
            .Cells(i, 7) = oPRDCT.PackageCode
            i = i + 1
        Next
        End With
    
    Set oQrySet = Nothing
    
End Sub

'******************************************************************
' シートの追加
'------------------------------------------------------------------
'  第1引数:設定したいシート名
'******************************************************************
Sub addSheet(getShtNm As String)
    
    '右端にシートを追加する
    Worksheets.Add After:=Sheets(Sheets.Count)
    
    'シートの名前を設定
    On Error Resume Next
    Do While True
        ActiveSheet.Name = getShtNm
        If Err.Number = 0 Then
            Exit Do
        Else
            'シート名が重複する場合は末尾に日時を付けて対応
            getShtNm = getShtNm & "_" & Format(Now(), "yyyymmddhhmmss")
            Err.Clear
        End If
    Loop
    On Error GoTo 0

End Sub

 ■実行結果

※取得した値の一部は伏せた状態での画像になります。