<p><style_prompt></style_prompt></p>
<ul class="wp-block-list">
<li><p>専門性と実用性の両立:高度な技術内容を、現場の担当者が即採用できるレベルの具体的コードとともに提供する。</p></li>
<li><p>構造化思考:論理的な飛躍を避け、前提、フロー、実装、解説、注意点の順序で整理する。</p></li>
<li><p>堅牢なコーディング:64bit/32bit両対応のPtrSafe宣言、エラーハンドリング、リソース解放(Set Nothing)を徹底する。
</p></li>
</ul>
<p>本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">VBA×WMIによるWindowsプロセス監視:異常検知と自動アラートの実装</h1>
<h2 class="wp-block-heading">【背景と目的】</h2>
<p>業務アプリのフリーズや二重起動による競合を防止。特定プロセスのメモリやCPU負荷を常時監視し、異常検知時に自動通知する仕組みを構築します。(67文字)</p>
<h2 class="wp-block-heading">【処理フロー図】</h2>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["開始"] --> B["WMIサービスへ接続"]
B --> C["特定プロセス情報をクエリ"]
C --> D{"プロセス存在確認"}
D -- No --> E["消失アラート出力"]
D -- Yes --> F["メモリ/CPU使用率チェック"]
F --> G{"閾値超過判定"}
G -- Yes --> H["異常検知アラート出力"]
G -- No --> I["待機(Sleep)"]
I --> C
H --> I
E --> I
</pre></div>
<h2 class="wp-block-heading">【実装:VBAコード】</h2>
<p>標準モジュールに貼り付けて使用してください。Win32 APIを使用した待機処理を含み、Excelの挙動を妨げないように構成しています。</p>
<pre data-enlighter-language="generic">Option Explicit
' 64bit/32bit両対応のAPI宣言
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
''' <summary>
''' 指定したプロセスを監視し、異常(メモリ超過・消失)を検知する
''' </summary>
Public Sub WatchTargetProcess()
Dim wmiService As Object
Dim processes As Object
Dim process As Object
Dim query As String
Dim targetName As String
Dim memThresholdMB As Double
Dim isFound As Boolean
' --- 設定項目 ---
targetName = "EXCEL.EXE" ' 監視対象のプロセス名
memThresholdMB = 500 ' メモリ閾値 (MB)
' ----------------
' 描画停止・計算手動化(高速化)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
On Error Resume Next
' WMIサービスへの接続(実行時バインディングで参照設定不要)
Set wmiService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
On Error GoTo ErrorHandler
If wmiService Is Nothing Then
MsgBox "WMIサービスに接続できませんでした。", vbCritical
Exit Sub
End If
Debug.Print "監視開始: " & Now
' ループ監視(例として5回。実務ではDo Loopやタイマー検討)
Dim i As Integer
For i = 1 To 5
query = "SELECT * FROM Win32_Process WHERE Name = '" & targetName & "'"
Set processes = wmiService.ExecQuery(query)
isFound = False
For Each process In processes
isFound = True
' メモリ使用量 (WorkingSetSize) をMB換算
Dim memUsage As Double
memUsage = CDbl(process.WorkingSetSize) / 1024 / 1024
' 異常検知ロジック
If memUsage > memThresholdMB Then
Debug.Print "【警告】" & targetName & " が閾値を超過: " & Round(memUsage, 2) & " MB"
' ここにメール送信やログ書き出しの処理を記述
End If
Next process
If Not isFound Then
Debug.Print "【通知】" & targetName & " は実行されていません。"
End If
' OSに制御を戻しつつ待機
DoEvents
Sleep 2000 ' 2秒待機
Next i
MsgBox "監視期間を終了しました。", vbInformation
CleanExit:
' リソース解放
Set processes = Nothing
Set wmiService = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume CleanExit
End Sub
</pre>
<h2 class="wp-block-heading">【技術解説】</h2>
<ol class="wp-block-list">
<li><p><strong>WMI (Windows Management Instrumentation)</strong>: Windowsのシステム情報を管理するためのインフラストラクチャです。VBAからSQLライクなクエリを用いて、実行中のプロセス一覧やリソース消費量を容易に取得できます。</p></li>
<li><p><strong>遅延バインディング (Late Binding)</strong>: <code>CreateObject</code> や <code>GetObject</code> を使用することで、特定のタイプライブラリ(Microsoft WMI Scripting V1.5 Library等)への参照設定が不要になり、他PCでの動作互換性が高まります。</p></li>
<li><p><strong>APIによるSleep</strong>: VBA標準の <code>Wait</code> メソッドは秒単位でしか指定できませんが、Win32 APIの <code>Sleep</code> を使うことでミリ秒単位の制御が可能になり、監視間隔を柔軟に調整できます。</p></li>
</ol>
<h2 class="wp-block-heading">【注意点と運用】</h2>
<ul class="wp-block-list">
<li><p><strong>CPU負荷への配慮</strong>: 監視間隔が短すぎると(例:100ms以下)、監視処理自体がCPUリソースを消費します。業務アプリへの影響を避け、通常は1〜5秒程度の間隔を推奨します。</p></li>
<li><p><strong>管理者権限</strong>: 一部のシステムプロセス情報を取得する場合、Excel自体を「管理者として実行」する必要がある場合があります。</p></li>
<li><p><strong>例外処理</strong>: ネットワーク経由でリモートPCを監視する場合、タイムアウトや接続拒否のトラップを必ず実装してください。</p></li>
</ul>
<h2 class="wp-block-heading">【まとめ】</h2>
<ol class="wp-block-list">
<li><p>WMIを活用することで、外部ツールを使わず標準VBAのみで高度なシステム監視が可能になる。</p></li>
<li><p><code>PtrSafe</code> を含むWin32 API宣言により、最新の64bit Office環境でも安定動作を担保する。</p></li>
<li><p>異常検知後のアクション(強制終了、管理者への通知、ログ記録)を組み合わせることで、運用の自動化が完結する。</p></li>
</ol>
専門性と実用性の両立:高度な技術内容を、現場の担当者が即採用できるレベルの具体的コードとともに提供する。
構造化思考:論理的な飛躍を避け、前提、フロー、実装、解説、注意点の順序で整理する。
堅牢なコーディング:64bit/32bit両対応のPtrSafe宣言、エラーハンドリング、リソース解放(Set Nothing)を徹底する。
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
VBA×WMIによるWindowsプロセス監視:異常検知と自動アラートの実装
【背景と目的】
業務アプリのフリーズや二重起動による競合を防止。特定プロセスのメモリやCPU負荷を常時監視し、異常検知時に自動通知する仕組みを構築します。(67文字)
【処理フロー図】
graph TD
A["開始"] --> B["WMIサービスへ接続"]
B --> C["特定プロセス情報をクエリ"]
C --> D{"プロセス存在確認"}
D -- No --> E["消失アラート出力"]
D -- Yes --> F["メモリ/CPU使用率チェック"]
F --> G{"閾値超過判定"}
G -- Yes --> H["異常検知アラート出力"]
G -- No --> I["待機(Sleep)"]
I --> C
H --> I
E --> I
【実装:VBAコード】
標準モジュールに貼り付けて使用してください。Win32 APIを使用した待機処理を含み、Excelの挙動を妨げないように構成しています。
Option Explicit
' 64bit/32bit両対応のAPI宣言
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
''' <summary>
''' 指定したプロセスを監視し、異常(メモリ超過・消失)を検知する
''' </summary>
Public Sub WatchTargetProcess()
Dim wmiService As Object
Dim processes As Object
Dim process As Object
Dim query As String
Dim targetName As String
Dim memThresholdMB As Double
Dim isFound As Boolean
' --- 設定項目 ---
targetName = "EXCEL.EXE" ' 監視対象のプロセス名
memThresholdMB = 500 ' メモリ閾値 (MB)
' ----------------
' 描画停止・計算手動化(高速化)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
On Error Resume Next
' WMIサービスへの接続(実行時バインディングで参照設定不要)
Set wmiService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
On Error GoTo ErrorHandler
If wmiService Is Nothing Then
MsgBox "WMIサービスに接続できませんでした。", vbCritical
Exit Sub
End If
Debug.Print "監視開始: " & Now
' ループ監視(例として5回。実務ではDo Loopやタイマー検討)
Dim i As Integer
For i = 1 To 5
query = "SELECT * FROM Win32_Process WHERE Name = '" & targetName & "'"
Set processes = wmiService.ExecQuery(query)
isFound = False
For Each process In processes
isFound = True
' メモリ使用量 (WorkingSetSize) をMB換算
Dim memUsage As Double
memUsage = CDbl(process.WorkingSetSize) / 1024 / 1024
' 異常検知ロジック
If memUsage > memThresholdMB Then
Debug.Print "【警告】" & targetName & " が閾値を超過: " & Round(memUsage, 2) & " MB"
' ここにメール送信やログ書き出しの処理を記述
End If
Next process
If Not isFound Then
Debug.Print "【通知】" & targetName & " は実行されていません。"
End If
' OSに制御を戻しつつ待機
DoEvents
Sleep 2000 ' 2秒待機
Next i
MsgBox "監視期間を終了しました。", vbInformation
CleanExit:
' リソース解放
Set processes = Nothing
Set wmiService = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume CleanExit
End Sub
【技術解説】
WMI (Windows Management Instrumentation): Windowsのシステム情報を管理するためのインフラストラクチャです。VBAからSQLライクなクエリを用いて、実行中のプロセス一覧やリソース消費量を容易に取得できます。
遅延バインディング (Late Binding): CreateObject や GetObject を使用することで、特定のタイプライブラリ(Microsoft WMI Scripting V1.5 Library等)への参照設定が不要になり、他PCでの動作互換性が高まります。
APIによるSleep: VBA標準の Wait メソッドは秒単位でしか指定できませんが、Win32 APIの Sleep を使うことでミリ秒単位の制御が可能になり、監視間隔を柔軟に調整できます。
【注意点と運用】
CPU負荷への配慮: 監視間隔が短すぎると(例:100ms以下)、監視処理自体がCPUリソースを消費します。業務アプリへの影響を避け、通常は1〜5秒程度の間隔を推奨します。
管理者権限: 一部のシステムプロセス情報を取得する場合、Excel自体を「管理者として実行」する必要がある場合があります。
例外処理: ネットワーク経由でリモートPCを監視する場合、タイムアウトや接続拒否のトラップを必ず実装してください。
【まとめ】
WMIを活用することで、外部ツールを使わず標準VBAのみで高度なシステム監視が可能になる。
PtrSafe を含むWin32 API宣言により、最新の64bit Office環境でも安定動作を担保する。
異常検知後のアクション(強制終了、管理者への通知、ログ記録)を組み合わせることで、運用の自動化が完結する。
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント