この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。旧記事の内部style_promptと重複H1を除去し、WMIを読み取り専用の資産情報収集に限定する形へ整理しました。大量PCではタイムアウトや権限エラーを前提に、1台ごとの失敗を記録して処理を継続する設計を推奨します。検証ステータス:✅ WMIクラスと読み取り構成を再確認
VBAからWMIへ接続すると、Windows PCのOS、CPU、物理メモリなどを取得できます。棚卸し用途では「取得だけ」に限定し、サービス変更やプロセス起動などの操作系処理と分離すると安全です。
取得する代表的なクラス
| 情報 | WMIクラス | 代表プロパティ |
|---|---|---|
| OS | Win32_OperatingSystem |
Caption |
| CPU | Win32_Processor |
Name |
| 物理メモリ総量 | Win32_ComputerSystem |
TotalPhysicalMemory |
最小のVBA例
Option Explicit
Sub ReadPcInfo()
Dim computer As String
Dim svc As Object
Dim items As Object
Dim item As Object
computer = Range("A2").Value
On Error GoTo Failed
Set svc = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & computer & "\root\cimv2")
Set items = svc.ExecQuery("SELECT Caption FROM Win32_OperatingSystem")
For Each item In items
Range("B2").Value = item.Caption
Next
Set items = svc.ExecQuery("SELECT Name FROM Win32_Processor")
For Each item In items
Range("C2").Value = item.Name
Exit For
Next
Set items = svc.ExecQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem")
For Each item In items
Range("D2").Value = Round(CDbl(item.TotalPhysicalMemory) / 1024 ^ 3, 2)
Exit For
Next
Range("E2").Value = "OK"
Exit Sub
Failed:
Range("E2").Value = "ERROR " & Err.Number & ": " & Err.Description
End Sub
大量PCではここを改善する
- 対象PCを配列へ読み込み、結果も配列へ貯めて最後に一括出力する。
On Error Resume Nextを広範囲に使わず、1台単位でエラーを記録する。- オフラインPCや名前解決失敗を前提にする。
- WMI/DCOMで必要なファイアウォール・権限が組織ポリシー上許可されているか確認する。
- 「ドメイン管理者で実行すればよい」とせず、棚卸しに必要な最小権限を使う。
WMIだけで全資産情報を取れるとは限らない
Microsoft Storeアプリ、ユーザー単位アプリ、クラウド管理情報などは別の取得経路が必要です。PCスペック収集とソフトウェア資産管理を一つのマクロへ詰め込まず、目的ごとに情報源を分けます。
この記事の更新履歴
- 2026-09-14 追加:代表WMIクラス、読み取り専用の最小例、最小権限とエラー記録の注意を追加。
- 2026-09-14 変更:「高速化」中心の記事から、安全なPC資産棚卸しの設計へ再構成。
- 2026-09-14 削除:内部style_prompt、本文H1、未検証ドラフト表記、ドメイン管理者利用を安易に推奨する記述、不要なSleep API宣言を削除。

