【入門編】【中級者向け】タスクの進捗率に応じた色分けをカスタムフィールドで実現する – Project VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロの記録を卒業しよう。Project VBAで「視覚的な管理」を自動化する極意

こんにちは。現場の自動化を支えるアーキテクトです。

MS Projectを使ってプロジェクト管理をしていると、必ずと言っていいほど「進捗が遅れているタスクをパッと見てわかるようにしたい」「進捗率が一定以下なら赤色にしたい」という要望に直面しますよね。

多くの初学者は、ここで「マクロの記録」を使って、セル(タスク行)の色を直接変えようと試みます。しかし、それは「設計」ではなく「作業の記録」に過ぎません。プロジェクトの規模が大きくなり、タスクが動的に増減する現場では、その手法はすぐに破綻します。

今日、あなたがマスターするのは、単なる色塗りではありません。「条件に応じて自動で表示を切り替えるルール(Graphical Indicator)」を、VBAからスマートに定義する手法です。

ここをクリアすれば、あなたは「マクロを記録する人」から「プロジェクトの仕組みを作るエンジニア」へとステップアップできますよ。

1. 本質的な違い: 「色を塗る」のか 「ルールを作る」のか

まず、設計思想を整理しましょう。ここがプロとアマチュアの境界線です。

  • アマチュアの手法(非推奨):

「タスクを一つずつループで回し、進捗率を見て、その行の色を直接変える」
→ タスクが増えるたびに処理が重くなり、データの構造と見た目が密結合(バラバラになりやすい)になります。

  • プロの手法(推奨):

「カスタムフィールド(数式フィールド)に、『進捗が◯%以下なら赤』というルール(Graphical Indicator)をVBAで流し込む」
→ ルールは一度設定すれば、タスクが増えても自動で適用されます。処理は一瞬です。

今回は、この「プロの手法」を実装していきます。

2. 核心となるオブジェクト: `GraphicalIndicator`

MS ProjectのVBAにおいて、アイコンや色を制御するのは `GraphicalIndicator` オブジェクトです。これは、カスタムフィールドのプロパティの一部として存在します。

具体的には、以下の階層構造を操作することになります。

1. `CustomField`: カスタムフィールドそのもの(Number1, Text1 など)。
2. `GraphicalIndicators`: そのフィールドに設定できる「ルールの集合体」。
3. `GraphicalIndicator`: 個別の「条件と色」のセット。

この「ルールの集合体」をVBAで書き換えることで、プロジェクト全体の視覚的なルールを一括制御するのです。

3. 実践: 進捗率に応じた色分けルールを自動設定する

では、具体的なコードを見ていきましょう。
今回は、「カスタムフィールド(Number1)に、進捗率(PercentComplete)に基づいた3段階の色分けルールを設定する」というシナリオです。

