こんばんは、うぃむです。
また、ちょっとエクセルのお勉強のお話です。
エクセルでパソコンのいろいろな情報を表示してみたいということはないでしょうか?
Windowsには、「Windows Management Instrumentation」(WMI)というのがあり、OSやコンピュータの構成などの情報が取得できるので、今回この取得ができるツールをエクセルで作ってみました。
なお、マクロは初心者なので、ソースコードは粗が多いとおもいますが、ご了承下さい。
1.WMIの取得ツールの使い方
1-1.説明
WMIは、Windows のシステム情報を取得できます。WMIの詳細は、以下をご確認ください。
https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/wmi-start-page
1-2.操作方法
WMI一覧 | 取得できたWMI等がリストから選択できます。 |
---|---|
クエリ | WMI一覧で選択したものをクエリで表示します。 |
条件 | クエリの取得に条件等を追加したい場合は、記入します。 |
プロパティ | [プロパティ取得]ボタンを押すと、選択したWMIのプロパティの一覧が表示されます。 |
プロパティ取得 | 「プロパティ」にWMIのプロパティ一覧が表示されます。ただし、結果が取得できないものは表示されません。 |
WMIの結果取得 | 「クエリ」「条件」を元に、結果を取得しシート「WMIの結果」に表示します。 |
初期化 | 初期状態に戻します。 |
※WMIの内容は、みなさんで調べてください。
1-3.使用例1
WMIには「Win32_OperatingSystem」というのがあり、OSの情報が取得できます。WMI一覧で「Win32_OperatingSystem」を選択して、[WMIの結果取得]を押すと、以下の様に情報が取得できます。
1-4.使用例2
「Win32_PingStatus」は条件が空白だと取得できません。条件にPINGしたいIPアドレスを入れてあげると、結果が取得できます。例えば、FF14の日本DCのPING確認を行いたい場合であれば、条件に「Address = "124.150.157.15"」といれると結果がもどってくると思います。
2.マクロ(VBA)
2-1.ワークブックを開いたとき
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
2-2.クリア
初期状態に戻します。
- 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
2-3.プロパティ取得
「クエリ」「条件」を元に、プロパティを取得します。実際の取得は、上記の「WMIの情報取得」です。ここでは、処理前の確認をしています。
- Sub getWMIProperties()
- ' プロパティのみ取得
- If vbCancel = MsgBox(Cells(1, 2).Value & " のプロパティを取得します。取得には時間がかかる場合があります。実行してよいでしょうか?", vbOKCancel + vbExclamation) Then
- Exit Sub
- End If
- getWMI (1)
- End Sub
2-4.WMIの結果取得
「クエリ」「条件」を元に、WMIの結果を取得します。実際の取得は、上記の「WMIの情報取得」です。ここでは、処理前の確認をしています。
- Sub getWMIAll()
- ' 結果の取得
- If vbCancel = MsgBox(Cells(1, 2).Value & " の情報を取得します。取得には時間がかかる場合があります。実行してよいでしょうか?", vbOKCancel + vbExclamation) Then
- Exit Sub
- End If
- getWMI (0)
- End Sub
2-5.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
3.作ったエクセル
(注意事項)
エクセルシートはマクロを使っています。ダウンロードしてエクセルで動かす必要があります。
ダウンロードしたファイルは、アクセスをブロックされると思います。その場合は、ファイルのプロパティから、「許可する」を選択してください。また、当シートはマクロも有効にして使ってください。
なお、このエクセルは勉強用で作成したものです。このファイルでのいかなる責任は負えませんのでご了承をお願いいたします。
4.最後に
WMIのプロパティのだけ取得したいというのは作れませんでした。ちゃんとした開発ツールであればできると思いますが、エクセルマクロではできなそうなので、断念しました。何か良い方法を知っていたら教えてくださいね。
本来のエクセルの用途とは違うかもしれません。とはいえ、それなりに動くツールとして作れました。簡単に作ろうと思っていたのですが、なんとなくこんなこともできるのかな?こんなこともできるのかな?とかやっていたら、こんな感じに出来上がってしまいました。マクロ初心者としては、まぁまぁでしょうかね?(笑)