VBA/WMIでWindowsプロセスを監視する ― Excelを固めない安全なポーリング設計

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成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ではなく監視基盤も比較する。

公式情報

この記事の更新履歴

  • 2026-09-14 追加:状態変化時だけ記録する考え方と停止設計を追加。
  • 2026-09-14 変更:無限ループ中心のサンプルから、取得処理とスケジュールを分離する構成へ変更。
  • 2026-09-14 削除:内部style_prompt、本文H1、Sleep引数のLongPtr宣言、異常状態を無制限に追記する例を削除。

文書情報

記事タイトル
VBA/WMIでWindowsプロセスを監視する ― Excelを固めない安全なポーリング設計
作成日
更新日
Source URL
https://papanda925.com/?p=5604

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました