【入門編】【中級者向け】タスクの「制約条件」と「依存関係」の競合を検知し、ログに出力する品質チェックツール – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「矛盾」をあぶり出す。Project VBAで構築するタスク品質チェッカー

こんにちは。現場で泥臭く、かつエレガントに自動化を追求しているエンジニアです。

Project VBA(Microsoft ProjectのVBA)を触り始めると、誰もが一度は「タスクの開始日が変わらない!」「なんでこのタスクは終わらないんだ?」という壁にぶつかります。その正体は、多くの場合「制約条件」と「依存関係」の衝突です。

人間が一つひとつガントチャートを目視して「ここが矛盾しているな」と探すのは、まさに修行です。今回は、この「矛盾の温床」を瞬時に検知し、ログとして叩き出すための「品質チェックツール」を実装しましょう。

ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Projectの心臓部を直接操作するエンジニアの入り口です。

—

1. なぜ「制約」と「依存関係」が衝突するのか

Projectにおけるタスクには、以下の二つの「縛り」があります。

  • 依存関係(Links): 「Aが終わったらBを開始する」という、タスク間の論理的な繋がり。
  • 制約条件(Constraints): 「〇〇日より前に開始してはならない」「〇〇日に必ず完了せよ」という、日付に対する物理的な制限。

この二つが喧嘩すると、Projectは「スケジュール計算の矛盾」を起こします。例えば、「Aの完了は10日後」なのに「Bの制約条件が今日開始」となっていたら、Projectはどう計算すべきかパニックになります。これがプロジェクトの遅延や、意図しないガントチャートの崩れを引き起こすのです。

—

2. 品質チェックツールの心臓部(ロジック解説)

今回作成するコードは、以下の手順で動作します。

1. プロジェクト内の全タスクをスキャンする。
2. 各タスクの「制約の種類」を確認する。
3. もし「指定日以降に開始」等の制約がある場合、その日付と「前任タスクの完了日」を比較する。
4. 矛盾があればイミディエイトウィンドウ(ログ)に詳細を出力する。

—

3. 実装コード:Project VBA 品質チェッカー

このコードを標準モジュールに貼り付けて実行してください。

Option Explicit

‘ プロジェクト内のタスク制約と依存関係の矛盾を検知する
Sub CheckTaskConstraintsConflict()
Dim tsk As Task
Dim pred As TaskLink
Dim conflictFound As Boolean

conflictFound = False
Debug.Print “— タスク矛盾チェック開始: ” & Now & ” —”

‘ プロジェクト内の全タスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ タスクが空ではないか確認
If Not tsk Is Nothing Then

‘ 「制約条件」が設定されているタスクのみ対象にする
If tsk.ConstraintType <> pjConstraintNone Then

‘ 前任タスク(依存関係)をチェック
For Each pred In tsk.TaskLinks
‘ 依存関係による開始可能日と、制約による制限日を比較
‘ 単純化のため、制約日が前任者の終了日より前にあるかを判定
If tsk.ConstraintDate < pred.FromTask.Finish Then Debug.Print "【警告】タスクID: " & tsk.ID & " [" & tsk.Name & "]" Debug.Print " -> 制約日: ” & tsk.ConstraintDate
Debug.Print ” -> 前任タスク[” & pred.FromTask.Name & “]終了日: ” & pred.FromTask.Finish
Debug.Print ” -> 矛盾の可能性あり。調整を推奨します。”
conflictFound = True
End If
Next pred
End If
End If
Next tsk

If Not conflictFound Then
Debug.Print “すべてのタスクに深刻な矛盾は見つかりませんでした。”
End If
Debug.Print “— チェック完了 —”
End Sub

—

4. このコードの「ここがポイント」

  • `tsk.ConstraintType <> pjConstraintNone`:

「制約なし」ではないタスクだけをフィルタリングしています。無駄な処理を省くのは、大規模プロジェクトを扱うエンジニアの基本作法です。

  • `tsk.TaskLinks`:

タスクが持っている依存関係のリストにアクセスします。ここをループすることで、複雑なネットワークを解読できます。

  • `Debug.Print`:

VBEの「イミディエイトウィンドウ」にログを吐き出します。Excelシートに書き出すよりも高速で、かつ開発中のデバッグとして非常にスマートな手法です。

—

5. 陥りやすいエラーとアドバイス

  • 「タスクが空です」エラー:

`For Each tsk In ActiveProject.Tasks` でループを回す際、途中に空行が入っているとエラーになります。`If Not tsk Is Nothing Then` でガードするのは必須の儀式です。

  • 日付比較の罠:

Projectは時刻まで管理しています。日付だけで比較したい場合は `DateValue(tsk.ConstraintDate)` のように変換してから比較すると、より正確な判定が可能です。

最後に:自動化の先にあるもの

このスクリプトは、あなたのプロジェクトの「健康状態」を診断する第一歩です。ここから発展させて、「矛盾を自動的に解除するコード」を書くことも可能です。

しかし、まずは「何が矛盾しているかを見抜く」ところから始めてみてください。それができれば、あなたはもうProjectの挙動に振り回される側ではなく、Projectを自在に操る側に立てています。

何か分からないことがあれば、いつでも聞いてください。一緒に最強の業務自動化ライフを送りましょう!

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