こんばんは、うぃむです。
また、ちょっとエクセルのお勉強のお話です。
エクセルでパソコンのいろいろな情報を表示してみたいということはないでしょうか?
Windowsには、「Windows Management Instrumentation」(WMI)というのがあり、OSやコンピュータの構成などの情報が取得できるので、今回この取得ができるツールをエクセルで作ってみました。
なお、マクロは初心者なので、ソースコードは粗が多いとおもいますが、ご了承下さい。
WMIの取得ツールの使い方
説明
WMIは、Windows のシステム情報を取得できます。WMIの詳細は、以下をご確認ください。
https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/wmi-start-page
操作方法
| WMI一覧 | 取得できたWMI等がリストから選択できます。 |
|---|---|
| クエリ | WMI一覧で選択したものをクエリで表示します。 |
| 条件 | クエリの取得に条件等を追加したい場合は、記入します。 |
| プロパティ | [プロパティ取得]ボタンを押すと、選択したWMIのプロパティの一覧が表示されます。 |
| プロパティ取得 | 「プロパティ」にWMIのプロパティ一覧が表示されます。ただし、結果が取得できないものは表示されません。 |
| WMIの結果取得 | 「クエリ」「条件」を元に、結果を取得しシート「WMIの結果」に表示します。 |
| 初期化 | 初期状態に戻します。 |
※WMIの内容は、みなさんで調べてください。
使用例1
WMIには「Win32_OperatingSystem」というのがあり、OSの情報が取得できます。WMI一覧で「Win32_OperatingSystem」を選択して、[WMIの結果取得]を押すと、以下の様に情報が取得できます。
使用例2
「Win32_PingStatus」は条件が空白だと取得できません。条件にPINGしたいIPアドレスを入れてあげると、結果が取得できます。例えば、FF14の日本DCのPING確認を行いたい場合であれば、条件に「Address = "124.150.157.15"」といれると結果がもどってくると思います。
マクロ(VBA)
ワークブックを開いたとき
WMIの一覧を取得し、非表示の「WMI一覧」に集めます。これを、シート「WMIの取得」のWMI一覧で選択が行なえるようにしています。
Private Sub Workbook_Open()
' 定義
Dim oWMI As SWbemServicesEx ' WMIサービスオブジェクト
Dim oQuerySet As SWbemObjectSet ' クエリ結果セット
Dim oQueryEx As SWbemObjectEx ' クエリ結果
Dim wsWMIList As Worksheet
Dim wsWMIGet As Worksheet
Dim sComputerName As String
Dim sQuery As String
Dim i As Integer
' シートの取得
Set wsWMIList = Worksheets("WMI一覧")
Set wsWMIGet = Worksheets("WMIの取得")
' 対象のコンピューター
sComputerName = "."
' 画面の更新を停止
Application.ScreenUpdating = False
' WMIの定義
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputerName & "\root\cimv2")
' WMI一覧の取得
sQuery = "SELECT * FROM Meta_Class"
Set oQuerySet = oWMI.ExecQuery(sQuery)
' [WMI一覧]の表示
wsWMIList.Activate
i = 1
For Each oQueryEx In oQuerySet
Cells(i, 1).Value = oQueryEx.SystemProperties_("__Class")
i = i + 1
Next
wsWMIList.Sort.SortFields.Clear
wsWMIList.Sort.SortFields.Add Key:=Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With wsWMIList.Sort
.SetRange Range("A:A")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' [WMIの取得]の表示
wsWMIGet.Select
With Worksheets("WMIの取得").Cells(1, 2).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=WMI一覧!$A:$A"
End With
' 画面の更新を開始
Application.ScreenUpdating = True
End Sub
クリア
初期状態に戻します。
Sub setClear()
Application.ScreenUpdating = False
Dim wsWMIGet As Worksheet
Dim wsWMIOut As Worksheet
Dim i As Integer
Set wsWMIGet = Worksheets("WMIの取得")
Set wsWMIOut = Worksheets("WMIの結果")
wsWMIOut.Select
' 現在の値を全て削除
Cells.Select
Selection.Delete Shift:=xlUp
Cells(1, 1).Select
wsWMIGet.Select
For i = 5 To Cells(Rows.Count, 2).End(xlUp).Row
Cells(i, 2) = ""
Next
Cells(1, 2).Select
Application.ScreenUpdating = True
End Sub
プロパティ取得
「クエリ」「条件」を元に、プロパティを取得します。実際の取得は、上記の「WMIの情報取得」です。ここでは、処理前の確認をしています。
Sub getWMIProperties()
' プロパティのみ取得
If vbCancel = MsgBox(Cells(1, 2).Value & " のプロパティを取得します。取得には時間がかかる場合があります。実行してよいでしょうか?", vbOKCancel + vbExclamation) Then
Exit Sub
End If
getWMI (1)
End Sub
WMIの結果取得
「クエリ」「条件」を元に、WMIの結果を取得します。実際の取得は、上記の「WMIの情報取得」です。ここでは、処理前の確認をしています。
Sub getWMIAll()
' 結果の取得
If vbCancel = MsgBox(Cells(1, 2).Value & " の情報を取得します。取得には時間がかかる場合があります。実行してよいでしょうか?", vbOKCancel + vbExclamation) Then
Exit Sub
End If
getWMI (0)
End Sub
WMIの情報取得
「クエリ」「条件」を元に、結果を取得しています。パラメータが0の場合は「WMIの結果」に取得した情報を表示し、パラメーターが1の場合は「プロパティ」に一覧のみ表示します。
Sub getWMI(Optional iMode As Integer = 0)
' 画面の更新を停止
Application.ScreenUpdating = False
On Error Resume Next
' 定義
Dim oLocator As New SWbemLocator ' SWbemLocatorクラスオブジェクト
Dim oWMI As SWbemServicesEx ' WMIサービスオブジェクト
Dim oSet As SWbemObjectSet ' WMIの抽出結果
Dim oEx As SWbemObjectEx ' WMIの内容
Dim wsWMIGet As Worksheet
Dim wsWMIOut As Worksheet
Dim sComputerName As String
Dim sQuery As String
Dim o As Object
Dim i As Integer
Dim j As Integer
' シートの取得
Set wsWMIGet = Worksheets("WMIの取得")
Set wsWMIOut = Worksheets("WMIの結果")
' WMIの取得画面へ
wsWMIGet.Select
' シートを初期状態にする
setClear
sComputerName = "."
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputerName & "\root\cimv2")
' WMIの抽出クエリ
sQuery = Cells(2, 2).Value
If Cells(3, 2).Value <> "" Then
sQuery = sQuery & " WHERE " & Cells(3, 2).Value
End If
' WMIの結果
If iMode = 1 Then
Else
wsWMIOut.Select
' 現在の値を全て削除
Cells.Select
Selection.Delete Shift:=xlUp
Cells(1, 1).Select
End If
' クエリの実行
Set oSet = oWMI.ExecQuery(sQuery)
' プロパティの設定
i = 1
For Each o In oSet.ItemIndex(0).Properties_
If iMode = 1 Then 'プロパティの取得のみ
Cells(4 + i, 2).Value = o.Name
Else ' プロパティ+結果の取得
Cells(1, i).Value = o.Name
End If
i = i + 1
Next
If Err.Number <> 0 Then
MsgBox "プロパティが見つかりませんでした。"
wsWMIGet.Select
Application.ScreenUpdating = True
Exit Sub
End If
If iMode = 1 Then
Exit Sub
End If
' 値の設定
i = 2
For Each oEx In oSet
j = 1
For Each o In oSet.ItemIndex(0).Properties_
Cells(i, j).Value = oEx.Properties_(o.Name).Value
j = j + 1
Next
i = i + 1
Next
Cells.EntireColumn.AutoFit
' 画面の更新を開始
Application.ScreenUpdating = True
End Sub
作ったエクセル
(注意事項)
エクセルシートはマクロを使っています。ダウンロードしてエクセルで動かす必要があります。
ダウンロードしたファイルは、アクセスをブロックされると思います。その場合は、ファイルのプロパティから、「許可する」を選択してください。また、当シートはマクロも有効にして使ってください。
なお、このエクセルは勉強用で作成したものです。このファイルでのいかなる責任は負えませんのでご了承をお願いいたします。
最後に
WMIのプロパティのだけ取得したいというのは作れませんでした。ちゃんとした開発ツールであればできると思いますが、エクセルマクロではできなそうなので、断念しました。何か良い方法を知っていたら教えてくださいね。
本来のエクセルの用途とは違うかもしれません。とはいえ、それなりに動くツールとして作れました。簡単に作ろうと思っていたのですが、なんとなくこんなこともできるのかな?こんなこともできるのかな?とかやっていたら、こんな感じに出来上がってしまいました。マクロ初心者としては、まぁまぁでしょうかね?(笑)