【テクニカル・上級編】Assignmentオブジェクトの「WorkContour」をVBAで制御し工数配分を最適化する – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:Assignment.WorkContourを制御する工数配分の最適化術

Project VBAを扱うエンジニアの多くは、単に「タスクの開始日と終了日を書き込む」というレベルで止まっている。しかし、真の工数管理は「期間内にリソースがどう投入されるか」というWorkContour(工数配分)の制御にある。

Projectのデフォルトである「平準化(Flat)」は、現実のプロジェクトの呼吸を殺す。山型(Back-loaded)や前倒し(Front-loaded)の配分を自動化できなければ、スケジューラはただの静的な表でしかない。

今日は、ProjectのAssignmentオブジェクトを操作し、WorkContourをプログラムで制御する「極限の知見」を伝授する。

—

1. WorkContourという名の「ブラックボックス」を紐解く

Project Object Modelにおける `Assignment.WorkContour` プロパティは、単なる列挙型ではない。これは、タスクの期間内における工数の密度を決定づける「配分曲線(Contour)」を定義するものである。

手動で操作する際、多くのユーザーは「コンター」のプルダウンメニューから山型や釣鐘型を選択するが、VBAでこれを一括設定するには `pjAssignmentContour` 列挙体を使用する。

注意すべき「罠」

この操作はProjectの計算エンジン(再スケジュール)を強制的に再実行させる。数千件のAssignmentをループ処理する際、不用意に `Application.Calculation = pjManual` を怠れば、パフォーマンスは指数関数的に劣化する。

—

2. 工数配分を最適化する実装コード

以下のコードは、指定したタスクに含まれる全リソースに対し、特定の工数配分を一括適用するアーキテクチャだ。メモリ管理とパフォーマンスを最優先した設計となっている。

‘ ———————————————————
‘ 職人によるAssignment工数配分制御モジュール
‘ ———————————————————
Option Explicit

Public Sub OptimizeWorkContour(ByVal TaskID As Long, ByVal ContourType As PjAssignmentContour)
Dim proj As Project
Dim tsk As Task
Dim asn As Assignment

Set proj = ActiveProject
Set tsk = proj.Tasks(TaskID)

‘ パフォーマンス最適化:再計算を一時停止
Dim calcMode As Long
calcMode = Application.Calculation
Application.Calculation = pjManual

On Error GoTo Cleanup

‘ Assignmentの走査
For Each asn In tsk.Assignments
‘ WorkContourの適用
‘ 注意: 一部のContourは、実際の工数/期間との整合性が取れない場合に
‘ 自動的にFlatに戻されることがある。その場合は事前にWorkを固定せよ
asn.WorkContour = ContourType
Next asn

Cleanup:
‘ 確実に設定を戻す(メモリリーク防止の要諦)
Application.Calculation = calcMode
Set asn = Nothing
Set tsk = Nothing
Set proj = Nothing
End Sub

—

3. シニアエンジニアが意識すべき「極限のパフォーマンス」

上記コードで終わりではない。大規模なスケジュール管理システムを構築する場合、以下の3点に注意を払うことが「伝説的」エンジニアの条件だ。

① オブジェクトの明示的解放(メモリ最適化)

VBAのガベージコレクションは信用するな。特にProjectの `Assignment` コレクションは複雑な依存関係を持つ。`Set obj = Nothing` を徹底し、ループ内でのオブジェクト生成を最小限に抑えることで、メモリオーバーフローを回避する。

② Windows APIによる画面描画の抑制

数万件のAssignmentを操作する場合、`Application.ScreenUpdating = False` だけでは不十分なケースがある。Windows API `LockWindowUpdate` を呼び出し、OSレベルでProjectの描画ハンドルをロックすることで、処理時間を劇的に短縮できる。

If VBA7 Then
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hwndLock As LongPtr) As Long
Else
Private Declare Function LockWindowUpdate Lib “user32” (ByVal hwndLock As Long) As Long
End If

‘ 使用時は: LockWindowUpdate Application.hWnd
‘ 解除時は: LockWindowUpdate 0

③ システム間連携の整合性

ERPや他システムから工数実績(Actual Work)を取り込む際、`WorkContour` の設定が邪魔をすることがある。実績があるAssignmentに対して無理なContourを適用すると、Projectは自動でデータを補正(=破壊)する。「実績データの読み込み」と「Contourの設定」の実行順序は、プロジェクトの整合性を維持するための最重要チェックポイントである。

—

結論:ツールを使いこなすのは「実態」への執着

WorkContourの制御は、単なるUIの操作ではない。それは、現場の人間が持つ「この作業は後半に詰まるはずだ」「最初は助走が必要だ」という暗黙知を、Projectという冷徹な計算エンジンに翻訳する作業である。

レガシーなVBAであっても、書き方一つでシステムの生存期間は変わる。次は、この `WorkContour` を基点として、リソースの負荷状況をWindows APIで外部DBへ書き出す手法について掘り下げていこう。

技術を突き詰めろ。コードは嘘をつかない。

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