プロジェクト管理を自動化せよ:Project VBAで構築する「リソース過負荷アラート」の極意
こんにちは。現場の最前線でコードを書き続けるアーキテクトです。
多くのプロジェクト管理者が、ExcelやProjectの画面を睨みつけ、「誰かがパンクしていないか」を必死に確認しています。しかし、人間が監視するシステムは必ず見落としを生みます。
今回は、Project VBAの真髄である「オブジェクトモデルの操作」と「外部アプリとの連携」を使い、リソースの稼働率が100%を超えた瞬間にOutlookで警告メールを飛ばす、自動監視システムの作り方を伝授します。
マクロの記録から一歩踏み出し、真の「自動化エンジニア」への扉を開きましょう。
—
1. なぜ「稼働率」を監視するのか?
プロジェクト管理において、リソースは有限の資産です。稼働率が100%を超えている状態は、いわゆる「火を噴いている」状態。これを検知して即座に担当者へアラートを出すことは、プロジェクトの遅延リスクを未然に摘む、最も高尚なエンジニアリングの一つです。
2. 実装の設計図:Project VBAの構成
今回利用する主要なオブジェクトは以下の3つです。
1. `ActiveProject.Resources`: プロジェクト内の全リソースを管理するコレクション。
2. `Resource.Work` / `Resource.PercentAllocation`: 稼働率を算出するための鍵となるプロパティ。
3. `Outlook.Application`: 外部アプリを制御するためのオブジェクト(要参照設定)。
—
3. 実装コード:過負荷検知アラートシステム
以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。
事前準備
VBAエディタの「ツール」→「参照設定」から、「Microsoft Outlook XX.0 Object Library」にチェックを入れてください。これがないとOutlookは動きません。
Sub SendResourceOverloadAlert()
Dim res As Resource
Dim olApp As Object
Dim olMail As Object
‘ Outlookオブジェクトの生成(早期バインディング推奨)
Set olApp = CreateObject(“Outlook.Application”)
‘ 全リソースをループで走査
For Each res In ActiveProject.Resources
‘ 稼働率が100%を超えているかチェック
‘ PercentAllocationは稼働率を数値で保持している
If res.PercentAllocation > 100 Then
‘ アラートメールの作成
Set olMail = olApp.CreateItem(0)
With olMail
.To = “manager@example.com” ‘ 送信先
.Subject = “【警告】リソース過負荷検出: ” & res.Name
.Body = “警告:” & vbCrLf & _
“リソース名: ” & res.Name & vbCrLf & _
“現在の稼働率: ” & res.PercentAllocation & “%” & vbCrLf & _
“至急、タスクの割り当て状況を確認してください。”
.Send ‘ 自動送信(テスト時は .Display に変更すること)
End With
Debug.Print “アラート送信完了: ” & res.Name
End If
Next res
‘ メモリ解放
Set olMail = Nothing
Set olApp = Nothing
End Sub
—
4. コードの解説:ここが「プロの視点」
1. `For Each` ループの重要性
リソースの数が増減しても壊れないコードを書くには `For Each` が最強です。`For i = 1 To 10` のような添字管理はバグの温床です。Project VBAでは「オブジェクトそのもの」を回す癖をつけましょう。
2. オブジェクトのライフサイクル管理
最後に `Set = Nothing` を行っていることに注目してください。VBAはメモリ管理が緩い言語ですが、外部アプリ(Outlook)を操作する際は、必ず明示的に解放する。これが、長時間稼働させてもクラッシュしない堅牢なツールを作る秘訣です。
3. 「マクロの記録」に頼らない理由
Project VBAには「マクロの記録」機能がありません。つまり、最初から自分でオブジェクトを調べる必要があるのです。これが逆に、プロフェッショナルなスキルを磨く最高の環境になっています。
—
5. 初学者が陥りやすいエラーと対策
- 「オブジェクトが取得できません」
- 原因:参照設定の忘れ、またはOutlookが起動していない。
- 対策:`CreateObject` を使えばプロセスを自動生成できますが、やはり参照設定は基本です。
- 「稼働率が正しく取れない」
- 原因:リソースの種類が「作業」ではなく「材料」になっている。
- 対策:`res.Type` プロパティをチェックし、`pjResourceTypeWork` (作業リソース)のみを対象にフィルタリングしましょう。
—
最後に:自動化の先にあるもの
このスクリプトは、あなたの代わりに24時間プロジェクトを監視する「監視塔」になります。ここをクリアすれば、次は「特定のタスクが遅延した時にSlackへ通知する」といった応用も容易でしょう。
自動化の本質は、「人間がやらなくていいことは、すべてコードに押し付ける」ことにあります。
あなたが空いた時間で、よりクリエイティブな「プロジェクトの進め方」を考える時間を作れること。それこそが、このコードの真の価値です。さあ、次はどんな面倒な作業をコードに置き換えましょうか?
