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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日: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技術解説」の記事

Rangeオブジェクトの論理演算(差集合と排他的論理和)
VBAで写真の撮影日時や音楽動画の長さを取得する
VBAでWindowsMediaPlayerを使い動画再生する
VBAでWEBカメラ操作する
VBAで電光掲示板を作成
ユーザーに絶対に停止させたくない場合のVBA設定
列幅・行高をDPI取得しピクセルで指定する
VBAでWMIの使い方について
アクティブシート以外の表示(Window)に関する設定
LSetとユーザー定義型のコピー(100桁の足し算)
省略可能なVariant引数の参照不可をラップ関数で利用


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

多階層フォルダ(ディレクトリ)の作成|VBAサンプル集(7月31日)
VBAのインデントについて|VBA技術解説(7月16日)
「VBA Match関数の限界」についての誤解|エクセル雑感(7月15日)
省略可能なVariant引数の参照不可をラップ関数で利用|VBA技術解説(7月12日)
100桁の正の整数値の足し算|エクセル雑感(7月9日)
LSetとユーザー定義型のコピー(100桁の足し算)|VBA技術解説(7月9日)
Variant仮引数のByRefとByValの挙動違い|エクセル雑感(7月5日)
Variant仮引数にRange.Valueを配列で渡す方法|エクセル雑感(7月5日)
Variantの数値型と文字列型の比較|エクセル雑感(7月1日)
VBAのVariant型について|VBA技術解説(6月30日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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