【入門編】初心者向け:ガントチャート上の制約アイコンをVBAで操作し、視認性を向上させる – Project VBA解析バイブル

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

見えない「制約」の鎖を解き放て:Project VBAでガントチャートの視認性を極める

こんにちは。プロジェクトの現場で、日々複雑なスケジュールと格闘している皆さん。
マクロの記録機能を使って「あ、これ自動化できそうだな」と感じ始めた今のあなたは、エンジニアとしての素晴らしい第一歩を踏み出しています。

でも、もしあなたが「記録したコードをそのまま使うだけ」の段階に留まっているとしたら、少しだけもったいないかもしれません。

MS Projectの真の力は、単なる自動入力ではなく、「プロジェクトの背後にあるロジック(制約条件)を、いかに人間が理解しやすい形に可視化するか」という点にあります。

今日は、初心者の方が最初の一歩として踏み出すのに最適で、かつ実務で即戦力となるテクニックを伝授します。テーマは「制約条件(Constraint)の可視化」です。

1. なぜ「制約」はプロジェクトの天敵なのか?

プロジェクトを進めていると、こんな現象に遭遇しませんか?

「前工程が終わっているのに、なぜかこのタスクが動かない……」
「ガントチャートのつながり(先行・後続)は正しいはずなのに、日付が不自然にズレている……」

その原因の多くは、タスクに設定された「制約条件(Constraints)」にあります。

MS Projectには、「このタスクは必ず○月○日に開始しなければならない(Must Start On)」といった、スケジュール計算エンジンを強制的に縛り付けるルールが存在します。これらはガントチャート上では小さなアイコンで表示されるだけで、一見すると見落としやすいのです。

この「見えない制約」が積み重なると、スケジュール全体の柔軟性が失われ、プロジェクトは硬直化してしまいます。だからこそ、「制約があるタスクを、一目でわかるようにフラグ立てする」仕組みが必要なのです。

2. 攻略の設計図:カスタムフィールドを活用する

いきなりコードを書く前に、プロの設計思想を学びましょう。
今回のゴールは、VBAを使って以下のフローを実現することです。

1. スキャン: プロジェクト内の全タスクを一つずつチェックする。
2. 判定: そのタスクに「ASAP(なるべく早く)」以外の特殊な制約(Must Start Onなど)が付いているか判定する。
3. 書き込み: 制約が見つかったら、「カスタムフィールド(Text1など)」にその種類を書き込む。
4. 可視化: ガントチャートの設定で、そのテキストが入っているタスクに色をつける(※これは手動で行う設定です)。

なぜ直接アイコンをいじらないのか? それは、「データの保持」と「見た目の制御」を分離するのが、堅牢なシステムを作る鉄則だからです。

3. 実装:制約条件を抽出するVBAコード

さあ、コードを書いていきましょう。
「マクロの記録」では決して辿り着けない、オブジェクトの性質を理解したコードです。

Option Explicit

