エクセルでパソコン情報を取得するツールを作ってみました(WMI)|うぃむんののんびりギャザクラ日誌 #FF14

エクセルでパソコン情報を取得するツールを作ってみました(WMI)

こんばんは、うぃむです。

また、ちょっとエクセルのお勉強のお話です。

エクセルでパソコンのいろいろな情報を表示してみたいということはないでしょうか?

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一覧で選択が行なえるようにしています。

  1. Private Sub Workbook_Open()
  2.  
  3. ' 定義
  4. Dim oWMI As SWbemServicesEx ' WMIサービスオブジェクト
  5. Dim oQuerySet As SWbemObjectSet ' クエリ結果セット
  6. Dim oQueryEx As SWbemObjectEx ' クエリ結果
  7. Dim wsWMIList As Worksheet
  8. Dim wsWMIGet As Worksheet
  9. Dim sComputerName As String
  10. Dim sQuery As String
  11. Dim i As Integer
  12.  
  13. ' シートの取得
  14. Set wsWMIList = Worksheets("WMI一覧")
  15. Set wsWMIGet = Worksheets("WMIの取得")
  16.  
  17. ' 対象のコンピューター
  18. sComputerName = "."
  19. ' 画面の更新を停止
  20. Application.ScreenUpdating = False
  21.  
  22. ' WMIの定義
  23. Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputerName & "\root\cimv2")
  24. ' WMI一覧の取得
  25. sQuery = "SELECT * FROM Meta_Class"
  26. Set oQuerySet = oWMI.ExecQuery(sQuery)
  27. ' [WMI一覧]の表示
  28. wsWMIList.Activate
  29. i = 1
  30. For Each oQueryEx In oQuerySet
  31. Cells(i, 1).Value = oQueryEx.SystemProperties_("__Class")
  32. i = i + 1
  33. Next
  34.  
  35. wsWMIList.Sort.SortFields.Clear
  36. wsWMIList.Sort.SortFields.Add Key:=Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  37. With wsWMIList.Sort
  38. .SetRange Range("A:A")
  39. .Header = xlGuess
  40. .MatchCase = False
  41. .Orientation = xlTopToBottom
  42. .SortMethod = xlPinYin
  43. .Apply
  44. End With
  45.  
  46. ' [WMIの取得]の表示
  47. wsWMIGet.Select
  48. With Worksheets("WMIの取得").Cells(1, 2).Validation
  49. .Delete
  50. .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=WMI一覧!$A:$A"
  51. End With
  52.  
  53. ' 画面の更新を開始
  54. Application.ScreenUpdating = True
  55.  
  56. End Sub
2-2.クリア

初期状態に戻します。

  1. Sub setClear()
  2.  
  3. Application.ScreenUpdating = False
  4. Dim wsWMIGet As Worksheet
  5. Dim wsWMIOut As Worksheet
  6. Dim i As Integer
  7.  
  8. Set wsWMIGet = Worksheets("WMIの取得")
  9. Set wsWMIOut = Worksheets("WMIの結果")
  10. wsWMIOut.Select
  11. ' 現在の値を全て削除
  12. Cells.Select
  13. Selection.Delete Shift:=xlUp
  14. Cells(1, 1).Select
  15. wsWMIGet.Select
  16. For i = 5 To Cells(Rows.Count, 2).End(xlUp).Row
  17. Cells(i, 2) = ""
  18. Next
  19. Cells(1, 2).Select
  20. Application.ScreenUpdating = True
  21.  
  22. End Sub
2-3.プロパティ取得

「クエリ」「条件」を元に、プロパティを取得します。実際の取得は、上記の「WMIの情報取得」です。ここでは、処理前の確認をしています。

  1. Sub getWMIProperties()
  2.  
  3. ' プロパティのみ取得
  4. If vbCancel = MsgBox(Cells(1, 2).Value & " のプロパティを取得します。取得には時間がかかる場合があります。実行してよいでしょうか?", vbOKCancel + vbExclamation) Then
  5. Exit Sub
  6. End If
  7. getWMI (1)
  8. End Sub
2-4.WMIの結果取得

「クエリ」「条件」を元に、WMIの結果を取得します。実際の取得は、上記の「WMIの情報取得」です。ここでは、処理前の確認をしています。

  1. Sub getWMIAll()
  2.  
  3. ' 結果の取得
  4. If vbCancel = MsgBox(Cells(1, 2).Value & " の情報を取得します。取得には時間がかかる場合があります。実行してよいでしょうか?", vbOKCancel + vbExclamation) Then
  5. Exit Sub
  6. End If
  7. getWMI (0)
  8.  
  9. End Sub
2-5.WMIの情報取得

