VBA技術解説
VBAでWMIの使い方について

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2020-04-06 最終更新日:2020-04-06

VBAでWMIの使い方について


WMIは、Windows Management Instrumentation の略になります。
マイクロソフトが実装したWindowsシステムを管理するためのインターフェイスです。
WMIは、Windows管理技術の中核を担っていて、ローカルコンピュータとリモートコンピュータの両方の管理に使用できます。
・・・
これは非常に難しく、筆者では詳しく説明することがきません。
Microsoftでは以下のように説明されています。、

WindowsManagementInstrumentation(WMI)は、Windows管理技術の中核を担っています。
WMIは、ローカルコンピュータとリモートコンピュータの両方の管理に使用できます。
WMIは、プログラミング言語やスクリプト言語で日常的な管理タスクを実行するための一貫したアプローチを提供します。
たとえば、次のようなことが可能です。

・リモートコンピュータ上のプロセスを起動できます。
・特定の日時にプロセスを実行するようにスケジュールを設定できます。
・コンピュータをリモートで再起動できます。
・ローカルコンピュータまたはリモートコンピュータにインストールされているアプリケーションのリストを取得できます。
・ローカルコンピュータまたはリモートコンピュータ上のWindowsイベントログを照会できます。

本稿では、VBAでのWMIの使い方の概要と、頻繁に使われそうなものの一部のVBAの実際のサンプルコードを提示します。
また、プロパティ値の取得のみを扱い、メソッドについてはほぼ触れていません。
本稿は自身の覚え書きとして、実際に使用する時に少しでも参考になれば良いだろうという趣旨です。
WMIの詳細については、以下のサイトに詳しく書かれていますので、是非ご覧ください。


WMIを調べるときの推奨サイト

httpサイトなので、リンクせずにURL掲載にしています。

トップページ
WMI Fun !! ~ WMI (Windows Management Instrumentation) に興味がある方・システム管理者は必見です! ~
http://www.wmifun.net/
WMI Library
WMI Library ~ WMI 各クラス情報 (プロパティやメソッド) のご紹介 ~
http://www.wmifun.net/library/

上記サイトには、ありとあらゆるWMIが掲載されています。
膨大な数が掲載されていますので、とても紹介できませんし、その意味もありません。
以下では具体的な使い方について説明し、上記サイトを補足する形でVBAを掲載します。

VBAでのWMI使用方法

事前バインディング

参照設定
Microsoft WMI Scripting V1.2 Library
VBA変数宣言方法
Dim WMI As New WbemScripting.SWbemLocator

Dim WMI As Object
Set WMI = New WbemScripting.SWbemLocator

With New WbemScripting.SWbemLocator
  '・・・
End With

遅延(実行時)バインディング

VBA変数宣言方法
Dim WMI As Object
Set WMI = CreateObject("WbemScripting.SWbemLocator")

With CreateObject("WbemScripting.SWbemLocator")
  '・・・
End With

VBA使用例

プリンター一覧
Dim WMI As Object
Set WMI = CreateObject("WbemScripting.SWbemLocator")

Dim oService As Object
Set oService = WMI.ConnectServer

Dim oClassSet As Object
Set oClassSet = oService.ExecQuery("SELECT * FROM Win32_Printer")

Dim oClass As Object
For Each oClass In oClassSet
  Debug.Print "プリンタ名前:" & oClass.Caption
  Debug.Print "ドライバー名:" & oClass.DriverName
  Debug.Print "プリンタのポート:" & oClass.PortName
  Debug.Print "デフォルトプリンタ:" & oClass.Default
  Debug.Print ""
Next

Set oClass = Nothing
Set oClassSet = Nothing
Set oService = Nothing
Set WMI = Nothing

イミディエイトにプリンター情報が出力されます。
順にオブジェクト変数に入れて、細部を確認しやすいVBAにしています。

VBAでWMIを使うのは、PCやOSの特定の情報取得がほとんどでしょう。
また、使いまわすことも多くなるはずです。
この場合は、遅延(実行時)バインディンクの方が使いやすいでしょう。
かつ、よりVBAコードは短い方が便利だと思いますので、
以下のように適宜Withを使うとVBAが簡潔になります。

