VBA×WMIでプロセスを監視する ― 無限ループを避けた読み取り専用チェック

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

この記事について
この記事は、生成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を削除。

文書情報

記事タイトル
VBA×WMIでプロセスを監視する ― 無限ループを避けた読み取り専用チェック
作成日
更新日
Source URL
https://papanda925.com/?p=5684

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

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