こんにちは! 現場でバリバリ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の基本構造である「タスクとリソースの繋がり」を利用して、稼働率を可視化するガントチャート拡張ツールを解説しました。
ここをクリアできれば、単なる「作業の自動記録」から脱却し、「プロジェクトの可視化とコントロールをコードでデザインするエンジニア」へとステップアップできます。
現場のメンバーが笑顔になるような、実用的な自動化ツールをぜひあなたの手で完成させてみてください。応援しています!
