【実務・中級編】リソースの「過負荷」をメールで自動通知するVBAアラートシステム – Project VBA解析バイブル

スポンサーリンク

【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` ではなく、テキストファイルへ実行ログを出力するルーチンを追加せよ。誰がいつ、どのリソースでアラートを受けたのか。この証跡こそが、大規模プロジェクトにおける君の身を守る盾となる。

リソース管理は、単なる数値合わせではない。「プロジェクトの血流を止めないための外科手術」だ。
このコードをベースに、君自身の現場に即した「最強の防波堤」を築き上げろ。健闘を祈る。

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