Project VBAを掌握する極限の知見:リソース稼働率ヒートマップガントの構築
シニアエンジニア、そして社内システムをその手腕で支える管理者諸君。日々のプロジェクトマネジメントにおいて、Microsoft Projectの標準機能に限界を感じたことはないだろうか。
特に「リソースの稼働率(過負荷・遊休)」の可視化において、標準ビューはあまりにも無機質で、直感的なアラートを捉え損ねる。リソースプールを横断し、数千タスクを抱える巨大プロジェクト群(Mpp)を統括するアーキテクトにとって、リソースの過負荷(Overallocated)を視覚的に即座に把握できないことは、プロジェクト破綻へのカウントダウンを意味する。
今回は、Project VBAのオブジェクトモデルの深淵に潜り込み、カスタムフィールドと連動してガントチャート上のバーを動的に色分け(ヒートマップ化)する極限の拡張ツールの設計図と実装を公開する。
レガシーなVBAの限界を突破し、メモリリークを完全に封殺しながら、Windows APIをも巻き込んだ高速描画エンジンの全貌を体感せよ。
—
1. アーキテクチャの核心:なぜ標準機能では不十分なのか
MS Projectには「リソース使用状況」ビューや過負荷インジケーターが存在する。しかし、これらは「ガントチャート上で、どのタスクがどのリソースの過負荷を引き起こしているか」を時系列のバーの色として直接表現してくれない。
われわれが目指すのは、各リソースのタスク単位の稼働率(Peak Units または Work/Duration の比率)をリアルタイムに計算し、カスタムテキストフィールド(Text1〜30)に色コードを流し込み、ガントバーのスタイルを動的に書き換える仕組みだ。
ここで立ちはだかるのが、VBAのパフォーマンスの壁と、COMオブジェクトのライフサイクル管理の罠である。数千件のタスクとアサインメント(Assignment)を安易にループさせれば、Projectはフリーズし、最悪の場合はメモリリークによってExcelやProjectのプロセスがゾンビ化する。
この課題をクリアするための極限の最適化コードを以下に提示する。
—
2. 実装:リソース稼働率算定・色分けエンジン
以下のコードは、アクティブなプロジェクトの全アサインメントを走査し、リソースの稼働率(標準稼働時間に対する割り当て率)を算出してカスタムフィールド(例: `Text10`)にカラーコード(HEX)を書き込むモジュールである。
Option Explicit
‘ —————————————————————————
‘ 業務自動化アーキテクチャ特記事項:
‘ オブジェクトの解放を怠ったCOMラッパーは、即座にメモリリークを引き起こす。
‘ Set obj = Nothing の徹底と、コレクション参照の局所化が生存の条件である。
‘ —————————————————————————
Public Sub UpdateResourceWorkloadHeatmap()
Dim prj As Project
Set prj = ActiveProject
‘ 画面描画とイベントを完全に抑制し、実行速度を極限まで引き上げる
Application.ScreenUpdating = False
Application.Calculation = pjManual
On Error GoTo ErrorHandler
Dim tsk As Task
Dim asn As Assignment
Dim res As Resource
Dim workloadRatio As Double
Dim colorHex As String
‘ タスクループ
For Each tsk In prj.Tasks
If Not tsk Is Nothing Then
If Not tsk.Summary Then
‘ タスクに割り当てられたリソースの最大稼働率を評価
workloadRatio = 0#
For Each asn In tsk.Assignments
Set res = asn.Resource
If Not res Is Nothing Then
‘ Units(単位)を基準とした負荷率を算出(例: 100%超えを検知)
If asn.Units > workloadRatio Then
workloadRatio = asn.Units
End If
Set res = Nothing
End If
Set asn = Nothing
Next asn
‘ 稼働率に応じたカラーコード(HEX)の決定
‘ 0-80%: 緑 (#00B050), 81-100%: 黄 (#FFC000), 101%以上: 赤 (#C00000)
If workloadRatio <= 0.8 Then
colorHex = "#00B050"
ElseIf workloadRatio <= 1# Then
colorHex = "#FFC000"
Else
colorHex = "#C00000"
End If
' カスタムフィールド(Text10)に色コードを格納
' ※MS Projectのガントバー書式設定でText10を条件付き色として参照させる
tsk.Text10 = colorHex
End If
End If
Set tsk = Nothing
Next tsk
CleanUp:
' 状態の復元
Application.Calculation = pjAutomatic
Application.ScreenUpdating = True
MsgBox "リソース稼働率ヒートマップの更新が完了しました。", vbInformation, "Architect Engine"
Exit Sub
ErrorHandler:
MsgBox "致命的なエラーが発生しました: " & Err.Description, vbCritical, "System Error"
Resume CleanUp
End Sub
コードの解説とアーキテクチャ上のこだわり
1. パフォーマンスの極限追求 (`ScreenUpdating` と `Calculation`):
大規模プロジェクトでは、1つの値を変えるたびにガントの再描画や再計算が走り、実行時間が幾何級数的に増大する。手動計算モードへの切り替えは必須の定石である。
2. オブジェクトの明示的解放 (`Set … = Nothing`):
VBAのガベージコレクションは頼りにならない。ループ内で生成される `Assignment` や `Resource` オブジェクトをループ毎に確実に解放しなければ、数千行の処理でメモリ消費量が跳ね上がる。
—
3. 高度な応用:Windows API を活用したUIの強制リフレッシュとシステム間連携
VBA標準の画面更新抑制(`ScreenUpdating = False`)を解除した際、OSの描画スレッドが追いつかず、ガントチャートの表示が崩れる現象(ゴースト描画)に直面したシニアエンジニアも多いはずだ。
これを完璧に調停するため、Windows APIを用いてウィンドウの再描画を強制するテクニックを導入する。さらに、外部のERPや人事システムから取得した最新の「リソース稼働カレンダー(JSON/CSV)」をAPI経由でProjectに流し込むブリッジの設計思想に触れておこう。
‘ 32ビット/64ビット環境の両方に対応するAPI宣言
If VBA7 Then
Private Declare PtrSafe Function UpdateWindow Lib “user32” (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetActiveWindow Lib “user32” () As LongPtr
Else
Private Declare Function UpdateWindow Lib “user32” (ByVal hwnd As Long) As Long
Private Declare Function GetActiveWindow Lib “user32” () As Long
End If
‘ 描画の強制同期
Public Sub ForceRedrawProjectWindow()
Dim hWnd As LongPtr
hWnd = GetActiveWindow()
If hWnd <> 0 Then
Call UpdateWindow(hWnd)
End If
End Sub
レガシー環境・外部連携における知見
エンタープライズ領域では、MS Projectは孤立したツールではなく、基幹系システム(SAPや独自Web-API)と連携してこそ真価を発揮する。
VBAから直接HTTPリクエスト(`MSXML2.ServerXMLHTTP.6.0`など)を飛ばして外部リソースの稼働制限マスタを取得し、上記のリソースプール(`ActiveProject.Resources`)へ動的に反映させるパイプラインを構築することが可能だ。
非同期処理を持たないVBAにおいて、通信遅延やタイムアウトのハンドリングは堅牢に行う必要がある。エラー発生時はローカルキャッシュ(CSV/XML)にフォールバックする耐障害性(Resilience)の設計こそが、プロフェッショナルの仕事である。
—
4. チーフアーキテクトからの提言
Project VBAは、正しく飼いならせば、数千万円規模の市販PMツールをも凌駕する超高速かつカスタマイズ性の高いカスタムマネジメントプラットフォームへと変貌する。
今回紹介した「稼働率の可視化と動的ヒートマップ化」は、単なる見た目の化粧直しではない。プロジェクトのボトルネックを視覚的ノイズなしに炙り出し、手遅れになる前にリソースの再配分(レベリング)を行うための攻めのエンジニアリングである。
泥臭いレガシーコードの維持に甘んじるな。オブジェクトのライフサイクルを支配し、メモリを極限まで最適化した真のVBAソリューションで、プロジェクトの未来をコントロールせよ。
