【Project VBA】リソース過負荷を「自動検知」せよ:堅牢なアラートシステム設計論
現場のエンジニア諸君。君たちのプロジェクトで、リソースの稼働率は「誰かが手動でExcelを見ている」状態ではないか?
もしそうなら、それは「管理」ではなく「ただの監視」だ。プロジェクトが炎上する予兆をメールで自動通知する。これが、自動化エンジニアが実装すべき最初の防波堤である。
今回は、Project VBA(Excel上でプロジェクト管理を完結させる手法)における、「稼働率100%超えリソースのアラートシステム」の構築論を伝授する。
—
1. なぜ「単純なループ」で設計してはいけないのか
多くの駆け出しエンジニアは、単にセルをループして値を判定し、その場で `Outlook.Application` を起動するコードを書く。これは悪手だ。
- リソース消費の肥大化: ループのたびにOutlookインスタンスを生成すれば、メモリは即座に枯渇する。
- 運用上のノイズ: アラートが「過剰」に飛ぶと、担当者はそのメールをスパム扱いして無視するようになる。
- 保守性の欠如: ロジック(判定)とインフラ(メール送信)が密結合しており、環境変更に対応できない。
我々が目指すべきは、「判定ロジックと通信レイヤーの分離」、そして「状態管理」だ。
—
2. 堅牢な設計の要諦
以下の3点だけは死守せよ。
1. Late Binding(遅延バインディング)の採用: 参照設定に依存しない。クライアントのOutlookバージョンが異なっても動くコードを書くのがプロだ。
2. フラグ管理による抑制: 同じ過負荷状態に対して、1回のアラートで留める仕組み(前回の判定結果を隠しセル等に保持)を必ず実装せよ。
3. エラーハンドリングの徹底: メール送信の失敗が、全体の処理を止めない設計にする。
—
3. 実践:プロダクションコード
以下のコードは、`Resource`シートの「稼働率(列C)」を走査し、100%を超えたリソースに対して警告を投げるモジュールである。
Option Explicit
‘ プロジェクト管理の要:リソース監視メイン処理
Public Sub CheckResourceLoadAndAlert()
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim resourceName As String, loadRate As Double
Set ws = ThisWorkbook.Sheets(“Resource”)
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
‘ 効率的なループ処理
For i = 2 To lastRow
resourceName = ws.Cells(i, 1).Value
loadRate = ws.Cells(i, 3).Value ‘ C列に稼働率
‘ 稼働率100%超 かつ 既に通知済みフラグ(D列)が立っていない場合のみ実行
If loadRate > 1.0 And ws.Cells(i, 4).Value <> “Sent” Then
If SendAlertMail(resourceName, loadRate) Then
ws.Cells(i, 4).Value = “Sent” ‘ 通知済みフラグを立てる
End If
End If
Next i
End Sub
‘ 汎用メール送信関数(Late Binding)
Private Function SendAlertMail(ByVal resName As String, ByVal rate As Double) As Boolean
Dim olApp As Object
Dim olMail As Object
On Error GoTo Cleanup ‘ 異常系への備え
‘ Outlookのインスタンス取得(起動していなければ作成)
Set olApp = CreateObject(“Outlook.Application”)
Set olMail = olApp.CreateItem(0)
With olMail
.To = “manager@example.com”
.Subject = “【警告】リソース過負荷検知:” & resName
.Body = “警告:” & resName & ” の稼働率が ” & Format(rate, “0%”) & ” に達しました。” & vbCrLf & _
“至急、タスクの再割り当てを検討してください。”
.Send
End With
SendAlertMail = True
Cleanup:
Set olMail = Nothing
Set olApp = Nothing
End Function
—
4. エンジニアが意識すべき「保守の美学」
上記のコードには、「フラグ(D列:Sent)」が存在する。これが重要だ。
もしこれを怠れば、VBAが動くたびに担当者のメールボックスはアラートで埋め尽くされ、君のツールは「業務を妨害するツール」へと成り下がる。
さらなる高みを目指すなら
- データベース連携: Excelシートが重くなってきたら、SQLiteやSQL Serverへ移行できる設計にしておくこと。判定ロジックを関数化しておけば、データソースが変わってもコードの9割は流用できる。
- ログ出力: `Debug.Print` ではなく、テキストファイルへ実行ログを出力するルーチンを追加せよ。誰がいつ、どのリソースでアラートを受けたのか。この証跡こそが、大規模プロジェクトにおける君の身を守る盾となる。
リソース管理は、単なる数値合わせではない。「プロジェクトの血流を止めないための外科手術」だ。
このコードをベースに、君自身の現場に即した「最強の防波堤」を築き上げろ。健闘を祈る。
