【テクニカル・上級編】Assignment.WorkContourを操作して「フロントローディング」型の工数配分を自動適用する – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握する極限の知見:`Assignment.WorkContour` による「フロントローディング」工数配分の自動化

Microsoft ProjectのVBA開発において、多くの開発者が直面する壁のひとりが「リソースの稼働率と工数配分(Work Contour)の制御」である。

標準のGUI操作では数クリックで完了する作業配分の変更も、数千行に及ぶWBS(Work Breakdown Structure)を抱える大規模プロジェクトにおいて、それを手動で行うことは非現実的だ。特に、プロジェクトの初期段階にリソースとコストを集中させる「フロントローディング(Front-Loading)」の適用は、リスクの早期顕在化と手戻りの防止において極めて重要な意味を持つ。

今回は、Project VBAのオブジェクトモデルの深部をハックし、`Assignment.WorkContour` を駆使してプログラム側から一括でフロントローディング型の工数配分を流し込む極限のテクニックを、実用的なコードとともに解説する。

—

1. 標準機能の限界と `WorkContour` のメカニズム

Microsoft Projectにおける「作業配分(Contour)」とは、タスク期間中における工数(Work)の分散アルゴリズムを指す。デフォルトの「フラット(Flat)」配分は、期間を通じて均等に工数が割り振られるが、実際のエンジニアリングや建設の現場では、着手時にリソースを集中投下する「前倒し(Front Loaded)」が好まれる。

VBAからこれを操作する場合、`Assignment` オブジェクトの `WorkContour` プロパティに対して定数(`pjWorkContourFrontLoaded` など)を代入することになる。

しかし、シニアエンジニアが知るべき重大な事実として、単にコンター定数を変更しただけでは、Projectのスケジュールエンジンが再計算を走らせる過程で値が上書きされる、あるいは意図した工数の山が形成されないケースが多々あるという点だ。これを完全に制御するためには、オブジェクトのライフサイクルを理解し、適切なタイミングで再計算とメモリの解放を明示的に行う必要がある。

—

2. 【実装】フロントローディング自動適用エンジン

以下に、選択されたタスク、あるいはプロジェクト全体の全アサインメントに対し、高速かつ確実にフロントローディングの工数配分を適用するVBAプロシージャを示す。

メモリリークを防ぐためのオブジェクト解放処理、およびパフォーマンスを最大化するための画面描画抑制(`ScreenUpdating`)を実装したプロダクション・グレードのコードである。

Option Explicit

‘ =================================================================================
‘ モジュール名: modFrontLoader
‘ 概要: Microsoft Project リソースアサインメントのワークコンター制御モジュール
‘ 著作権: Enterprise Project Management Architecture
‘ =================================================================================

Public Sub ApplyFrontLoadingToProject()
Dim prj As Project
Set prj = ActiveProject

‘ パフォーマンス最適化の極意:画面描画と自動計算を一時停止
‘ これを行わないと、1アサインメントごとの描画コストで処理が数倍遅延する
App.ScreenUpdating = False

Dim originalCalculation As Long
originalCalculation = prj.Calculation
prj.Calculation = pjCalcManual ‘ 手動計算モードへ切り替え

On Error GoTo ErrorHandler

Dim tsk As Task
Dim asn As Assignment
Dim processedCount As Long
processedCount = 0

‘ トランザクション処理の開始(進捗ログ出力用)
Debug.Print “=== フロントローディング配分処理を開始: ” & Now & ” ===”

‘ プロジェクト内の全タスクを走査
For Each tsk In prj.Tasks
‘ サマリタスク(概要タスク)やマイルストーンを除外
If Not tsk Is Nothing Then
If Not tsk.Summary And tsk.Milestone = False And tsk.Active Then

‘ タスクに紐付くリソースアサインメント(Assignment)を走査
For Each asn In tsk.Assignments
‘ 既に完了しているアサインメントは触らない
If asn.ActualWork = 0 Then

‘ 1. ワークコンターを「前倒し (Front Loaded)」に変更
asn.WorkContour = pjWorkContourFrontLoaded

‘ 2. カスタムな工数配分を強制的に固定化する場合の処理
‘ ※必要に応じてタイムフェーズドデータ(TimephasedData)の操作をここに挿入

processedCount = processedCount + 1
End If

‘ ループ内でのメモリ解放(参照の破棄)
Set asn = Nothing
ForNext:
End If
End If
End If
Set tsk = Nothing
Next tsk

‘ 変更を反映するために再計算を実行
prj.Calculation = originalCalculation
prj.Calculate

Debug.Print “=== 処理完了: 累計 ” & processedCount & ” 件のアサインメントを更新しました。 ===”

CleanUp:
‘ 確実に環境を元に戻す
App.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “FrontLoader Engine”

‘ エラー時も確実に設定を復旧
prj.Calculation = originalCalculation
App.ScreenUpdating = True
Resume CleanUp
End Sub

—

3. チーフアーキテクトが教える「極限の知見」とシステム連携

上記のコードは基本形に過ぎない。真に堅牢なエンタープライズ環境のシステムを構築する場合、以下のアーキテクチャ的配慮が不可欠となる。

A. タイムフェーズドデータ(TimephasedData)との死闘

`pjWorkContourFrontLoaded` は標準アルゴリズムによる前倒し配分を行うが、PMO(Project Management Office)から「最初の3日間で全体の60%、残りを均等に」といった厳密な数理モデルでの配分を要求されることがある。
その場合、`Assignment.TimephasedData` コレクションに対し、直接工数(Work)を書き込むループ処理を実装する必要がある。この際、Projectの内部カレンダー(稼働日・非稼働日)を考慮しないと、休日に関わらず工数が割り振られ、スケジューリングエンジンが破損(破損ファイル化)する原因となるため注意されたし。

B. COMコンポーネントのメモリ管理

VBAにおけるオブジェクト変数の解放(`Set obj = Nothing`)は、ガベージコレクションを持たないVBAランタイムにおいて生命線である。特に `For Each` ループ内でコレクションオブジェクトを多用する場合、VBAの内部ポインタがメモリリークを起こし、数千件の処理の途中で「メモリ不足(Error 7)」でクラッシュする。
上記のコード例の通り、ループのスコープごとに確実に参照を切断するコーディング規準を徹底すべきである。

C. 外部システム(ERP/基幹システム)との連携

フロントローディングで最適化された工数・コストデータは、SAPなどのERPシステムにおけるキャッシュフロー予測のインプットとして活用されるべきだ。VBA単体で完結させるのではなく、決定されたアサインメントデータをADODB経由でSQL ServerやOracleにJSON/XML形式でストリーミング出力するパイプラインを構築することで、真の「プロジェクト管理と経営数値の同期」が達成される。

—

総括

Project VBAにおけるリソースとコストのコントロールは、単なるAPIの呼び出しではない。Microsoft Projectのスケジューリング・エンジンの挙動を完全にハックし、その内部ロジックと調和させながら自動化を施す高度なエンジニアリング領域である。

今回解説した `Assignment.WorkContour` の制御とパフォーマンス最適化の知見を武器に、あなたの組織のプロジェクト管理基盤を、次元の違うレベルへと引き上げてほしい。

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