MS Project VBAを掌握する極限の知見:依存関係のタイプに応じたガントチャート・バーの動的視覚制御
プロジェクトマネジメントにおいて、ガントチャートはステークホルダーとの共通言語である。数千行に及ぶWBS(Work Breakdown Structure)を眺める時、どのタスクがどのタスクに縛られているのか(先行・後続関係)を視覚的に瞬別できるか否かは、プロジェクトの予兆管理の精度を決定づける。
標準のMS Projectは、すべての依存関係(リンク)を同一の矢印で結ぶ。しかし、実務上「FS(Finish-to-Start:終了-開始)」と「SS(Start-to-Start:開始-開始)」では、クリティカルパス上の意味合いも、スケジュールのリスクヘッジの方法も根本的に異なる。
今回は、MS Project VBAを用いて、タスク間の依存関係(Predecessors)のタイプを動的に判定し、ガントチャート上のバーのスタイル(色、形状、パターン)を自動で切り替えるプロダクションレベルのソリューションを解説する。
—
1. なぜ標準機能では不十分なのか?(アーキテクチャの課題)
MS Projectの「書式」タブからバーのスタイルを手動で変更することは可能だが、数千件規模のタスクを持つエンタープライズ規模のスケジュールにおいて、これをマニュアルで運用することは破綻を意味する。
さらに、VBAからガントチャートの描画プロパティ(`BarStyles`)を操作する際、多くの開発者が陥る罠がある。
- ビューのコンテキスト依存: アクティブなビューがガントチャート(`gantt chart`)になっていない状態でプロパティにアクセスすると実行時エラーが発生する。
- オブジェクトのライフサイクル: タスクのループ処理中に無闇に再描画(`ScreenUpdating`)を行うと、COMのラウンドトリップが発生し、パフォーマンスが劇的に低下する。
これらをクリアし、実務の現場で耐えうる堅牢なコードを構築する。
—
2. 実装アプローチと設計方針
今回の自動化スクリプトの設計思想は以下の通りである。
1. 安全なコンテキスト切替: 対象プロジェクトのビューを強制的にガントチャートに退避・固定し、処理終了後に復元する。
2. 依存関係の厳密なパース: `Task.Predecessors`コレクションを走査し、リンクのタイプ(FS, SS, FF, SF)をビット単位・文字列単位で正確に特定する。
3. カスタムバーの動的割当: あらかじめMS Project側で定義されたカスタムバー(またはグローバルテンプレート側のスタイル)に対し、タスクの `BarStyles` プロパティをマッピングする。
—
3. プロダクションコード例
以下のコードは、エラーハンドリング、画面描画のロック、オブジェクトの適切な解放を網羅した実務仕様のVBAモジュールである。
Option Explicit
‘ ==============================================================================
‘ módulo: 依存関係に基づくガントチャートバー動的スタイリングエンジン
‘ 概要: タスクの先行タスクのリンク形式(FS/SS)を検出し、バーの見た目を自動変更する
‘ ==============================================================================
Public Sub ApplyDependencyBarStyles()
‘ パフォーマンス最適化のための画面更新停止
Application.ScreenUpdating = False
Dim originalView As Long
originalView = ActiveView.Index
On Error GoTo ErrorHandler
‘ 1. ガントチャートビューへの強制切替(描画プロパティ操作の前提条件)
ViewApply Name:=”&Gantt Chart”
Dim t As Task
Dim pred As TaskPredecessor
Dim linkType As Long
Dim hasSS As Boolean
Dim hasFS As Boolean
‘ 2. プロジェクト内の全タスクを走査
For Each t ActiveProject.Tasks
‘ サマリータスクやマイルストーンを除外する場合はここでガードを入れる
If Not t Is Nothing Then
If Not t.Summary And t.Milestone = False Then
hasSS = False
hasFS = False
‘ 先行タスク(Predecessors)のコレクションを解析
For Each pred In t.Predecessors
linkType = pred.Type
‘ リンクタイプの判定
‘ pjLinkFinishToStart = 0
‘ pjLinkStartToStart = 2
Select Case linkType
Case pjLinkStartToStart
hasSS = True
Case pjLinkFinishToStart
hasFS = True
‘ 必要に応じて pjLinkFinishToFinish (1), pjLinkStartToFinish (3) も追加可能
End Select
Next pred
‘ 3. 依存関係のタイプに応じたバースタイルの適用
‘ ※前提として、MS Projectの「バーのスタイル」ダイアログで
‘ カスタムスタイルが適切に構成されている必要がある。
Call SetTaskCustomBarStyle(t, hasSS, hasFS)
End If
End If
Next t
‘ ビューの復元と画面更新の再開
ViewApply Name:=ActiveProject.Views(originalView).Name
Application.ScreenUpdating = True
MsgBox “ガントチャートのバーのスタイリングが正常に完了しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 異常終了時のリカバリ
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ ==============================================================================
‘ プライベートメソッド: タスクごとのバープロパティ設定
‘ ==============================================================================
Private Sub SetTaskCustomBarStyle(ByRef t As Task, ByVal isSS As Boolean, ByVal isFS As Boolean)
‘ 【重要】MS Projectのオブジェクトモデルでは、タスク個別のバー書式は
‘ 標準では「フラグフィールド(Flag1〜20)」等と連動させたカスタムバー書式で制御するのが定石。
‘ ここではフラグを立てることで、あらかじめ定義したカスタムバースタイルを適用する例を示す。
If isSS And Not isFS Then
‘ SSリンク主体のタスク -> 例: フラグ1をTrueにして「青色の特殊バー」を適用させる
t.Flag1 = True
t.Flag2 = False
‘ 直接バーの色を制御する場合(MS Project 2010以降の拡張プロパティ)
‘ t.Bar.Color = pjBlue 等の直接操作も可能だが、ビューのスタイル定義を推奨
ElseIf isFS Then
‘ FSリンク主体のタスク -> 標準スタイル
t.Flag1 = False
t.Flag2 = True
Else
‘ 孤立タスクまたはその他のリンク
t.Flag1 = False
t.Flag2 = False
End If
End Sub
—
4. 運用・データベース連携における注意点
このVBAを組織展開するにあたり、以下のアーキテクチャ上の注意点を押さえておく必要がある。
- グローバルテンプレート(Global.mpt)の依存性:
VBA側で `t.Flag1` などをトリガーにバーの外観を変える場合、そのプロジェクトを開くすべてのユーザーのPC(またはエンタープライズ環境のEPM/Project Online)側で、「バーのスタイル」設定が同期していなければならない。属人化を防ぐため、プロジェクトテンプレートファイル(`.mpt` または `.mpp`)にあらかじめカスタムバーの定義を埋め込んでおくこと。
- パフォーマンスのチューニング:
`For Each t In ActiveProject.Tasks` のループ内で重い処理を行うと、数万行のスケジュールで数分の硬直が発生する。必要に応じて `ActiveProject.Tasks. היי` のようにインデックスアクセスを使用するか、処理対象をフィルターされたタスク(`ActiveProject.OutlineView.ShowSelectedTasks` 等)に絞る設計に昇華させよ。
—
5. チーフアーキテクトからの総括
業務自動化の本質は、単に「手作業をマクロに置き換えること」ではない。「データに潜む意味(今回の場合はタスク間の構造的リスク)を、人間の認知限界を超えて視覚化・構造化すること」にある。
今回紹介した依存関係に基づくバーの動的スタイリングは、プロジェクトの遅延リスクを視覚的にハックするための強力な武器となる。ぜひ、自社のWBS標準テンプレートに組み込み、ワンランク上のプロジェクトガバナンスを実現してほしい。
