Project VBAを掌握する極限の知見:`Assignment.WorkContour`で実現する「フロントローディング」型工数配分の全自動化
プロフェッショナルな現場において、Microsoft Projectを使ったスケジュール管理が「絵に描いた餅」になる最大の原因を知っているか?
それは、タスク期間に対してリソースの工数が一律(フラット)に均等割り付けされるデフォルトの挙動をそのまま放置しているからだ。
人間の心理的バイアスとして、プロジェクト初期は「まだ時間がある」と錯覚し、終盤にリソースが枯渇してデスマーチ化する。この構造的欠陥をVBAで叩き潰し、計画の初速を最大化するのが「フロントローディング(山型・前倒し型)工数配分」の自動適用である。
今回は、Project VBAの隠れたキラープロパティである `Assignment.WorkContour` を完全調教し、実務の現場で絶対に破綻しない堅牢な自動化コードを授けよう。
—
1. なぜ手動操作や標準機能では「真のフロントローディング」が組めないのか?
MS Projectには標準で「山型(Bell)」「早期ピーク(Early Peak)」といった作業形態(Work Contour)のプリセットが存在する。しかし、実務の現場でこれらをGUIから一つひとつ手動設定するのは、エンジニアの労力の無駄遣いだ。さらに、タスクの期間(Duration)や総工数(Work)が変更されるたびに、contour(輪郭)の再設定や微調整が必要になる。
VBAを用いてプログラム側から制御する場合、最大の罠となるのが「リソース割り当て(Assignment)オブジェクトのライフサイクル」だ。タスクにリソースを割り当てた直後、MS Projectの内部エンジンは非同期的に計算処理を行う。このタイミングを無視して `WorkContour` を書き換えようとすれば、エラー 1100(指定された引数は有効ではありません)が容赦なく叩きつけられる。
我々は、このエンジンの挙動を完全にハックし、一括処理であっても1ミリのズレも許さない堅牢なアーキテクチャを構築しなければならない。
—
2. 堅牢な設計思想:バグを排除する3つの鉄則
実務でそのまま使えるコードを書くために、以下の設計思想をコードにブレス(魂)として吹き込む。
1. 画面描画と計算の完全凍結 (`ScreenUpdating`, `Calculation`)
大規模なプロジェクトファイルにおいて、アサインメントを走査するたびにMS Projectが再計算を走らせると、実行時間が数分に跳ね上がる。これを完全に封殺する。
2. 割り当て存在確認とエラーハンドリング
「タスクはあるがリソースがアサインされていない」状態のレコードを弾くガード節を必ず設ける。
3. カスタムワークコントアの適用順序の厳守
`pjContourEarlyPeak`(早期ピーク)または `pjContourTurtle` などの定数を適用する際、あらかじめ `Work`(工数)と `Duration`(期間)が確定していなければならない。
—
3. 実装コード:フロントローディング自動適用エンジン
以下のコードは、アクティブなプロジェクト内の全タスク・全アサインメントに対し、工数を初期に集中させる「早期ピーク(Early Peak)」を一括適用するプロダクションコードだ。コピペし、そのままモジュールに貼り付けてほしい。
‘ ==============================================================================
‘ ódulo名: ModAssignmentContour
‘ 概要 : 全アサインメントの作業形態を「早期ピーク(フロントローディング)」に一括変換する
‘ 著作者 : チーフアーキテクチャエンジニア
‘ ==============================================================================
Sub ApplyFrontLoadingContours()
Dim tsk As Task
Dim asn As Assignment
Dim targetCount As Long
‘ 1. パフォーマンス最大化のための環境設定
On Error GoTo ErrorHandler
Application.ScreenUpdating False
Application.Calculation 0 ‘ pjManual (手動計算モードへ移行)
targetCount = 0
‘ 2. プロジェクト内の全タスクを走査
For Each tsk In ActiveProject.Tasks
‘ サマリータスク(親タスク)やマイルストーンは除外
If Not tsk Is Nothing Then
If Not tsk.Summary And tsk.Milestone = False Then
‘ タスクに割り当てられているリソース(Assignments)を走査
For Each asn In tsk.Assignments
If Not asn Is Nothing Then
‘ 【重要】すでに固定WorkContourでない場合のみ適用
‘ ここでは強制的に早期ピーク (pjContourEarlyPeak) を適用
‘ ※ 必要に応じて pjContourBell や pjContourTurtle に変更可能
asn.WorkContour = pjContourEarlyPeak
targetCount = targetCount + 1
End If
Next asn
End If
End If
Next tsk
‘ 3. 正常終了時のクリーンアップ
Application.Calculation 1 ‘ pjAutomatic (自動計算に戻す)
Application.ScreenUpdating True
MsgBox “フロントローディングの適用が完了しました。” & vbCrLf & _
“処理対象アサインメント数: ” & targetCount & ” 件”, _
vbInformation, “VBAアーキテクチャ・インスペクター”
Exit Sub
ErrorHandler:
‘ 4. 異常系ハンドリング(環境を必ず復元する)
Application.Calculation 1
Application.ScreenUpdating True
MsgBox “致命的なエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, _
vbCritical, “実行時エラー”
End Sub
—
4. コードの解説と実務適用のポイント
- `pjContourEarlyPeak` の選択:
この定数は、タスクの前半に労働時間が偏るように配分を強制する。これにより、プロジェクトの早期段階でリスクやバグを炙り出す「シフトレフト(フロントローディング)」が機械的に担保される。
- サマリータスクの完全排除:
プロジェクト管理において、サマリータスク自体にリソースを直接アサインするのは御法度だ(工数の二重計上やスケジュール崩壊の原因になる)。コード内の `If Not tsk.Summary` によって、実作業を行う末端タスク(Leaf Task)のみを安全にフィルタリングしている。
- トランザクション的思考の徹底:
エラー発生時に `ScreenUpdating` や `Calculation` がオフのままフリーズすると、ユーザーは二度と保存できない破損ファイルに向き合うことになる。`On Error GoTo ErrorHandler` を用いて、いかなる例外時でも必ずアプリケーションの状態を原状復帰させる設計にしている点は、プロのコードの絶対条件だ。
—
5. 発展:外部データベースやExcelからのパラメータ駆動型へ
実際の現場では、すべてのタスクに一律で「早期ピーク」を適用するわけではない。例えば、要件定義フェーズはフラット、開発フェーズはフロントローディング、テストフェーズは後方集中型(Late Peak)といったように、フェーズごとに動的に制御すべきだ。
その場合、Excelのマスター定義シートや外部DB(SQL Server等)からフェーズ名や WBS コードをキーとして読み込み、`Select Case` 構文で `asn.WorkContour` の値を動的に切り替えるラッパー関数を構築するとよい。
‘ フェーズに応じた動的コントア設定のイメージ
Select Case tsk.OutlineCode1 ‘ 例: アウトラインコード1をフェーズ識別子とする
Case “要件定義”
asn.WorkContour = pjContourFlat
Case “設計・開発”
asn.WorkContour = pjContourEarlyPeak
Case “テスト”
asn.WorkContour = pjContourLatePeak
Case Else
asn.WorkContour = pjContourDefault
End Select
—
総括
スケジュールとは、祈るものではなく、ロジックで構築し、コードで強制するものである。
`Assignment.WorkContour` を手なづけることで、あなたのプロジェクト管理は「属人的な希望的観測」から「数理的かつ再現性の高いオペレーション」へと進化する。
現場のエンジニアやPMが頭を悩ませる工数配分の手間をこのVBAコードで一掃し、真に価値のあるマネジメント業務に集中してほしい。
