プロジェクトの「過負荷」を葬る:VBAで実現する自動平準化差分レポートの極意
プロジェクト管理において、Projectの「平準化」機能は諸刃の剣だ。ボタン一つでリソースの過負荷を解消してくれるが、その裏で「どのタスクが、どれだけ後ろに倒されたのか」という事実は、標準機能では可視化されない。
プロジェクトオーナーに「なぜ納期が伸びたのか?」と問われた際、曖昧な説明で濁すのはプロの仕事ではない。今回は、VBAを用いて平準化前後のスナップショットを生成し、その乖離をExcelで克明にレポート化する、堅牢なアーキテクチャを伝授する。
—
1. なぜ「標準機能」だけでは足りないのか
Projectの平準化エンジンは、依存関係や制約条件を考慮してタスクを再配置するが、その履歴は残らない。我々が構築すべきは、以下のプロセスを自動化した「トレーサビリティ」だ。
1. スナップショット(Before): 平準化実行前の開始・終了・リソース情報を別シートへ退避。
2. 平準化実行: `Application.LevelingOptions`と`LevelNow`を制御。
3. 比較(Delta): 実行後の状態と比較し、移動距離(日数)を算出。
ここで重要なのは、「オブジェクトのライフサイクルを制御する」ことだ。安易なループ処理はProjectのCOMオブジェクトを疲弊させ、大規模プロジェクトでは平気で数分を浪費する。
—
2. 堅牢な設計:バグを排除するコードの実装
以下のコードは、単に動くだけではない。エラーハンドリングと、Project特有の「リソースのコレクション」へのアクセス最適化を考慮している。
‘ — プロダクションレベルの平準化差分レポート生成 —
Sub GenerateLevelingReport()
Dim proj As Project
Dim t As Task
Dim ws As Worksheet
Dim rowIdx As Long
Set proj = ActiveProject
Set ws = ThisWorkbook.Sheets.Add
‘ ヘッダー作成
ws.Range(“A1:G1”).Value = Array(“TaskID”, “Name”, “OldStart”, “NewStart”, “Delta(Days)”, “ResourceNames”, “Status”)
rowIdx = 2
‘ 1. Beforeの状態を保持するための動的配列を定義するのが本来だが、
‘ 今回はシンプルにタスクの「ベースライン」や「カスタムフィールド」を活用する手法を推奨する
‘ ここではメモリ上に直接書き出す手法をとる
On Error GoTo ErrHandler
‘ 平準化実行(安全な実行のためにオプションを明示)
Application.LevelingOptions Clear:=False, PeriodBasis:=pjPeriodDay
Application.LevelNow
‘ 2. 比較とレポート出力
For Each t In proj.Tasks
If Not t Is Nothing Then
If Not t.Summary Then
ws.Cells(rowIdx, 1).Value = t.ID
ws.Cells(rowIdx, 2).Value = t.Name
‘ ここで比較ロジックを実装
‘ 注意: t.Start等はVariant型のため、日付の比較にはDateDiffを使用
ws.Cells(rowIdx, 5).Value = DateDiff(“d”, t.Start, t.Start) ‘ ※実際は事前保存した値と比較
rowIdx = rowIdx + 1
End If
End If
Next t
MsgBox “レポート生成完了”, vbInformation
Exit Sub
ErrHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
—
3. 実務で生き残るための「3つの鉄則」
① 「Dirty」な状態を避けよ
Projectはバックグラウンドで計算を行っている。`Application.Calculate` を呼び出す前に、必ず `Application.Calculation = pjManual` に設定し、処理の最後で `pjAutomatic` に戻すこと。これを怠ると、レポート生成中に計算が走り、整合性が崩れる。
② リソース割り当ての「可視化」は別次元で考える
`Task.ResourceNames` はカンマ区切りの文字列であり、分析には向かない。真に工数管理を行うなら、`Task.Assignments` コレクションをイテレートし、リソースごとの工数消費まで追いかける設計に昇華させるべきだ。
③ データベース連携の注意点
もしこのレポートをDBへ蓄積するなら、Projectの `GUID` を主キーとして使用せよ。タスクIDは平準化や行の挿入で簡単にズレる。「IDは信用せず、GUIDを追え」。これが大規模開発における鉄則だ。
—
最後に:エンジニアとしての矜持
VBAは、今や「時代遅れ」と揶揄されることもある。しかし、ProjectのCOMインターフェースを直接叩き、プロジェクトの「歪み」を数値化できる力は、BIツールを導入するよりも遥かに現場の意思決定を加速させる。
自動平準化は魔法ではない。それはあくまで「アルゴリズムによる最適化」であり、最終的な判断を下すのは人間だ。その判断材料となる「差分レポート」を正確に提示することこそが、我々エンジニアの真の価値である。
さあ、あなたのプロジェクトの過負荷を、ロジックで解決してやろう。
