Excel VBAスクリプトでPCの全情報を自動表示する方法
パソコンのCPUやメモリの詳細、シリアル番号や型番、インストール済みソフトウェアのバージョンなどを知りたいけれど、どこを見ればいいのか分からない——そんな経験はありませんか?実は、Excelにほんの少しのコードを書き加えるだけで、Windows PCに関する膨大な情報を一括で抽出できるのです。
信じられないように聞こえるかもしれませんが、それこそが「使いこなせている」Windowsの実力です。
多少コードに触れる必要はありますが、この記事では必要なコードをすべて提供し、Excelへの組み込み方から動作確認まで丁寧に解説します。完成すれば、開くたびにコンピューターシステムに関するあらゆる情報を教えてくれるExcelシートが手に入ります。
なお、この方法はデスクトップ版のExcelでのみ動作します。Officeの無料トライアルでも試せるので、気軽にチャレンジしてみてください。
WMIの魔法とは
Microsoft OSが動作するすべてのコンピューターには、「Windows Management Instrumentation(WMI)」と呼ばれる強力な拡張機能セットが標準搭載されています。WMIを活用すれば、ハードウェアの仕様、オペレーティングシステム、インストール済みソフトウェアなど、コンピューターに関する幅広い情報へアクセスできます。

さらに嬉しいことに、WMIはVBAなどのプログラミング言語から操作でき、ほぼすべてのMicrosoft Office製品で利用可能です。
自動化スプレッドシートの準備
まず、新しいExcelブックを作成し、「MyComputerInfo.xlsm」のような名前(マクロ有効形式)を付けて保存します。ファイルを開いたら、Sheet1はそのまま残し、以降の11枚のシートを以下の名前で作成・リネームしてください。
- Network(ネットワーク)
- LogicalDisk(論理ディスク)
- Processor(プロセッサー)
- Physical Memory(物理メモリ)
- Video Controller(ビデオコントローラー)
- OnBoardDevices(オンボードデバイス)
- Operating System(オペレーティングシステム)
- Printer(プリンター)
- Software(ソフトウェア)
- Accounts(アカウント)
- Services(サービス)
これらのシートにコンピューターの詳細情報が格納され、Excelブックを開くたびに自動的に更新されます。

次に、開発(Developer)タブを開き、コントロールグループ内のコードの表示(View Code)をクリックします。

開発タブが表示されていない場合は、ファイル > オプション > リボンのユーザー設定を開き、「コマンドの選択」ドロップダウンをすべてのタブに変更して開発を選択し、追加>>ボタンで右側に追加します。追加後、右側の「開発」チェックボックスがオンになっていることを確認しましょう。

VBAエディターが開いたら、あとは以下のスクリプトをモジュールに追加するだけです。重い処理はすべてスクリプトが担ってくれるので、コードを自分で書く必要はありません。以下のようにコピー&ペーストするだけでOKです。
次のセクションのコードを貼り終えたら、シートへデータを読み込むためのコードを少し追加すれば完成です。
では、コピー&ペーストの準備はいいですか?さっそく始めましょう。
WMIモジュールの構築
今回のコードのヒントになったのは、「Beyond Excel」というGoogleサイト上の優れたリソースです。そこで紹介されているのはWMI()というサブルーチンで、コンピューターのネットワーク情報をExcel開発環境のデバッグ領域(イミディエイトウィンドウ)に出力するものです。
しかし、それだけでは実用性が低いため、本記事では出力先を最初の手順で作成したシートに変更したコードをご紹介します。
コードナビゲーション領域には「Modules(標準モジュール)」セクションがあり、その下に「Module1」があります。ダブルクリックして開いてください。Modulesフォルダーが見当たらない場合は、メニューから挿入 > 標準モジュールを選択します。

ここに、WMIを使ってコンピューターの重要情報を取得し、作成済みのシートへ書き込むサブルーチンをすべて配置していきます。
まず、コードウィンドウの最上部に以下の行をそのまま記述してください。
Public oWMISrvEx As Object 'SWbemServicesEx
Public oWMIObjSet As Object 'SWbemServicesObjectSet
Public oWMIObjEx As Object 'SWbemObjectEx
Public oWMIProp As Object 'SWbemProperty
Public sWQL As String 'WQL Statement
Public n
入力後は次の画像のようになります。

