プロジェクトの「見える化」をハックせよ:Task.Fontを操るVBA自動化の極意
プロジェクトマネジメントの世界において、ガントチャートは単なる記録ではない。それは「プロジェクトの鼓動」だ。しかし、標準のMS Projectの表示だけで満足しているなら、あなたは宝の持ち腐れをしている。
今回は、VBAを用いてタスクの条件に応じフォントや色を動的に制御し、「見ただけでプロジェクトの健全性が判別できる」高度なビューを構築する手法を伝授する。初心者向けと銘打っているが、現場で明日から使える「プロの設計思想」を込めた。
—
1. なぜ「手動」で色を変えてはいけないのか?
多くの担当者は、タスクの進捗が遅れるたびに手動でフォントを赤色に変える。これは「情報の鮮度を担保できない」最悪のアンチパターンだ。
VBAで制御すべき理由は、単なる自動化ではない。「ロジックに基づく客観的な視認性」を担保するためだ。プロジェクトの規模が大きくなればなるほど、ヒューマンエラーは増大する。プログラムに判断を委ね、人間は戦略的な意思決定に集中すべきだ。
—
2. オブジェクトモデルの「正しい」歩き方
Project VBAを扱う際、初心者が陥る罠は「無闇にループを回すこと」だ。MS Projectのオブジェクトモデルは階層が深く、不適切なアクセスはパフォーマンスを著しく低下させる。
特に `Task.Font` プロパティを操作する場合、以下の原則を守れ。
- 無駄な更新を避ける: 画面描画(再描画)のコストは高い。必要なプロパティだけを絞って書き込むこと。
- 例外処理の徹底: 削除されたタスクや、Null値を持つタスクに触れるとVBAは容赦なく停止する。常に `If Not task Is Nothing` 等のガード節を設けること。
—
3. 実践:進捗率に基づく自動色付けエンジン
以下のコードは、「進捗が80%未満なのに期限を過ぎているタスク」を自動的に赤字で強調するプロダクションコードだ。
‘ —————————————————————-
‘ プロシージャ: ColorTasksByProgress
‘ 概要: 期限切れかつ未完了のタスクを赤字にして強調表示する
‘ —————————————————————-
Sub ColorTasksByProgress()
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject
‘ プロジェクト内の全タスクを走査
‘ ループ効率を考慮し、フィルターをかけるのが理想だが、まずは基本を押さえる
For Each tsk In proj.Tasks
‘ 1. タスクが空でないこと、かつサマリータスクでないことを確認
If Not tsk Is Nothing Then
If Not tsk.Summary Then
‘ 2. 判定ロジック: 期限切れかつ進捗が100%ではない
‘ ※FinishプロパティとDate型を比較
If tsk.Finish < Date And tsk.PercentComplete < 100 Then
' フォントを赤字に変更
tsk.Font.Color = pjRed
tsk.Font.Bold = True
Else
' 条件に合致しない場合はリセット(保守性のための重要ステップ)
tsk.Font.Color = pjBlack
tsk.Font.Bold = False
End If
End If
End If
Next tsk
MsgBox "タスクの可視化が完了しました。", vbInformation
End Sub
このコードの「設計の肝」
- リセット処理の明示: 条件を満たさなくなった時にフォントを黒に戻す処理を入れている。これを怠ると、一度赤くなったタスクがいつまでも赤いままで、運用崩壊を招く。
- サマリータスクの除外: `If Not tsk.Summary` を入れることで、プロジェクト全体構造を崩さず、実作業タスクのみをピンポイントで制御している。
—
4. 運用上の注意点:データベース連携と拡張性
今後、このツールをより発展させるなら、以下の視点を忘れてはならない。
1. 外部データ連携: `tsk.ExtendedAttributes` を活用せよ。ExcelやSQL Serverから読み込んだKPIデータをタスクのカスタムフィールドに流し込み、それをトリガーに色を変える。これが「真の自動化」だ。
2. イベント駆動: `Project_Change` イベントを利用すれば、ユーザーが進捗率を入力した瞬間に自動で色が変わる。`Sub_Project_Change` を活用し、イベントハンドラを実装する準備をしておこう。
3. パフォーマンスの罠: 数千タスクある大規模プロジェクトで `For Each` を回すとUIがフリーズする可能性がある。その際は `Application.ScreenUpdating = False` を活用し、最後に `True` に戻す処理を必ず実装せよ。
—
最後に:エンジニアとしてのマインドセット
自動化ツールは「作って終わり」ではない。あなたの書いたコードが、チームメンバーのストレスを減らし、プロジェクトの失敗を未然に防ぐ「防波堤」になるのだ。
まずはこのコードをコピペして動かしてみてほしい。そこから、`tsk.Font.Size` を変えたり、`tsk.Flag1` と組み合わせたりと、あなたの現場の課題に合わせてカスタマイズを加えていく。「動くコード」ではなく「運用に耐えうる設計」を常に意識すること。 それこそが、一流のエンジニアへの第一歩だ。
何か実装で躓いたら、またここに戻ってきてほしい。君のプロジェクトを成功へ導くための知見は、常にここに用意している。
