【入門編】【中級者向け】タスクの「制約条件」が依存関係と競合した際に発生するエラーを検知・修正するツール – Project VBA解析バイブル

スポンサーリンク

【Project VBA極意】タスクの「制約」と「リンク」の矛盾を制す!自動整合化ツールの実装

こんにちは。プロジェクト管理の深淵へようこそ。

MS ProjectのVBAを触り始めると、誰もが一度は「なぜかタスクの日程が動かない」「赤い警告アイコンが消えない」という壁にぶつかります。その正体は、「制約条件(Constraint)」と「依存関係(Link)」の静かなる喧嘩です。

今日は、中級者へのステップアップとして、この矛盾をVBAで検知し、強引に「できるだけ早く(ASAP)」へ矯正する、現場で生き残るための自動化コードを授けましょう。

1. なぜ「制約」はプロジェクトを破壊するのか?

MS Projectにおいて、タスクには「開始日」や「終了日」を指定する制約条件を設定できます。しかし、これらは諸刃の剣です。

  • 依存関係(リンク): 「前のタスクが終わったら次を始める」という論理的な繋がり。
  • 制約条件: 「何があってもこの日に始める」という絶対的な指定。

これらが競合した瞬間、Projectはどちらを優先すべきか迷い、予定表は崩壊します。特に、自動スケジュールモードのタスクで「開始日固定」を設定すると、後続タスクの柔軟性が奪われ、変更管理が地獄と化すのです。

2. 矛盾検知・自動修正ツールの設計思想

今回のツールは、以下の3つのロジックで動きます。

1. 走査: 全てのタスクをループで回す。
2. 判定: 「リンクがあるのに、ASAPではない制約がついているか」を確認する。
3. 矯正: 該当する場合、制約を「できるだけ早く(ASAP)」に上書きする。

実践コード:Constraint Fixer

このコードを標準モジュールに貼り付けて実行してください。プロジェクトの歪みを正す処方箋です。

Sub FixTaskConstraints()
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject

‘ 警告:この処理は元に戻せません。必ずバックアップを取ってから実行してください
If MsgBox(“全てのタスクの制約を「できるだけ早く」にリセットしますか?”, vbYesNo + vbCritical) = vbNo Then Exit Sub

For Each tsk In proj.Tasks
‘ 1. サマリータスクや空行は無視する
If Not tsk Is Nothing Then
If Not tsk.Summary Then

‘ 2. 依存関係(Predecessors)が存在するかチェック
If tsk.Predecessors <> “” Then

‘ 3. 制約条件が「できるだけ早く(pjConstALAP/ASAP)」以外の場合に強制変更
‘ pjConstraintType = 0 は “できるだけ早く”
If tsk.ConstraintType <> pjConstraintASAP Then

Debug.Print “修正対象: ” & tsk.Name
tsk.ConstraintType = pjConstraintASAP

‘ 念のため、制約日付もクリアしておく
tsk.ConstraintDate = “NA”

End If
End If
End If
End If
Next tsk

MsgBox “整合性チェック完了。プロジェクトの論理構造が正常化されました。”, vbInformation
End Sub

3. コードの読み解き:ここが「プロ」のポイント

初心者から脱却するために、コード内の重要なポイントを解説します。

  • `If Not tsk Is Nothing` の意味:

Projectのタスクコレクションには「削除された行」が一時的に空として残ることがあります。これをチェックせずに操作するとエラーで落ちます。現場のコードは「安全」が第一です。

  • `tsk.Summary` の除外:

サマリータスク(親タスク)の制約を無理に書き換えると、配下の子タスク全体に予期せぬ影響が出ます。個別のタスクのみを操作するのが鉄則です。

  • `tsk.ConstraintDate = “NA”`:

制約タイプをASAPに変えても、日付が残っていると古い挙動を引きずることがあります。`NA`(Not Applicable)を代入して綺麗に掃除するのが、熟練のエンジニアの流儀です。

4. 次なるステップへ

このツールを導入することで、プロジェクトの「日程の硬直化」を防ぐことができます。ここをクリアすれば、あなたはもう「MS Projectに振り回されるユーザー」ではなく、「MS Projectを意のままに操るアーキテクト」の入り口に立っています。

さらに高みを目指すなら:
次は「特定のフラグ(Yes/Noフィールド)が立っているタスクだけを対象にする」といった条件分岐を追加してみてください。そうすれば、定型業務と重要イベントを分け隔てて管理できるようになります。

現場での自動化は、完璧を目指すのではなく、「手作業による矛盾の芽を摘む」ことこそが最大の貢献です。健闘を祈ります!

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