Dim oClass As Object
With CreateObject("WbemScripting.SWbemLocator").ConnectServer
  For Each oClass In .ExecQuery("SELECT * FROM Win32_Printer")
    Debug.Print "プリンタ名前:" & oClass.Caption
    Debug.Print "ドライバー名:" & oClass.DriverName
    Debug.Print "プリンタのポート:" & oClass.PortName
    Debug.Print "デフォルトプリンタ:" & oClass.Default
    Debug.Print ""
  Next
End With

取得するデータが1件だけの場合
取得されるデータが1件しかない、または1件だけで良い場合は、
以下のように極めて短いVBAコードで済みます。

With CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery("Select * From Win32_Processor")
  Debug.Print .ItemIndex(0).Name
End With

プロセッサ名を出力しています。
Withも省略して1ステートメントにもできますが、さすがに横に長くなりすぎてしまいますし、ここはWithを使ったほうが良いでしょう。

WMIにはどんなものがあるのか

VBAでWMIを使う上で必要な情報は、
・Query文字列
・プロパティ名
これらが分かれば良いだけになります。
Query文字列のFromの後ろがWMIクラスになります。
つまり、クラスさえわかれば先のサイト(WMI Fun !!)を見ればプロパティが掲載されているのでVBAで使う事が出来ます。

しかし、そもそも、WMIにはどんな情報があるのかが分からないですよね。
WMIには、膨大な数がありますので、その一覧から調べることは困難でしょう。
ほんの一部ですが、良く使われる有名なものとして以下があります。

Win32_Process プロセスの一覧。
Win32_NetworkAdapterConfiguration ネットワーク アダプターの一覧。
Win32_OperatingSystem オペレーティング システム(OS)の情報
Win32_Printer プリンターの一覧
Win32_ComputerSystem PCのメーカ、型番等の情報
Win32_Processor CPUの情報
Win32_LogicalDisk ディスクの空き容量等の情報
Win32_NetworkAdapter ネットワーク アダプターの一覧
Win32_PnPEntity プラグ アンド プレイ デバイスの一覧
Win32_Service サービスの一覧
Win32_UserAccount ユーザー アカウントの一覧
Win32_Product MSI でインストールされた製品一覧
Win32_ScheduledJob スケジュールされたジョブの一覧
Win32_BIOS BIOSの情報

それぞれに多数のプロパティ・メソッドがありますので、それらは使用するときに個別に調べてください。
以下については、Win32_とは異質のものになりますの、使い方も違ってきます。

StdRegProv システム レジストリと対話するメソッドを含みます。
ユーザーのアクセス許可の確認
レジストリの作成、列挙、および削除の実行
名前を付けた値の作成、列挙、および削除
データ値の読み取り、書き込み、および削除
以下にサンプルが掲載されています。
http://officetanaka.net/excel/vba/tips/tips88.htm
CIM_DataFile CimWin32.dllに実装されたクラスをサポートします。
フォルダ内のファイル名やファイル情報の一覧を取得できます。
SQLにドライブやフォルダをWhereで指定します。
以下にサンプルが掲載されています。
https://www.moug.net/tech/exvba/0060092.html

どちらも、VBAでそんなに必要性があるとは思えませんが、一応情報として掲載しておきます。



同じテーマ「マクロVBA技術解説」の記事

VBAで電光掲示板を作成
ユーザーに絶対に停止させたくない場合のVBA設定
列幅・行高をDPI取得しピクセルで指定する
VBAでWMIの使い方について
アクティブシート以外のWindowを設定できるWorksheetView
LSetとユーザー定義型のコピー(100桁の足し算)
省略可能なVariant引数の参照不可をラップ関数で利用
ブックのいろいろな開き方(GetObject,参照設定,アドイン)
入力規則への貼り付けを禁止する
Select Caseでの短絡評価(ショートサーキット)の使い方
RangeオブジェクトのFor EachとAreasについて


新着記事NEW ・・・新着記事一覧を見る

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