【ExcelVBA・マクロ】WMIでPCのCPU・メモリ・ディスク情報を取得する方法|GetObject(“winmgmts:”)の使い方【コピペOK】

ExcelVBA

はじめに

社内で配布するExcelツールを作っていると、「実行しているPCのスペックによって処理を分岐させたい」「動作環境の情報をログに残しておきたい」といった場面に出会うことがあります。Environ関数を使えばユーザー名やコンピューター名は取得できますが、CPUの使用率やメモリの空き容量、ディスクの空き容量までは取得できません。

この記事では、WMI(Windows Management Instrumentation)をVBAから利用して、PCのCPU・メモリ・ディスク情報を取得する方法を解説します。既存記事の「Environ関数の使い方」とは異なり、OSやハードウェアのより詳細な情報を取得できるのが特徴です。

この記事を読むと以下のことが分かります。

  • WMIの基本的な使い方(GetObject("winmgmts:")
  • CPU名・CPU使用率を取得する方法
  • メモリの合計容量・空き容量を取得する方法
  • ディスクの空き容量を取得する方法
  • 取得した情報をまとめてメッセージボックスに表示する方法

WMIとは

WMI(Windows Management Instrumentation)は、Windowsに標準搭載されている管理機能で、CPU・メモリ・ディスク・ネットワークなど、PCに関するさまざまな情報を取得できます。VBAからはGetObject("winmgmts:")でWMIに接続し、SQLに似た構文(WQL)でデータを問い合わせます。

参照設定は不要です。すべてGetObjectFor Eachだけで完結します。

CPU情報を取得する

まずはCPU名と現在の使用率を取得してみましょう。

Sub GetCpuInfo()
    Dim objWMI As Object
    Dim colItems As Object
    Dim objItem As Object

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_Processor")

    For Each objItem In colItems
        Debug.Print "CPU名: " & objItem.Name
        Debug.Print "使用率: " & objItem.LoadPercentage & "%"
    Next objItem
End Sub
スポンサーリンク
スポンサーリンク

コードの解説

  • GetObject("winmgmts:\\.\root\cimv2")で、ローカルPC(.)のWMI名前空間(root\cimv2)に接続します。
  • objWMI.ExecQuery("SELECT * FROM Win32_Processor")で、CPU情報を持つWin32_Processorクラスからすべてのプロパティを取得します。複数のCPU(コア単位)を搭載している場合はコレクションに複数件返ることがあるため、For Eachでループしています。
  • LoadPercentageは、そのCPUの直近の使用率(%)を表します。

メモリ情報を取得する

メモリの合計容量・空き容量は、OS情報を持つWin32_OperatingSystemクラスから取得できます。値の単位はキロバイト(KB)なので、メガバイト(MB)に変換して表示します。

Sub GetMemoryInfo()
    Dim objWMI As Object
    Dim colItems As Object
    Dim objItem As Object
    Dim totalMemMB As Double
    Dim freeMemMB As Double

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")

    For Each objItem In colItems
        totalMemMB = objItem.TotalVisibleMemorySize / 1024
        freeMemMB = objItem.FreePhysicalMemory / 1024

        Debug.Print "合計メモリ: " & Format(totalMemMB, "#,##0") & " MB"
        Debug.Print "空きメモリ: " & Format(freeMemMB, "#,##0") & " MB"
    Next objItem
End Sub

TotalVisibleMemorySizeが搭載メモリの合計、FreePhysicalMemoryが現在の空きメモリです。どちらもKB単位で返ってくるため、/ 1024でMBに変換しています。

ディスクの空き容量を取得する

ディスク情報はWin32_LogicalDiskクラスから取得します。WHERE DriveType=3と条件を付けることで、ハードディスク・SSD(固定ディスク)だけに絞り込めます。

Sub GetDiskInfo()
    Dim objWMI As Object
    Dim colItems As Object
    Dim objItem As Object
    Dim freeGB As Double
    Dim totalGB As Double

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3")

    For Each objItem In colItems
        freeGB = objItem.FreeSpace / 1024 ^ 3
        totalGB = objItem.Size / 1024 ^ 3

        Debug.Print objItem.DeviceID & " 空き容量: " & Format(freeGB, "#,##0.0") & " GB / " & _
                    "合計: " & Format(totalGB, "#,##0.0") & " GB"
    Next objItem
End Sub

FreeSpaceSizeはバイト単位で返るため、1024 ^ 3(1GB)で割ってギガバイトに変換しています。DeviceIDにはドライブレター(C:など)が入ります。

まとめて情報を表示する

ここまでの処理を1つにまとめて、メッセージボックスで一覧表示するマクロです。

Sub ShowSystemInfo()
    Dim objWMI As Object
    Dim colItems As Object
    Dim objItem As Object
    Dim msg As String

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")

    ' CPU情報
    Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_Processor")
    For Each objItem In colItems
        msg = msg & "CPU: " & objItem.Name & vbCrLf
        msg = msg & "CPU使用率: " & objItem.LoadPercentage & "%" & vbCrLf
        Exit For   ' 1つ目のCPU情報のみ表示
    Next objItem

    ' メモリ情報
    Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
    For Each objItem In colItems
        msg = msg & "合計メモリ: " & Format(objItem.TotalVisibleMemorySize / 1024, "#,##0") & " MB" & vbCrLf
        msg = msg & "空きメモリ: " & Format(objItem.FreePhysicalMemory / 1024, "#,##0") & " MB" & vbCrLf
    Next objItem

    ' ディスク情報
    Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3")
    For Each objItem In colItems
        msg = msg & objItem.DeviceID & " 空き: " & Format(objItem.FreeSpace / 1024 ^ 3, "#,##0.0") & " GB" & vbCrLf
    Next objItem

    MsgBox msg, vbInformation, "システム情報"
End Sub

Exit ForでCPU情報のループを1件目だけで抜けているのは、コア数によってはWin32_Processorが複数件返ってくることがあるためです。すべてのCPU情報を表示したい場合はExit Forを削除してください。

注意点

  • WMIへの問い合わせは、通常のセル操作に比べて時間がかかることがあります。ループの中で何度も呼び出すのではなく、必要な情報をまとめて1度だけ取得するようにしましょう。
  • LoadPercentageは取得するタイミングによって値が変動します。正確な使用率が必要な場合は、複数回取得して平均を取るなどの工夫が必要です。
  • セキュリティソフトやグループポリシーの設定によっては、WMIへのアクセスが制限されている環境もあります。社内で配布するツールに組み込む場合は、事前に対象PCでの動作確認をおすすめします。

まとめ

この記事では、WMIを使ってPCのCPU・メモリ・ディスク情報を取得する方法を紹介しました。

  • GetObject("winmgmts:\\.\root\cimv2")でWMIに接続できる
  • Win32_ProcessorでCPU名・使用率を取得できる
  • Win32_OperatingSystemでメモリの合計・空き容量を取得できる
  • Win32_LogicalDiskでディスクの空き容量を取得できる

実行環境のスペックによって処理を分岐させたい場合や、動作ログにPC情報を残しておきたい場合など、応用範囲の広いテクニックです。ぜひ自分のツールにも組み込んでみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました