【実務・中級編】Assignment.Delayを操作して、リソースの割り当て開始を自動調整するツール – Project VBA解析バイブル

スポンサーリンク

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` を自在に操れるようになった君は、もはや「プロジェクトを管理される側」ではなく、「プロジェクトの時間を支配する側」になったと言える。

次に構築すべきは、この自動調整ロジックをトリガーにして、リソースの空き状況を可視化するダッシュボードだ。その知見が必要になったら、またここへ戻ってくるといい。

プロジェクトの成功を祈る。健闘を。

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