はじめに
社内で配布する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)でデータを問い合わせます。
参照設定は不要です。すべてGetObjectとFor 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
FreeSpace・Sizeはバイト単位で返るため、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情報を残しておきたい場合など、応用範囲の広いテクニックです。ぜひ自分のツールにも組み込んでみてください。


コメント