「クエリ」「条件」を元に、結果を取得しています。パラメータが0の場合は「WMIの結果」に取得した情報を表示し、パラメーターが1の場合は「プロパティ」に一覧のみ表示します。

  1. Sub getWMI(Optional iMode As Integer = 0)
  2.  
  3. ' 画面の更新を停止
  4. Application.ScreenUpdating = False
  5.  
  6. On Error Resume Next
  7.  
  8. ' 定義
  9. Dim oLocator As New SWbemLocator ' SWbemLocatorクラスオブジェクト
  10. Dim oWMI As SWbemServicesEx ' WMIサービスオブジェクト
  11. Dim oSet As SWbemObjectSet ' WMIの抽出結果
  12. Dim oEx As SWbemObjectEx ' WMIの内容
  13. Dim wsWMIGet As Worksheet
  14. Dim wsWMIOut As Worksheet
  15. Dim sComputerName As String
  16. Dim sQuery As String
  17. Dim o As Object
  18. Dim i As Integer
  19. Dim j As Integer
  20. ' シートの取得
  21. Set wsWMIGet = Worksheets("WMIの取得")
  22. Set wsWMIOut = Worksheets("WMIの結果")
  23.  
  24. ' WMIの取得画面へ
  25. wsWMIGet.Select
  26. ' シートを初期状態にする
  27. setClear
  28. sComputerName = "."
  29.  
  30. Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputerName & "\root\cimv2")
  31. ' WMIの抽出クエリ
  32. sQuery = Cells(2, 2).Value
  33. If Cells(3, 2).Value <> "" Then
  34. sQuery = sQuery & " WHERE " & Cells(3, 2).Value
  35. End If
  36. ' WMIの結果
  37. If iMode = 1 Then
  38. Else
  39. wsWMIOut.Select
  40. ' 現在の値を全て削除
  41. Cells.Select
  42. Selection.Delete Shift:=xlUp
  43. Cells(1, 1).Select
  44. End If
  45.  
  46. ' クエリの実行
  47. Set oSet = oWMI.ExecQuery(sQuery)
  48. ' プロパティの設定
  49. i = 1
  50. For Each o In oSet.ItemIndex(0).Properties_
  51. If iMode = 1 Then 'プロパティの取得のみ
  52. Cells(4 + i, 2).Value = o.Name
  53. Else ' プロパティ+結果の取得
  54. Cells(1, i).Value = o.Name
  55. End If
  56. i = i + 1
  57. Next
  58. If Err.Number <> 0 Then
  59. MsgBox "プロパティが見つかりませんでした。"
  60. wsWMIGet.Select
  61. Application.ScreenUpdating = True
  62.  
  63. Exit Sub
  64. End If
  65. If iMode = 1 Then
  66. Exit Sub
  67. End If
  68. ' 値の設定
  69. i = 2
  70. For Each oEx In oSet
  71. j = 1
  72. For Each o In oSet.ItemIndex(0).Properties_
  73. Cells(i, j).Value = oEx.Properties_(o.Name).Value
  74. j = j + 1
  75. Next
  76. i = i + 1
  77. Next
  78.  
  79. Cells.EntireColumn.AutoFit
  80.  
  81. ' 画面の更新を開始
  82. Application.ScreenUpdating = True
  83.  
  84. End Sub

3.作ったエクセル

WMIの取得.xlsm

(注意事項)

エクセルシートはマクロを使っています。ダウンロードしてエクセルで動かす必要があります。

ダウンロードしたファイルは、アクセスをブロックされると思います。その場合は、ファイルのプロパティから、「許可する」を選択してください。また、当シートはマクロも有効にして使ってください。

なお、このエクセルは勉強用で作成したものです。このファイルでのいかなる責任は負えませんのでご了承をお願いいたします。

4.最後に

WMIのプロパティのだけ取得したいというのは作れませんでした。ちゃんとした開発ツールであればできると思いますが、エクセルマクロではできなそうなので、断念しました。何か良い方法を知っていたら教えてくださいね。

本来のエクセルの用途とは違うかもしれません。とはいえ、それなりに動くツールとして作れました。簡単に作ろうと思っていたのですが、なんとなくこんなこともできるのかな?こんなこともできるのかな?とかやっていたら、こんな感じに出来上がってしまいました。マクロ初心者としては、まぁまぁでしょうかね?(笑)

0 件のコメント:

コメントを投稿

「アルカディア零式クルーザー級」に挑戦してみました #FF14

こんにちは、ういむです。 2025年4月1日(火)よりスタートした「クルーザー級零式」、ようやく4層後半までクリアできました!もう多くの方がクリア済みで、今さら感もあるのですが……今回は正直、苦手なタイプの零式だったと思います。 今回は、ナイトMTで挑戦した感想や各層の簡単な...