【入門編】【上級者向け】Projectの「ガントチャート」描画制御:バーのスタイルを依存関係のタイプで自動変更する – Project VBA解析バイブル

スポンサーリンク

こんにちは!日々のプロジェクト管理、本当にお疲れ様です。Excelのマクロは何となく書けるようになったけれど、「Microsoft ProjectのVBAとなると、途端に難しく感じる……」そんな壁にぶつかっていませんか?

大丈夫、安心してください。ここをクリアすれば、Project VBAの基本はバッチリですよ!

今回は、多くの人が「手動でポチポチ設定していては日が暮れてしまう」と頭を悩ませる、ガントチャートのバーのスタイル制御をテーマに取り上げます。特に、タスク同士の繋がり方(依存関係)である「FS(終了-開始)」と「SS(開始-開始)」を、VBAの力でガントチャート上に色鮮やかに自動描き分けさせる方法を、優しく、そして本質的な部分まで深く解説していきます。

マクロの記録では太刀打ちできない「Projectの描画オブジェクトの裏側」を一緒に覗いてみましょう。

—

なぜ、ガントチャートのバー制御をVBA化するのか?

プロジェクト管理の現場では、WBS(ワーク・ブレイクダウン・ストラクチャ)の規模が大きくなればなるほど、タスク間の依存関係が複雑に入り交じります。

  • FS (Finish-to-Start / 終了-開始): 前のタスクが終わってから、次のタスクが始まる(最も一般的)
  • SS (Start-to-Start / 開始-開始): 前のタスクが始まれば、次のタスクも同時にスタートできる(同時並行作業に必須)

これらをパッと見で区別できるように、ガントチャート上のバーの色や形状を自動で変えられたら……? 視認性が爆発的に向上し、スケジュール遅延の予兆を直感的にキャッチできるようになりますよね。

しかし、Microsoft ProjectのUIからこれを個別設定しようとすると、タスクをダブルクリックして、バーのスタイルタブを開いて……と、気が遠くなるような手作業が必要です。これを一瞬で自動化するのが、今回学ぶProject VBAの真骨頂です。

—

押さえておきたい!Project VBAの基本とオブジェクト構造

Excel VBAとProject VBAの最大の違いは、「タイムスケールとタスク、そしてグラフィック(バーのスタイル)が緊密にリンクしている点」にあります。

Project VBAにおいて、ガントチャートのバーは単なる「図形」ではなく、`Task` オブジェクトの状態や、タスクを結ぶ `TaskDependency`(先行タスク) の種類に応じて、グローバルなスタイル定義(`BarStyles`)またはローカルな書式設定(`Bar`)によって描画されています。

今回は、より確実かつ強力に個別のタスク行の見た目を制御するため、「タスク個別のバー書式プロパティ」をVBAから直接ハックする手法を使います。

—

実装コード:依存関係に応じてバーの色を自動変更する

それでは、開発の現場でそのままコピペして使える実用的なコードをお見せします。
このマクロは、アクティブなプロジェクト内の全タスクを走査し、その先行タスクのリンク形式(FSかSSか)を判定して、ガントチャート上のバーの色(ここでは分かりやすく赤と青)を自動で切り替えるものです。

Sub CustomizeGanttBarsByDependency()
Dim tsk As Task
Dim dep As TaskDependency
Dim hasSS As Boolean
Dim hasFS As Boolean

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お約束の最適化)
App.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ プロジェクト内のすべてのタスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ サマリータスク(大項目)やマイルストーンは除外する場合のガード
If Not tsk Is Nothing Then
If tsk.Summary = False And tsk.Milestone = False Then

hasSS = False
hasFS = False

‘ そのタスクが持つすべての先行タスク(依存関係)をチェック
For Each dep In tsk.Predecessors
Select Case dep.Type
Case pjDependencySS
hasSS = True
Case pjDependencyFS
hasFS = True
End Select
Next dep

‘ 依存関係のタイプに応じてガントチャートのバー書式を変更する
‘ ※Projectのバー書式プロパティ(Bar3D, Color等)を操作します
If hasSS Then
‘ SSリンクを持つタスクは「青色(pjBlue)」に設定
‘ 第1引数はバーの中央部分、等を指定
Call SetTaskBarProperties(tsk, pjBlue, pjSolidPattern)
ElseIf hasFS Then
‘ FSリンクを持つタスクは「標準の赤色(pjRed)」に設定
Call SetTaskBarProperties(tsk, pjRed, pjSolidPattern)
End If

End If
End If
Next tsk

MsgBox “ガントチャートのバーのスタイル更新が完了しました!”, vbInformation, “完了”

CleanUp:
App.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub

‘ —————————————————————–
‘ 補助プロシージャ:指定したタスクのガントチャートバーの色とパターンを設定する
‘ —————————————————————–
Private Sub SetTaskBarProperties(ByVal tsk As Task, ByVal barColor As Long, ByVal barPattern As Long)
‘ Projectのオブジェクトモデルでは、タスク個別のバー書式は Task.Bar オブジェクトを操作します
Dim tskBar As Bar

On Error Resume Next
Set tskBar = tsk.Bar

If Not tskBar Is Nothing Then
‘ バーの中央部分の色とパターンを変更
tskBar.Color = barColor
tskBar.Pattern = barPattern
End If
On Error GoTo 0
End Sub

—

コードのポイントと、陥りやすい罠(エラー対策)

ここで、エンジニアとして知っておくべき「Project VBA特有の罠」と、コードの重要ポイントを解説します。

1. `App.ScreenUpdating = False` の重要性

Projectは、タスクやバーのプロパティが変更されるたびに、裏側でガントチャートの再描画(レイアウト計算)走ります。タスクが数百件ある場合、これを画面描画ありで行うと、完了までに数分かかることも。必ず処理の最初に画面更新を止め、最後に復元させましょう。

2. `Nothing` の判定とサマリータスクの扱い

WBSの構造上、`ActiveProject.Tasks` の中には、削除されたタスクの空きスロットや、親階層である「サマリータスク」が含まれます。
サマリータスクは子タスクの集約なので、個別に先行タスク(依存関係)を持たない、あるいは特殊な持ち方をします。そのため、`If tsk.Summary = False` で除外してあげることが、予期せぬ実行時エラーを防ぐ最大の秘訣です。

3. `tsk.Predecessors` と `dep.Type`

タスクの依存関係は、`Predecessors` コレクションの中に格納されています。それぞれの依存関係(`TaskDependency`)が持つ `.Type` プロパティを見ることで、それが FS なのか SS なのか(あるいは FF なのか SF なのか)を完璧に判定できます。

—

おわりに:次の一歩へ

いかがでしたでしょうか?
「マクロの記録」では絶対にコードが出力されない、ガントチャートの描画プロパティ(`Bar`オブジェクト)へのアプローチ方法がお分かりいただけたかと思います。

この技術を応用すれば、例えば「期限が過ぎているのに進捗が止まっているタスクのバーを点滅させる(あるいは強烈な黄色にする)」といった、攻めのプロジェクト管理ダッシュボードをVBAで構築することも夢ではありません。

あなたの手で、味気ないProjectの画面を「意志を持つ美しいガントチャート」へと進化させてみてください。
それでは、次回の極限知見でお会いしましょう!バッチリ使いこなしてくださいね!

タイトルとURLをコピーしました