続けて、以下のコードをModule1内の先ほどの行の下に貼り付けてください。
Sub NetworkWMI()
sWQL = "Select * From Win32_NetworkAdapterConfiguration"
Set oWMISrvEx = GetObject("winmgmts:root/CIMV2")
Set oWMIObjSet = oWMISrvEx.ExecQuery(sWQL)
intRow = 2
strRow = Str(intRow)
ThisWorkbook.Sheets("Network").Range("A1").Value = "Name"
ThisWorkbook.Sheets("Network").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("Network").Range("B1").Value = "Value"
ThisWorkbook.Sheets("Network").Cells(1, 2).Font.Bold = True
For Each oWMIObjEx In oWMIObjSet
For Each oWMIProp In oWMIObjEx.Properties_
If Not IsNull(oWMIProp.Value) Then
If IsArray(oWMIProp.Value) Then
For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value)
Debug.Print oWMIProp.Name & "(" & n & ")", oWMIProp.Value(n)
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
intRow = intRow + 1
strRow = Str(intRow)
Next
Else
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
intRow = intRow + 1
strRow = Str(intRow)
End If
End If
Next
'End If
Next
End Sub
続いて、このガイドの前半で作成した各シート用に、ごく一部を変えた同じ構造の関数を作成していきます。
例えば、上記のNetworkWMI()のコード全体をコピーして末尾に貼り付け、「NetworkWMI()」を「LogicalDiskWMI()」に置き換えます。
正しいシートにデータが書き込まれるよう修正するのは、わずか数カ所だけです。
この行を:
sWQL = "Select * From Win32_NetworkAdapterConfiguration"
次のように変更:
sWQL = "Select * From Win32_LogicalDisk"
この4行を:
ThisWorkbook.Sheets("Network").Range("A1").Value = "Name"
ThisWorkbook.Sheets("Network").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("Network").Range("B1").Value = "Value"
ThisWorkbook.Sheets("Network").Cells(1, 2).Font.Bold = True
次のように変更:
ThisWorkbook.Sheets("LogicalDisk").Range("A1").Value = "Name"
ThisWorkbook.Sheets("LogicalDisk").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("LogicalDisk").Range("B1").Value = "Value"
ThisWorkbook.Sheets("LogicalDisk").Cells(1, 2).Font.Bold = True
さらにこの2行を:
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
次のように変更:
ThisWorkbook.Sheets("LogicalDisk").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("LogicalDisk").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
そしてこの3行も:
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
次のように変更:
ThisWorkbook.Sheets("LogicalDisk").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("LogicalDisk").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("LogicalDisk").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
これでもう少しで完成です!
ブック内の残りのタブについても同様の手順を繰り返します。対応する関数名は以下の通りです。
- 「Processor」シート → 「ProcessorWMI()」
- 「Physical Memory」シート → 「PhysicalMemWMI()」
- 「Video Controller」シート → 「VideoControlWMI()」
- 「OnBoardDevices」シート → 「OnBoardWMI()」
- 「Printer」シート → 「PrinterWMI()」
- Operating Systemシート → 「OperatingWMI()」
- 「Software」シート → 「SoftwareWMI()」
- 「Services」シート → 「ServicesWMI()」
各情報へアクセスするために指定する特別な「Win32_」オブジェクトは以下の通りです。
- Win32_NetworkAdapterConfiguration – ネットワーク構成設定の全項目
- Win32_LogicalDisk – ディスク容量と空き容量
- Win32_Processor – CPUスペック
- Win32_PhysicalMemoryArray – RAM/搭載メモリサイズ
- Win32_VideoController – グラフィックアダプターとその設定
- Win32_OnBoardDevice – マザーボード上のデバイス
- Win32_OperatingSystem – Windowsのバージョンとシリアル番号
- Win32_Printer – インストール済みプリンター
- Win32_Product – インストール済みソフトウェア
- Win32_BaseService – 実行中(または停止中)のサービス一覧と、サービスのパス・ファイル名
Module1領域で各関数のコピペと調整を終えたら、次のセクションへ進みましょう。
VBA画面でコードを保存することをお忘れなく!最初に.xls形式で保存していた場合、Excelからマクロ有効形式(.xlsmなど)での保存を求められます。
ブックを開いたときに自動実行する設定
強力な関数がすべて揃ったら、最後に「ブックを開くたびに関数を実行する」設定を行います。やり方はとても簡単です。
左側のオブジェクトブラウザーで、Microsoft Excel Objects配下にあるThisWorkbookを探します。ダブルクリックして開いてください。

