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があなたに改善を求めているサイン」です。
ここをクリアすれば、あなたはもうただの作業者ではありません。「プロジェクトの品質をコードで担保するアーキテクト」への入り口に立っています。
また次の講義でお会いしましょう。質問があればいつでもどうぞ。あなたのコードが、今日もスムーズに走りますように。
