Project VBAを掌握せよ:Assignment.Delayによるリソース競合の動的制御術
エンジニア諸君。MS Projectの自動スケジュール機能に振り回され、残業続きのプロジェクト管理に辟易していないか?
「特定のリソースが複数のタスクで同時にパンクしている」「タスクは前倒ししたいが、担当者の稼働開始は少し遅らせたい」。この種の現場のジレンマを、手作業で調整するのは愚の骨頂だ。今日は、Project VBAの隠れた要所である`Assignment.Delay`を制御し、リソースの割り当てを「プログラマブル」に最適化する極限の手法を伝授する。
—
1. なぜ「標準機能」では限界があるのか
MS Projectのリソース平準化(Leveling)は強力だが、ブラックボックスだ。一度実行すると、予期せぬタスクの遅延や、意図しないリソースの再割り当てが発生し、スケジュールが崩壊する。
我々が求めるのは、「タスク開始日は固定したまま、特定リソースの参画タイミングだけをオフセットさせる」という精密な制御だ。ここで鍵となるのが `Assignment.Delay` プロパティである。
2. 堅牢な設計のためのアーキテクチャ思考
`Assignment.Delay` を操作する際、初心者が陥る罠が「ループ内での逐次的な値書き換えによるパフォーマンス低下」だ。Projectはオブジェクトモデルの性質上、値を更新するたびに再計算(Recalculate)が走る。
これを回避するための鉄則は以下の3点だ。
1. CalculationModeの制御: 更新前に`Calculation = pjManual`へ移行し、全変更後に一括で再計算をトリガーする。
2. 型定義の厳格化: リソースやアサインメントの参照は、インデックスではなく`UniqueID`を使用せよ。名前参照は言語環境や重複で死ぬ。
3. バリデーションの徹底: 遅延期間がタスクの期間を超過しないか、開始日が休日と重なっていないか、必ず論理チェックを噛ませる。
—
3. 実践:Assignment.Delay 制御プロダクションコード
以下のコードは、対象タスクにおける特定リソースの割り当て開始を、指定日数分だけ遅延させる堅牢なプロシージャだ。
‘ —————————————————————————
‘ @brief 特定リソースの割り当て遅延を設定する
‘ @param taskID 対象タスクのUniqueID
‘ @param resName 対象リソース名
‘ @param delayDays 遅延させる日数
‘ —————————————————————————
Sub ApplyResourceDelay(taskID As Long, resName As String, delayDays As Long)
Dim t As Task
Dim a As Assignment
Dim originalCalcMode As Long
‘ 1. 計算モードを一時停止(パフォーマンスの劇的改善)
originalCalcMode = Application.Calculation
Application.Calculation = pjManual
On Error GoTo ErrorHandler
Set t = ActiveProject.Tasks.UniqueID(taskID)
‘ 2. 対象アサインメントを探索
For Each a In t.Assignments
If a.ResourceName = resName Then
‘ 3. 遅延の設定 (Project VBAでは分単位で指定する)
‘ 1日 = 480分が標準だが、Project設定に依存するため定数化を推奨
a.Delay = delayDays 480
Debug.Print “Success: ” & resName & ” in Task ” & t.Name & ” delayed by ” & delayDays & ” days.”
Exit For
End If
Next a
Cleanup:
‘ 4. 計算を再開し、変更を確定させる
Application.Calculation = originalCalcMode
Application.CalculateAll
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume Cleanup
End Sub
—
4. プロダクション環境での運用上の注意点
ファイル・DB連携の罠
外部のExcelやデータベースから設定値を読み込む場合、「日付のズレ」には細心の注意を払え。Projectは稼働カレンダーに基づいた計算を行う。外部データ側の「明日」が、Project上の「稼働日」とは限らない。
- 対策: 日数オフセットを扱う際は、必ず `Project.Calendar` を介して稼働日判定を行うロジックを挟むこと。
保守性の担保
このツールをチームで使うなら、設定値をハードコードするな。`.mpp` と同じ階層に `config.json` や外部マスタを用意し、そこから設定を読み込む構造にすべきだ。コードの変更=デプロイ、という古い考え方は捨てろ。
5. 最後に:エンジニアとしての矜持
VBAはレガシーと言われるが、MS Projectの深い階層まで制御できるのは今も昔もVBAだけだ。`Assignment.Delay` を自在に操れるようになった君は、もはや「プロジェクトを管理される側」ではなく、「プロジェクトの時間を支配する側」になったと言える。
次に構築すべきは、この自動調整ロジックをトリガーにして、リソースの空き状況を可視化するダッシュボードだ。その知見が必要になったら、またここへ戻ってくるといい。
プロジェクトの成功を祈る。健闘を。
