【入門編】リソースの「稼働率」を色分けして可視化するガントチャート拡張ツール – Project VBA解析バイブル

スポンサーリンク

こんにちは! 現場でバリバリVBAを書いていると、Excelだけじゃなく「Microsoft Project」の自動化も任されて冷や汗をかくこと、ありますよね。

「マクロの記録」すら満足に使えないProject VBAの世界。Excel VBAとはオブジェクトの構造がまるで違うため、最初は誰もが戸惑います。
でも大丈夫。ここをクリアすれば、あなたもProjectの構造を自在に操る「チーフアーキテクト」の一歩を踏み出せますよ。

今回は、現場のプロジェクトマネージャーから「神!」と褒められること間違いなしの『リソース稼働率を色分けして可視化するガントチャート拡張ツール』の作り方を、優しく、そして本質的に解説していきます。

—

1. なぜProjectの標準機能では「稼働率」が見えにくいのか?

プロジェクトを動かしていると、こんな悲劇が起きます。
> 「Aさん、今週タスクが詰め込まれすぎて稼働率150%(オーバーヒート)になってるじゃん!」

Microsoft Projectにも「リソースグラフ」や「稼働状況」ビューはありますが、全体のスケジュール(ガントチャート)を眺めながら「誰がパンクしているか」を直感的に把握するのは、正直けっこう面倒です。

「ガントチャートのバーの色が、その人の稼働率に応じてパッと変わったら最高なのに……」

それを叶えるのが、今回のVBAツールです。
仕組みはシンプル。「リソースの最大稼働単位(Max Units)」と「タスクの割り当て」から実効稼働率を計算し、タスクのカスタムフィールドに色分け用のフラグを書き込む。そして、Projectの「グラフィックインジケーター」で色を光らせる。この連携プレイをVBAで一撃自動化します。

—

2. 実装の全体像とVBAの心構え

Project VBAを扱う上で、絶対に覚えておいてほしい大原則があります。
それは、「タスク(Task)」「リソース(Resource)」「割り当て(Assignment)」の3者関係のライフサイクルを理解すること。

Excelのセルとは違い、Projectはデータベース構造を持っています。今回は、各タスクに割り当てられたリソースの稼働率をチェックし、タスクの「フラグフィールド(Flag1)」に判定結果を流し込みます。

準備するもの(UI側の設定)

コードを書く前に、Project側で1箇所だけ準備が必要です。
1. Projectを開く。
2. タスクビューで適当な列(例: 列の挿入で「フラグ1」を選択)を右クリック。
3. 「フィールドの設定」を開き、名前を「稼働率アラート」に変更。
4. 「グラフィック インジケーター」ボタンを押し、以下のように設定します。

  • 条件1: `[フラグ1]` が `等しい` `はい` の場合 = 赤色のシグナル(オーバーワーク)
  • 条件2: それ以外 = 緑色のシグナル(正常)

さあ、舞台は整いました。エンジンをかけるコードを見ていきましょう!

—

3. 実用コード:稼働率可視化エンジン

以下のコードを、ProjectのVBAエディタ(`Alt + F11` で起動し、標準モジュールを追加)に貼り付けてください。

Sub VisualizeResourceWorkload()
‘ ==============================================================================
‘ テーマ: リソース稼働率を判定し、ガントチャート上のカスタムフィールドを光らせる
‘ 執筆者: チーフアーキテクト(先輩エンジニア)
‘ ==============================================================================

Dim t As Task
Dim assn As Assignment
Dim totalUnits As Double

‘ 画面描画をロックしてマクロの実行速度を爆発的に上げる(お約束のテクニック)
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ プロジェクト内のすべてのタスクをループ処理する
For Each t In ActiveProject.Tasks
‘ サマリータスク(親タスク)やマイルストーンは計算対象外とする
If Not t Is Nothing Then
If t.Summary = False And t.Milestone = False And t.Active = True Then

totalUnits = 0

‘ そのタスクに割り当てられているリソースの「単位(Units)」を合計する
‘ ※ Projectでは1人のリソースが100%なら Units = 1.0 です
For Each assn In t.Assignments
If Not assn.Resource Is Nothing Then
totalUnits = totalUnits + assn.Units
End If
Next assn

‘ 【判定ロジック】
‘ 割り当てられたリソースの合計が 100% (1.0) を超えていたらオーバーワークとみなす
If totalUnits > 1.0 Then
‘ フラグ1を「はい(True)」にする = ガントチャートが赤く光る
t.Flag1 = True
Else
‘ 正常値
t.Flag1 = False
End If

Else
‘ 対象外のタスクはフラグをオフ
t.Flag1 = False
End If
End If
Next t

‘ 画面描画を復元
Application.ScreenUpdating = True
MsgBox “リソースの稼働率チェックが完了しました!ガントチャートを確認してください。”, vbInformation, “処理成功”
Exit Sub

ErrorHandler:
‘ エラー時の安全装置
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

—

4. コードの深掘り解説(初心者がハマりやすいポイント)

ここがこのコードの肝、そしてProject VBA特有の「罠」を回避するポイントです。

① `Application.ScreenUpdating = False` の魔力

Projectは、VBAでタスクを1つ書き換えるたびに、裏でスケジュール全体の再計算(CPM:クリティカルパス法に基づく再計算)を行おうとします。タスクが1,000件あったら、画面描画のせいでコーヒーを飲み干すほど時間がかかります。
この `ScreenUpdating = False` を挟むことで、計算を裏で一気に終わらせ、爆速で動作させることができます。現場で「遅い!」と言われないための必須テクニックです。

② `t.Summary = False And t.Milestone = False` の意味

初心者がやりがちなミスが、親タスク(集計行)やマイルストーンに対してリソースを割り当て、その数値を誤検知してしまうこと。
親タスクのコストや稼働率は子タスクから自動集計されるため、VBAで直接いじるとデータがバグります。そのため、「動かすのは実作業を行う末端のタスク(Summary = False)だけ!」というガードを入れるのが鉄則です。

③ リソースの単位(Units)の正体

Excelなら「100%」は数値の `1` ですが、Project VBAの `assn.Units` も同じく `1.0 = 100%` として取得できます。
複数人のリソースが1つのタスクにアサインされている場合、合計が `2.0`(200%)になったりするので、今回のコードのようにループで合算して判定するのが非常に効果的なアプローチになります。

—

5. よくあるエラーと対策

  • エラー:「オブジェクト変数または With ブロック変数が見つかりません。」
  • 原因: 削除されたタスクの空きスロット(Nothing)をループしようとした時に起きます。
  • 対策: コード内にある `If Not t Is Nothing Then` のような「空チェック」をサボらないようにしましょう。
  • 現象:コードは動くのに、ガントチャートの色が変わらない!
  • 原因: VBA側で `Flag1` に True/False を書き込んでいますが、Project側のビューで「フラグ1」列を表示させていない、または「グラフィックインジケーター」の設定が漏れています。
  • 対策: 第2章の準備手順をもう一度見直してみてください。VBAはあくまで「スイッチを入れただけ」、表示の化粧はProjectの機能が担当するという役割分担を意識しましょう。

—

まとめ

今回は、Project VBAの基本構造である「タスクとリソースの繋がり」を利用して、稼働率を可視化するガントチャート拡張ツールを解説しました。

ここをクリアできれば、単なる「作業の自動記録」から脱却し、「プロジェクトの可視化とコントロールをコードでデザインするエンジニア」へとステップアップできます。

現場のメンバーが笑顔になるような、実用的な自動化ツールをぜひあなたの手で完成させてみてください。応援しています!

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