''' <summary>
''' タスクの制約条件をチェックし、カスタムフィールド(Text1)に記録する
''' </summary>
Sub HighlightTaskConstraints()
    Dim t As Task
    Dim constraintName As String
    Dim count As Integer
    
    ' パフォーマンス向上のため、画面更新を停止(大規模プロジェクト対策)
    ' これを忘れると、実行中に画面がチラつき、処理速度が劇的に落ちます
    Application.ScreenUpdating = False
    
    count = 0
    
    ' プロジェクト内のすべてのタスクをループ処理
    ' Taskオブジェクトのライフサイクルを意識して、一つずつ丁寧に見ていきます
    For Each t In ActiveProject.Tasks
        
        ' タスクが空(削除された行など)の場合はスキップする
        ' これを忘れると「オブジェクト変数または With ブロック変数が設定されていません」エラーが出ます
        If Not t Is Nothing Then
            
            ' 制約条件の種類を判定する
            ' pjTaskConstraintAsSoonAsPossible (ASAP) 以外を抽出対象とする
            Select Case t.ConstraintType
                Case pjTaskConstraintMustStartOn
                    constraintName = "★Must Start On"
                Case pjTaskConstraintMustFinishOn
                    constraintName = "★Must Finish On"
                Case pjTaskConstraintStartNoEarlierThan
                    constraintName = "Start No Earlier Than"
                Case pjTaskConstraintStartNoLaterThan
                    constraintName = "Start No Later Than"
                Case pjTaskConstraintFinishNoEarlierThan
                    constraintName = "Finish No Earlier Than"
                Case pjTaskConstraintFinishNoLaterThan
                    constraintName = "Finish No Later Than"
                Case Else
                    ' ASAPやALAPなど、制約による縛りが弱いものは空にする
                    constraintName = ""
            End Select
            
            ' カスタムフィールド「Text1」に結果を書き込む
            ' これにより、ガントチャート上で「文字」として見えるようになります
            t.Text1 = constraintName
            
            ' カウントアップ(処理結果の確認用)
            If constraintName <> "" Then count = count + 1
            
        End If
    Next t
    
    ' 画面更新を再開
    Application.ScreenUpdating = True
    
    ' 完了報告
    MsgBox count & " 件の制約タスクを抽出しました。Text1を確認してください。", vbInformation, "完了"
    
End Sub

4. コードの核心:ここがプロの視点

このコードには、初心者が陥りがちな罠を回避するための「知恵」が詰まっています。

① `If Not t Is Nothing Then` の重要性

MS Projectのタスクリストには、見た目は空白でも「中身が空(Nothing)」の行が存在することがあります。これを確認せずにプロパティ(`t.ConstraintType`)にアクセスしようとすると、プログラムは即座にクラッシュします。「オブジェクトが存在するかどうかを確認してから触る」。これはエンジニアの基本中の基本です。

② `Select Case` による可読性

`If…ElseIf…` を並べることもできますが、`Select Case` を使うことで、「どの値の時に、どの文字列を出すか」というロジックが非常にクリアになります。後から「この制約も追加したい」と思った時のメンテナンス性が格段に上がります。

③ `Application.ScreenUpdating` の魔法

大量のタスクがあるプロジェクトで、一行書き換えるたびに画面を更新させていたら、処理に数分かかることもあります。これを `False` にすることで、計算を裏側で一気に終わらせ、最後にパッと結果を表示できます。

5. 仕上げ:ガントチャートを「劇的に」見やすくする

VBAを実行すると、`Text1` フィールドに「★Must Start On」といった文字が入ります。しかし、まだ「視認性が向上した」とは言えません。最後に、MS Projectの標準機能で仕上げを行いましょう。

1. 列の表示: ガントチャートの列に「Text1」を追加します。
2. 条件付き書式(色分け):

  • 「表示」タブ > 「バーのスタイル」をクリック。
  • 新しいバーを作成し、色を「赤」などに設定します。
  • 「条件」の部分で、`Text1` が `★` で始まる場合にそのバーを適用するように設定します。

*(※MS Projectのバージョンにより操作が多少異なりますが、カスタムフィールドの内容をトリガーに色を変えるのがポイントです)*

これで、「制約があるタスクだけが、ガントチャート上で赤く光る」という、プロ仕様のダッシュボードが完成します。

最後に:次のステップへ

お疲れ様でした! これであなたは、「記録されたマクロ」を使うユーザーから、「プロジェクトの構造を操作するエンジニア」へと進化しました。

「制約を可視化する」という小さな成功体験は、大きな自動化への入り口に過ぎません。次は、この `Text1` の情報を使って、自動でリマインドメールを送ったり、レポートを作成したりといった応用にも挑戦してみてください。

一歩ずつ、確実に。
ここをクリアすれば、Project VBAの基本はバッチリですよ。応援しています!

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