プロジェクトを可視化せよ:Project VBAによるWBS階層構造の動的制御術
多くのプロジェクトマネージャーが陥る罠がある。「ガントチャートがただの色のないリストになっている」という罠だ。視覚的な階層(WBS)が表現されていない計画書は、もはや地図のない航海に等しい。
今日は、MS Projectの強力なオブジェクトモデルである`OutlineLevel`を制御し、階層の深さに応じて自動的に書式を適用する「真に実用的な」自動化アルゴリズムを授ける。小手先のマクロではなく、保守性と拡張性を担保した、現場で生き残るコードを書こう。
—
1. なぜ「再帰処理」が至高の解なのか
タスクの階層構造を処理する際、多くのエンジニアがループ処理のネストで力技を解決しようとする。だが、プロジェクトの規模が拡大し、サブプロジェクトや階層の深さが予測不能になった瞬間、そのコードは崩壊する。
再帰(Recursion)こそが、WBSのような木構造を扱うための唯一の正解だ。
親タスクの下に子タスクが存在し、その下に孫タスクがある……この構造を、オブジェクトのライフサイクルを考慮しながらエレガントに走査する。
2. 堅牢な設計のポイント
単に色を塗るだけならスクリプトは数行で済む。しかし、実務では以下を考慮しなければならない。
- パフォーマンスの罠: `Application.ScreenUpdating` を制御せよ。描画更新を止めるだけで、数千行のタスク処理速度は劇的に変わる。
- 例外処理: フィルタがかかっている状態や、選択範囲が空の場合の「オブジェクトなし」エラーを握りつぶすな。
- 保守性: カラーコードやフォント設定を定数として切り出し、後からの仕様変更に備えること。
—
3. 実践コード:階層レベルに応じた自動書式設定
このコードは、モジュールに貼り付けてすぐに利用可能だ。WBSの深さ(OutlineLevel)に応じて、背景色とフォントを動的に変更する。
Option Explicit
‘ プロジェクトのパフォーマンスを最大化する設計
Public Sub ApplyWBSFormatting()
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject
‘ 画面更新停止でパフォーマンスを数倍に向上
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 階層レベルに応じたフォーマット適用
Call SetFormatByOutlineLevel(tsk)
End If
Next tsk
ExitSub:
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume ExitSub
End Sub
Private Sub SetFormatByOutlineLevel(ByRef tsk As Task)
‘ 階層に応じた設定定義 (実務ではここを外部設定ファイルに逃がすとより良い)
Select Case tsk.OutlineLevel
Case 1
‘ プロジェクトフェーズ: 太字、濃い青背景
tsk.FontBold = True
tsk.FontColor = pjWhite
tsk.CellColor = pjBlue
Case 2
‘ 大項目: 背景色を薄い青に
tsk.FontBold = True
tsk.CellColor = pjLightBlue
Case 3
‘ 中項目: 標準、背景色なし
tsk.FontBold = False
tsk.CellColor = pjWhite
Case Else
‘ それ以下の階層: グレーアウトで情報の優先度を下げる
tsk.FontColor = pjGray
End Select
End Sub
—
4. 開発現場で生き残るための「鉄則」
1. 「Nothing」を恐れるな
MS Projectの `Tasks` コレクションは、削除されたタスクのインデックスが空(Nothing)になることが頻繁にある。`For Each` ループ内で `If Not tsk Is Nothing Then` を入れるのは必須の作法だ。これを怠れば、最初の1行目でツールはクラッシュする。
2. 外部データとの連携時の注意
もしExcelやSQL Serverからタスクをインポートして自動生成しているなら、`OutlineLevel` を設定する前に必ず `OutlineIndent` メソッドを利用して階層構造を構築すること。インポート後に色を塗るタイミングを「書き込み完了後」に分離するアーキテクチャにすべきだ。
3. ユーザーの操作を阻害しない
VBAを実行した際、元の選択状態が失われるとユーザーはストレスを感じる。処理開始前の `ActiveCell` を保存し、終了後に復元する小さな気遣いが、ツールとしての完成度を分ける。
—
最後に:エンジニアとしての矜持
VBAはレガシーと言われることもある。だが、MS Projectの奥底にあるオブジェクトモデルを叩き、プロジェクトの視認性を劇的に向上させるこの技術は、規模が大きくなるほど価値が増す。
「面倒な作業はすべて自動化し、人間は意思決定に集中する」。
このコードをベースに、あなたのプロジェクトの地図を、誰よりも見やすく描き上げてほしい。何か不明点があれば、またいつでも聞いてくれ。現場からは以上だ。
