この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。MicrosoftのWin32_Process仕様を基準に、旧記事の無限ループ型VBAを、読み取り専用の1回実行チェックへ修正しました。検証ステータス:✅ WMI Win32_Process仕様確認済み
VBAからWMIを利用すると、Windowsで実行中のプロセス名、ProcessId、WorkingSetSizeなどを取得できます。Excelを簡易点検ツールとして使うなら、まず1回実行して結果を返す処理にすると安全です。
最小の読み取り例
Option Explicit
Sub CheckProcessOnce()
Const TARGET As String = "excel.exe"
Dim svc As Object
Dim procs As Object
Dim p As Object
Dim row As Long
Set svc = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set procs = svc.ExecQuery( _
"SELECT Name,ProcessId,WorkingSetSize FROM Win32_Process " & _
"WHERE Name='" & TARGET & "'")
row = 2
For Each p In procs
Cells(row, 1).Value = Now
Cells(row, 2).Value = p.Name
Cells(row, 3).Value = p.ProcessId
Cells(row, 4).Value = CDbl(p.WorkingSetSize) / 1024# / 1024#
row = row + 1
Next
If procs.Count = 0 Then
Cells(row, 1).Value = Now
Cells(row, 2).Value = TARGET
Cells(row, 3).Value = "未検出"
End If
End Sub
WorkingSetSizeは「異常」の判定値ではない
WorkingSetSizeは、その時点でプロセスのワーキングセットにあるメモリ量です。「500MBを超えれば異常」といった共通閾値はありません。対象アプリの通常時データを計測し、業務ごとに基準を作ります。
Excelを常駐監視サービスにしない
旧コードはDo ... LoopとWin32 APIのSleepでExcelを常時監視プロセスとして使っていました。長時間監視では、Excel終了、ブック更新、例外時の復旧が難しくなります。
- VBAは1回の点検・棚卸しに使う。
- 定期監視はタスクスケジューラ、PowerShell、監視製品などへ分離する。
- 監視とプロセス終了・再起動などの変更操作を同じマクロに入れない。
公式情報
この記事の更新履歴
- 2026-09-14 追加:読み取り専用の単発チェック例、WorkingSetSizeの扱いを追加。
- 2026-09-14 変更:Excel常駐監視から、再実行可能な点検マクロへ構成変更。
- 2026-09-14 削除:内部style_prompt、本文H1、無限ループ、固定500MBを異常とする断定、不要なSleep APIを削除。

