【実務・中級編】タスクの「期限」制約と「ASAP」制約の優先順位をVBAで動的に制御する – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:ASAP制約と「期限」の動的制御で遅延リスクを可視化せよ

多くのプロジェクトマネジメントツールにおいて、タスクのスケジュール計算はブラックボックス化されている。特にMicrosoft ProjectのVBAを操る際、「ASAP(できるだけ早く)」というデフォルトの甘美な誘惑に負け、制約条件の競合で泥沼に陥った経験はないだろうか。

今日は、プロジェクトの「死」を未然に防ぐための動的制約制御アルゴリズムについて語る。ただコードを動かすのではない。プロジェクトの健全性を担保する「守護神」をVBAで構築するのだ。

—

1. なぜ「ASAP vs 期限」の競合でシステムは崩壊するのか

MS Projectのスケジュールエンジンは、強力だが融通が利かない。

  • ASAP(できるだけ早く): 前提タスクの終了直後に開始する。
  • 期限(Deadline): スケジュール計算に直接影響しないが、遅延するとインジケータで警告が出る。

問題は、「ASAP制約のタスクが、設定した期限を物理的に超えてしまうケース」をどう扱うかだ。多くの開発者はこれを放置し、結果として「いつの間にか納期を超過している」という事態を招く。我々が構築すべきは、制約条件を動的に書き換え、「期限遵守が不可能になった瞬間にアラートを出し、制約を再評価するロジック」である。

—

2. 設計思想:守るべき3つの鉄則

1. 制約の強制固定を避ける: `.ConstraintType = pjDeadline` のようなハードコーディングは禁忌だ。状況に応じて型を動的にスイッチさせること。
2. イベント駆動の徹底: `Project_Change` イベントで制御するのではなく、計算実行後の検証ルーチン(Post-Calc Validation)として実装する。
3. 計算負荷の最小化: プロジェクト全体を全走査するのは重い。影響範囲(Predecessors/Successors)に絞った再帰処理を設計する。

—

3. 実装:動的制約制御アルゴリズム

以下は、タスクの「期限」と「ASAP」の整合性を検証し、期限超過の兆候があれば制約を「Must Start On(指定開始日)」に切り替えて強制的に可視化するコードの雛形だ。

‘ ————————————————————————-
‘ @Title: Dynamic Constraint Controller
‘ @Description: 期限超過リスクを検知し、制約を動的に最適化するプロシージャ
‘ ————————————————————————-
Public Sub OptimizeTaskConstraints(ByVal tsk As Task)
Dim deadlineDate As Date
deadlineDate = tsk.Deadline

‘ 期限が設定されていない場合はスキップ
If deadlineDate = #12:00:00 AM# Then Exit Sub

‘ スケジュール計算後のタスク終了日が期限を超過しているか判定
If tsk.Finish > deadlineDate Then
‘ 危険状態:制約を「開始日指定」に変更し、手動介入を促すインジケータへ
‘ 警告:ここでは即座にMustStartOnへ変更するが、業務要件により柔軟に調整すること
On Error Resume Next
tsk.ConstraintType = pjMustStartOn
tsk.ConstraintDate = tsk.Start

‘ ログ出力(デバッグ用・実務ではDBやファイルへ書き出す)
Debug.Print “Alert: Task [” & tsk.Name & “] has exceeded its deadline. Constraint updated.”
Else
‘ 正常状態:ASAPに戻して計算エンジンの柔軟性を確保
If tsk.ConstraintType <> pjASAP Then
tsk.ConstraintType = pjASAP
End If
End If
End Sub

‘ 一括処理用ドライバ
Public Sub RunConstraintValidation()
Dim tsk As Task
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
OptimizeTaskConstraints tsk
End If
Next tsk
End Sub

—

4. プロダクション環境での注意点とTips

ファイル・DB連携の罠

このロジックを外部データベース(SQL Server等)と連携させる場合、「計算中の排他制御」を忘れてはならない。VBAからデータベースを叩く際は、必ず `ADODB.Connection` の非同期実行を避け、同期的に処理を完了させること。さもなくば、プロジェクトファイルとデータベース間でデータの不整合が生じ、リカバリー不能な状態に陥る。

パフォーマンスの最適化

タスク数が数千を超える大規模プロジェクトでは、`For Each` ループはあまりに非効率だ。

  • `Application.Calculation = pjManual` で一旦計算を止め、処理後に `CalculateProject` を一度だけ叩くこと。
  • これにより、制約変更のたびに走るスケジュールエンジンによる負荷を劇的に削減できる。

—

最後に:エンジニアとしての矜持

VBAはレガシーと言われるが、Microsoft Projectの制御においては依然として最強の武器だ。このスクリプトは単なる自動化ツールではない。プロジェクトに潜む「遅延の芽」を、アルゴリズムの力で可視化するための防波堤である。

コードをコピペするだけでなく、君のプロジェクトの特性に合わせて、この「境界値」を調整してほしい。それができる者だけが、真のプロジェクト・アーキテクトと名乗れるのだ。

健闘を祈る。何かあればまた問いに来るといい。

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