この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。WMIのWin32_ProcessとVBA7のAPI宣言を見直し、旧記事の無限ループ・誤ったLongPtr使用・ログ重複しやすい構成を修正しました。検証ステータス:✅ Windows WMI/VBA構造確認済み
Excel VBAからWin32_Processを読むと、プロセス名、PID、WorkingSetSizeなどを取得できます。ただし、Excel自身を常駐監視ツールのように使う場合は、停止方法とログ量を先に設計します。
Sleepの引数はポインターではない
Windows APIのSleepはミリ秒を表すDWORDを受け取ります。64bit Officeでも、この引数をLongPtrにする必要はありません。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
1回取得する処理と定期実行を分ける
取得ロジックを無限Do...Loopへ直接埋め込むより、「1回だけ取得するSub」を作り、継続実行は停止フラグやApplication.OnTimeなど別の仕組みで制御すると保守しやすくなります。
Set svc = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set procs = svc.ExecQuery("SELECT Name,ProcessId,WorkingSetSize FROM Win32_Process")
同じ異常を5秒ごとに記録し続けない
500MBを超えたプロセスを5秒ごとに記録すると、同じ状態だけでログが急増します。PIDごとに前回状態を保持し、「正常→異常へ変わったとき」「一定時間ごと」など記録条件を決めます。
- 監視対象プロセスを絞る。
- 閾値を固定値ではなく業務アプリごとに定義する。
- PID、取得時刻、WorkingSetSize、判定を記録する。
- 停止セルや停止ボタンを用意する。
- 長期監視はExcelではなく監視基盤も比較する。
公式情報
- Microsoft Learn ― Win32_Process class
- Microsoft Learn ― 64-bit Visual Basic for Applications overview
この記事の更新履歴
- 2026-09-14 追加:状態変化時だけ記録する考え方と停止設計を追加。
- 2026-09-14 変更:無限ループ中心のサンプルから、取得処理とスケジュールを分離する構成へ変更。
- 2026-09-14 削除:内部style_prompt、本文H1、Sleep引数のLongPtr宣言、異常状態を無制限に追記する例を削除。