コード領域の上部にある2つのドロップダウンボックスのうち、左側をWorkbookに、右側をOpenに変更します。

すると、Private Sub Workbook_Open()という関数が自動生成されます。
この中に以下のコードを入力して、関数を次のように仕上げます。
Private Sub Workbook_Open()
NetworkWMI
LogicalDiskWMI
ProcessorWMI
PhysicalMemWMI
VideoControlWMI
OnBoardWMI
PrinterWMI
SoftwareWMI
OperatingWMI
ServicesWMI
End Sub
これで、ブックを開くたびに新しく作成した各関数が順番に呼び出され、コンピューターからデータを取得して対応するシートへ自動的に書き込まれます。
実際に確認するには、コードを保存してコードウィンドウを閉じ、ブックも保存して閉じます。再びファイルを開くと、すべてのシートにコンピューターに関する大量のデータが格納されているはずです。
ブックにはマクロが含まれるため、セキュリティ設定によっては無効化されることがあります。その場合は、シート上部のコンテンツの有効化をクリックするとデータ収集が始まります。
注意点として、このツールは非常に大量のデータを収集するため、初回起動時は読み込みまで数分待つ覚悟をしておきましょう。
コンピューター情報の収集をもっと活用する
WMI活用の素晴らしいところは、ここで紹介したデータがほんの氷山の一角に過ぎないという点です。利用可能なWMIクラスは数百種類あり、コンピューターシステムのあらゆる側面の情報を取得できます。
冒険心があるなら、さらに一歩踏み込んで、ブックの先頭シートをダッシュボード化し、他のシートのデータをそこに反映させることも可能です。
要するに、このツールを使えば、ITの専門家ですら存在を知らないようなシステム情報を収集・表示できるようになり、専門家がコントロールパネルや管理ツールを掘り返して調べる時間のごく一部で同じ作業を済ませられるのです。
あなたならこんなツールを作って活用してみますか?VBAプログラマーの方で、WMIクラスを使った経験はありますか?ぜひコメント欄であなたの体験やアイデアを共有してください!
画像クレジット:Adriano Castelli via Shutterstock.com、Mclek via Shutterstock
-
Windows 11でマイク・位置情報・カメラを使用しているアプリを確認する方法
Windows 11を搭載したパソコンには、ビデオ通話のためにカメラを使ったり、録音のためにマイクを使ったりするアプリが数多く存在します。しかし、使用していないはずのタイミングで、カメラやマイクが勝手に動作しているアプリがあるかもしれません。 デジタル時代において、プライバシーはますます重要なテーマになっています。ウェブカメラにテープを貼って目隠しをする人もいれば、PCのマイクをテープで塞いだり、物理的に取り外したりする人もいます。 ユーザーの位置情報や利用状況を追跡する技術が高度化・普及する昨今、こうした対策はごく自然なプライバシー保護の手段と言えるでしょう。 幸いなことに、Windows
-
Windows 10でウェブカメラを使用しているアプリを確認する方法
Windows 10の2019年5月の機能更新プログラム(バージョン1903)では、ウェブカメラの設定ページに大きな改善が加えられました。どのアプリがカメラを使用しているのかを確認できるようになり、プライバシー保護が強化されています。ウェブカメラのインジケーターライトが突然点灯しても、原因となっているアプリを素早く特定できるでしょう。カメラを使用しているアプリの一覧を表示する手順アプリの一覧は、Windowsの既存の「カメラ」プライバシー設定ページ内にあります。以下の手順でアクセスしてください。スタートメニューから「設定」アプリを開きます(Win + Iキーのショートカットでも開けます)。設定