こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの日常から一歩踏み出し、自分の手でプロジェクトの歯車を自在に操りたい――そんなあなたを待っていました。
今回は、Project VBAにおける「依存関係の『クリティカルパス』をVBAで判定し、遅延リスクのあるタスクを色分けする」という、実務でめちゃくちゃ使えるテーマを解説します。
「MS Projectには標準でクリティカルパスを表示する機能があるのに、なんでわざわざVBAでやるの?」と思いましたね?
鋭い質問です。実は、標準機能の計算エンジンは強力ですが、「特定の条件を満たすタスクだけを赤く目立たせて、上長にレポートしたい」「独自の遅延リスクロジックを組み込みたい」といった現場の泥くさい要求には、VBAでロジックを自作するのが一番の近道なんです。
ここをクリアすれば、あなたもProject VBAの基本をマスターし、現場のヒーローになれますよ。さあ、一緒に紐解いていきましょう!
—
1. なぜ「Projectの計算エンジンに頼らずVBAで遡る」のか?
MS Projectは、タスク同士の「先行・後続関係(リンク)」を自動で計算し、スケジュールを弾き出します。しかし、VBAからその計算結果を単に読み取るだけでは、「なぜそのタスクがクリティカルなのか(どこから連鎖しているのか)」をプログラム側で動的にハンドリングできません。
今回は、プロジェクトの最終ゴール(または指定したマイルストーン)から「先行タスクを逆向きに辿る(バックワード・パス)」というアルゴリズムをVBAで実装します。これにより、遅延がプロジェクト全体にダイレクトに波及する「真のクリティカルチェーン」を自分の目で捉えることができるのです。
—
2. 現場でそのまま使える!クリティカルパス判定&色分けマクロ
百聞は一見に如かず。まずは、コピペしてそのまま動かせる完全版のコードをお見せします。
プロジェクト内のすべてのタスクを走査し、条件に合致する遅延リスクの高いタスクを鮮やかな「赤」に染め上げる職人技のコードです。
‘ ==============================================================================
‘ 【モジュール名】CriticalPathVisualizer
‘ 【概要】依存関係を逆向きに辿り、遅延リスクのあるクリティカルタスクを赤色でハイライトする
‘ ==============================================================================
Sub HighlightCriticalPath()
Dim tsk As Task
Dim predTask As Task
Dim lLink As TaskPredecessor
‘ 1. エラーハンドリングと画面描画の停止(爆速化の基本です)
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
‘ 2. まずはプロジェクト全体のタスクの色を一旦クリア(初期化)
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
‘ 概要タスク(サマリー)以外を対象にする
If Not tsk.Summary Then
tsk.FontColor = pjAutomatic
tsk.CellColor = pjAutomatic
End If
End If
Next tsk
‘ 3. すべてのタスクをループし、MS Project標準のクリティカル判定を活用しつつ、
‘ さらに独自の「遅延リスク」を判定して色を塗り替える
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
If Not tsk.Summary Then
‘ 【ロジックの核心】
‘ 標準のCriticalプロパティがTrueであり、かつ残余作業日数(Remaining Duration)が0より大きいものを対象とする
If tsk.Critical = True And tsk.RemainingDuration > 0 Then
‘ ——————————————————————
‘ ここで先行タスクを遡るカスタムロジックを展開
‘ ——————————————————————
For Each lLink In tsk.Predecessors
Set predTask = lLink.PredecessorTask
‘ 先行タスクも遅延している(実績開始しているのに遅れている等)場合
If predTask.RemainingDuration > 0 Then
‘ リスク大としてハイライト(セル背景を薄い赤、文字を黒に)
tsk.CellColor = pjLightRed
tsk.FontColor = pjBlack
tsk.FontBold = True
Exit For ‘ 一つでもヒットしたら抜ける
End If
Next lLink
End If
End If
End If
Next tsk
Application.ScreenUpdating = True
MsgBox “クリティカルパスの可視化が完了しました!”, vbInformation, “VBA自動化”
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
3. コードの解説:ここがプロの技!
初心者から一歩抜け出すために、上記のコードで使われている重要なポイントを3つに絞って解説します。
① `Application.ScreenUpdating = False` による爆速化
Project VBAでもExcel VBAと同様に、画面の再描画は最大のボトルネックです。タスクが何千件もあるプロジェクトで、1件ずつ色を変えるたびに画面を更新していると、終わる頃にはコーヒーが冷めてしまいます。処理の最初に画面を止め、最後に一気に復元する。これがプロの流儀です。
② `TaskPredecessor` オブジェクトで依存関係を遡る
`tsk.Predecessors` コレクションを使うことで、「このタスクの直前にどのタスクがつながっているか」を完璧に取得できます。
コード内の `For Each lLink In tsk.Predecessors` がまさにそれです。ここを起点に、先行タスクのステータス(進捗率や残余日数)をゴリゴリとVBAで判定していくことで、単なる標準機能を超えた高度なリスク分析が可能になります。
③ 概要タスク(Summary Task)の除外
Projectには、親タスクである「概要タスク」が存在します。これらは子タスクの集計値であるため、直接色を塗ろうとすると予期せぬ動作を引き起こしたり、エラーの原因になります。`If Not tsk.Summary Then` というガード節を挟むことで、実作業タスク(末端タスク)だけに処理を安全に絞り込んでいます。
—
4. 陥りやすいエラーと対策
初心者がProject VBAを書くとき、必ずと言っていいほどぶp壁があります。ここで先回りして解決しておきましょう。
- エラー:「オブジェクト変数または With ブロック変数が見つかりません。」
- 原因: プロジェクトの中には、タスクが削除されたあとの「空き番(Nothing)」が含まれていることがあります。
- 対策: ループ内では必ず `If Not tsk Is Nothing Then` という生存確認を行ってください。これをサボると確実にVBAがクラッシュします。
- 色が元に戻せない
- 対策: スクリプトの最初に `pjAutomatic` を使って一旦すべての書式をリセットする処理(上記のステップ2)を必ず入れておきましょう。これを怠ると、前回の判定結果が残ってしまい、ガントチャートがカオスになります。
—
おわりに
お疲れ様でした!
今回は、Project VBAを用いて依存関係を解析し、遅延リスクのあるタスクを自動で色分けする手法を解説しました。
「先行タスクをコードで遡る」というアプローチが腹に落ちれば、リソースの競合検知や、マイルストーン遅延のシミュレーションなど、あなたのプロジェクト管理を自動化する引き出しは一気に広がります。
ここをクリアしたあなたなら、もうマクロの記録の卒業生ではありません立派なVBAエンジニアです。ぜひ現場のプロジェクトファイルで試してみてくださいね。それでは、次回の極限知見でお会いしましょう!
