【入門編】依存関係と制約条件の矛盾をVBAで検知する「整合性チェック」エンジンの開発 – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握せよ:スケジュール矛盾を自動検知する「整合性チェック」エンジンの極意

こんにちは。現場で泥臭く、しかし誰よりも美しくコードを書くことを信条とするエンジニアです。

Microsoft Project(MSP)のVBAを触り始めた皆さんは、きっと今、ガントチャートの複雑な依存関係と制約条件(ASAPやALAPなど)の迷宮に足を踏み入れていることでしょう。

「先輩、タスクを繋いだら日付が赤字になってエラーが出るんです…」
そんな相談を山ほど受けてきました。今日は、そんな「スケジュールが崩壊する瞬間」をコードで先回りして摘み取る、整合性チェックエンジンの開発手法を伝授します。

—

1. なぜ「整合性チェック」が必要なのか?

MSPは非常に賢いエンジンを持っていますが、制約条件と依存関係が複雑に絡み合うと、人間には気づけない「論理破綻」を起こします。

例えば、「ASAP(できるだけ早く)」制約のタスクに対して、無理な「開始制約」を強いている場合などです。これを見逃すと、プロジェクト完了時に「なぜかスケジュールが数日ズレている」という最悪の事態を招きます。

これを手作業で確認するのは地獄です。だからこそ、VBAで「ルールに反するタスク」を瞬時にリストアップするエンジンが必要なのです。

—

2. 実践:整合性チェックエンジンの心臓部

まずは、プロジェクト内の全タスクを巡回し、特定の条件(ここでは「ASAP制約があるのに、親タスクの開始日より前に始まろうとしている」など)を検知する基本形を見てみましょう。

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

‘ エラーリストのヘッダーを出力(イミディエイトウィンドウに)
Debug.Print “— 整合性チェック開始 —”

‘ 全タスクをループ処理
For Each tsk In proj.Tasks
‘ 完了タスクやマイルストーンを除外するなどのフィルタリングはここで
If Not tsk Is Nothing Then

‘ 【重要】制約条件のチェック
‘ ConstraintTypeが「pjNoConstraint」以外の場合に判定
If tsk.ConstraintType <> pjNoConstraint Then

‘ ここで独自のロジックを実装
‘ 例:制約日が先行タスクの終了日より前になっていないか?
If tsk.ConstraintDate < tsk.EarlyStart Then Debug.Print "【警告】タスクID: " & tsk.ID & " [" & tsk.Name & "] に論理矛盾の可能性あり" End If End If End If Next tsk Debug.Print "--- チェック終了 ---" End Sub

このコードの「本質」

  • `For Each tsk In proj.Tasks`: プロジェクトの全タスクを走査する基本中の基本です。
  • `ConstraintType`: これが制約条件(ASAP, ALAP, 指定日付など)を司るプロパティです。ここを制御できるかどうかが、VBA使いとしての分かれ道になります。
  • `EarlyStart`: MSPが計算した「最も早い開始日」。これと制約条件を比較することで、矛盾を浮き彫りにします。

—

3. 初学者が陥りやすい「罠」

このコードを書く際、多くの初心者が以下のポイントで躓きます。

1. Nothingの壁: プロジェクト内のタスクが「何も定義されていない行」を含んでいる場合、`tsk`がNothingになることがあります。必ず `If Not tsk Is Nothing Then` でガードしましょう。
2. 計算のタイムラグ: 大規模なプロジェクトでは、コード実行の瞬間にMSPの再計算が追いついていないことがあります。必要に応じて `Application.CalculateAll` を明示的に叩くのがプロの技です。
3. 読み取り専用の罠: `ConstraintDate` を変更しようとしてエラーになる場合は、タスクの「制約の種類」が固定されていないか確認してください。

—

4. さらなる高みを目指すために

このチェックエンジンが組めれば、次は「矛盾を自動で修正する」というステップに進めます。

  • 自動修正のロジック: 矛盾を検知した際、`tsk.ConstraintType = pjASAP` と書き換えることで、制約を解除し、先行タスクとの整合性を自動回復させることも可能です。
  • レポート出力: イミディエイトウィンドウに出すだけでなく、Excelワークブックを新規作成し、そこにエラー一覧を書き出すと、上司への報告も一瞬で終わります。

—

最後に:エンジニアとして成長するために

VBAは単なる自動化ツールではありません。「プロジェクト管理における『論理』をコードに落とし込むための言語」です。

今回紹介したコードは、あなたのプロジェクトを守る最初の一歩です。まずはこのコードをコピーして、ご自身のプロジェクトのタスクIDで試してみてください。エラーが出たら、それは「MSPがあなたに改善を求めているサイン」です。

ここをクリアすれば、あなたはもうただの作業者ではありません。「プロジェクトの品質をコードで担保するアーキテクト」への入り口に立っています。

また次の講義でお会いしましょう。質問があればいつでもどうぞ。あなたのコードが、今日もスムーズに走りますように。

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