【実務・中級編】Project VBAで「グループ化」の定義を動的に作成し、リソース別負荷を可視化する – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:動的グループ化による「見えない負荷」の可視化

Project VBAにおいて、標準のビューやグループ化機能だけでプロジェクトを管理しているなら、それはまだ「入り口」に立っているに過ぎない。

現場のPMが本当に知りたいのは「誰がどのスキルで、どの部署の案件をどれだけ抱えているか」という、クロス分析されたデータだ。これを手作業で繰り返すのは時間の無駄であり、属人化の温床となる。今回は、`Group`オブジェクトをプログラムから動的に生成し、複雑なリソース負荷を瞬時に可視化する「アーキテクトの作法」を伝授する。

1. なぜ「手動設定」ではいけないのか

多くのユーザーがUIからグループ化を作成するが、プロジェクトが進むにつれ、その定義は形骸化する。

  • 再現性の欠如: プロジェクトごとに手作業で設定し直す必要があり、人的ミスを誘発する。
  • 保守性の欠如: 部署名やスキルの定義が変わった際、全ファイルを手修正するのは非現実的だ。

我々エンジニアが目指すべきは、「データ定義は外部(JSONやExcel)に置き、VBAでUIを再構築する」という疎結合な設計である。

2. 実装の核心:Groupオブジェクトの動的制御

Project VBAにおける`Group`オブジェクト操作の肝は、既存のグループを一度破棄し、クリーンな状態で再構築する「リセット&ビルド」の思想にある。

プロダクションコード例:動的グループ化エンジン

以下のコードは、リソースの「部署(Text1)」と「スキル(Text2)」を組み合わせてグループ化を動的に生成するプロトタイプだ。

Option Explicit

‘ ———————————————————
‘ 目的: リソースの部署とスキルを軸に動的グループを作成
‘ ———————————————————
Public Sub CreateDynamicResourceGroup()
Dim pj As Project
Dim grp As Group
Dim grpDef As GroupDefinition

Set pj = ActiveProject

‘ 既存のグループ定義を安全に削除(名前が衝突してエラーになるのを防ぐ)
On Error Resume Next
pj.GroupDefinitions(“部署×スキル負荷分析”).Delete
On Error GoTo 0

‘ 新規グループ定義の作成
Set grpDef = pj.GroupDefinitions.Add(“部署×スキル負荷分析”)

‘ グループ化の定義を追加
‘ 1階層目: 部署 (TaskResourceGroup / Text1)
‘ 2階層目: スキル (TaskResourceGroup / Text2)
With grpDef.GroupCriteria
.Add FieldName:=”Resource Text1″, Ascending:=True, FontColor:=pjBlue, GroupOn:=pjGroupOnEachValue
.Add FieldName:=”Resource Text2″, Ascending:=True, FontColor:=pjDarkGreen, GroupOn:=pjGroupOnEachValue
End With

‘ ビューに適用
ApplyGroup Name:=”部署×スキル負荷分析”

MsgBox “グループ化の再構築が完了しました。”, vbInformation
End Sub

3. 堅牢な設計のための「3つの鉄則」

現場で運用可能なツールにするためには、単にコードが動くだけでは不十分だ。以下の3点に留意せよ。

① データベース(Excel/SQL)との連携

Projectファイル内の値を直接書き換えるのは危険だ。リソース情報はExcelマスタで管理し、`ADO`や`Power Query`経由で取り込む設計にせよ。VBA側は「読み込んだデータをProjectのフィールドに反映させ、グループ化を実行する」という役割に徹する。

② エラーハンドリングと状態のクリーンアップ

`GroupDefinitions`コレクションに対する操作は、名前の重複や存在しないフィールド指定によって容易に例外を吐く。必ず`On Error Resume Next`を適切に配置し、中途半端な状態でプログラムを終了させないこと。

③ ユーザー体験(UX)への配慮

グループ化は計算リソースを消費する。大規模プロジェクトの場合、グループ化の実行前に `Application.ScreenUpdating = False` を利用し、描画を停止させてパフォーマンスを最適化せよ。

4. プロの視点:次に目指すべき場所

今回のコードはあくまで基礎だ。真の自動化エンジニアは、さらに一歩先を見据える。

  • イベント駆動: `Project_BeforeSave` イベントをフックし、保存時に最新の負荷グループを自動再構築する。
  • 動的レポート: グループ化だけでなく、`Table`オブジェクトも同時に切り替え、特定のビュー設定をプロジェクトの「コンテキスト」として記憶させる。

Project VBAは単なる自動化ツールではない。プロジェクトという複雑な生き物の「視界」を制御するインターフェースである。この記事を読んだ君ならば、明日から手作業のグループ設定を全廃し、コードによる論理的な可視化を実装できるはずだ。

さあ、コードを書いて、プロジェクトを支配下に置け。

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