Sub SetupProgressVisualRules()
    ' =================================================================
    ' プロジェクトの進捗状況を視覚化するためのルールを自動設定する
    ' ターゲット: Number1 カスタムフィールド
    ' ルール内容: 
    '   - 50%未満: 赤(警告)
    '   - 50%以上 90%未満: 黄(注意)
    '   - 90%以上: 緑(順調)
    ' =================================================================
    
    Dim myField As CustomField
    Dim indicator As GraphicalIndicator
    
    ' 1. 対象となるカスタムフィールドを指定 (Number1を使用)
    ' ※あらかじめプロジェクト設定でNumber1が「数値」として定義されている前提です
    Set myField = ActiveProject.CustomFields("Number1")
    
    ' 2. 【重要】既存のルールを一度クリアする
    ' これを行わないと、実行するたびにルールが重複して追加されてしまいます。
    ' オブジェクトのライフサイクル管理において、初期化は鉄則です。
    Do While myField.GraphicalIndicators.Count > 0
        myField.GraphicalIndicators.Remove (1)
    Loop
    
    ' 3. ルールの追加
    ' Addメソッドの引数は (Condition, Value, IndicatorType, Color) です
    
    ' --- ルールA: 50%未満なら「赤」 ---
    ' Condition: "<" (未満)
    ' Value: 50
    ' IndicatorType: pjIndicatorTypeIcon (アイコン) または pjIndicatorTypeColor (色)
    Set indicator = myField.GraphicalIndicators.Add("<", 50, pjIndicatorTypeColor, pjRed)
    
    ' --- ルールB: 50%以上 90%未満なら「黄」 ---
    ' 複数の条件を組み合わせる場合は、ルールを積み上げます
    ' ここでは「50以上」かつ「90未満」を表現するために、
    ' 既存のルールを上書きするか、条件を整理する必要があります。
    ' Projectの仕様上、条件が重なる場合は「先に定義したルール」が優先される傾向にあります。
    Set indicator = myField.GraphicalIndicators.Add(">=", 50, pjIndicatorTypeColor, pjYellow)
    ' ※注意: 上記は簡易的な例です。厳密な範囲指定は、条件の順序に注意してください。
    
    ' --- ルールC: 90%以上なら「緑」 ---
    Set indicator = myField.GraphicalIndicators.Add(">=", 90, pjIndicatorTypeColor, pjGreen)

    ' 4. フィールドに「進捗率」を参照する数式をセットする
    ' これにより、Number1フィールドの値が常にPercentCompleteと同期します
    myField.Formula = "PercentComplete"

    MsgBox "視覚化ルールの設定が完了しました!" & vbCrLf & _
           "Number1フィールドを確認してください。", vbInformation, "完了"
End Sub

コードのポイント解説

# ① `Do While … Remove` による初期化

ここが設計の肝です。VBAでコレクション(集まり)を操作するとき、「現在の状態をリセットしてから、理想の状態を作る」という手順を踏まないと、実行するたびにルールが無限に増殖していく「メモリリーク」のような挙動に陥ります。

# ② `Formula` プロパティの魔法

`myField.Formula = “PercentComplete”` と書くことで、Number1 という「ただの数字の箱」が、「進捗率を映し出す鏡」へと変貌します。これにより、タスクの進捗が変われば、自動的に色も変わる仕組みが完成します。

4. 陥りやすいエラーと回避策(アーキテクトの視点)

開発現場であなたが直面するであろう「罠」をあらかじめ伝えておきます。

罠1: カスタムフィールドの型不一致

`Number1`(数値型)に対して、`Text1`(テキスト型)の値を参照しようとしたり、文字列としての比較を行おうとすると、実行時エラーが発生します。

  • 対策: `CustomField` の型(Type)と、`Formula` で参照する値の型が一致していることを必ず確認してください。

罠2: ルールの優先順位

Graphical Indicator は、「上から順番に判定される」という性質があります。
例えば、「100未満は黄色」「50未満は赤」という順でルールを書くと、50未満のタスクも「100未満」の条件に先にヒットしてしまい、すべて黄色になってしまいます。

  • 対策: 条件が重なる場合は、「より厳しい条件(特定の範囲)」から先に記述するのが鉄則です。

罠3: パフォーマンスの低下

「全タスクをループして色を変えるコード」を書いてしまうと、数千タスクあるプロジェクトでは数秒〜数十秒のフリーズが発生します。

  • 対策: 今回紹介したように、「フィールドの定義(ルール)を一度だけ書き換える」手法をとれば、処理時間はコンマ数秒で終わります。

5. まとめ: 次のステップへ

いかがでしたか?
単に「色を塗るマクロ」を作るのと、「条件に基づいた視覚化ルールを定義するプログラム」を作るのとでは、その後のメンテナンス性と安定性が天と地ほど違います。

1. 直接操作せず、ルール(Graphical Indicator)を操作する。
2. 必ず初期化(Remove)を行ってから設定する。
3. 条件の優先順位を意識して設計する。

この3点を守るだけで、あなたの書くコードは「プロの仕事」へと昇華されます。

ここをクリアすれば、Project VBAの基本はバッチリですよ。次は、リソース(人員)の負荷状況に応じた色分けにも挑戦してみてください。道は続いています。

応援していますよ!

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