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

スポンサーリンク

Project VBAの深淵:Groupオブジェクトを操り、動的リソース負荷可視化を極める

多くのエンジニアがMicrosoft Project VBAを単なる「タスク自動追加ツール」と誤解している。だが、真のアーキテクトにとって、Project VBAは「プロジェクト構造という多次元データベースを操作する強力なAPI」に他ならない。

今回は、標準機能の「グループ化」では到達できない、動的な「部署×スキル」の負荷可視化を実現する手法を伝授する。これは単なるマクロではない。プロジェクト管理の深層に切り込むためのアーキテクチャだ。

1. Groupオブジェクトのライフサイクルと罠

Project VBAにおいて `Group` オブジェクトは、一見単純な階層構造に見えるが、その実態はアプリケーションのメモリ空間に永続化される「定義」である。

安易な作成・削除はメモリリークや、最悪の場合、`.mpp`ファイルの整合性破壊を招く。我々が守るべき鉄則は以下の通りだ。

  • 存在確認の徹底: 同名のグループが既に存在する場合、それを上書きするのか、削除して再生成するのか、設計段階で厳格に定義せよ。
  • 明示的な解放: VBAのガベージコレクションを待つな。`Set obj = Nothing` は儀式ではなく、リソース枯渇を防ぐための防壁である。

2. 実装:動的グループ生成エンジンのコア

以下に、リソースのカスタムフィールドをキーにして、階層的なグループ定義を動的に生成するコードを示す。

‘ ———————————————————
‘ @brief: 指定したカスタムフィールドに基づき、動的グループを生成する
‘ @param: groupName グループ定義名
‘ @param: fieldName グループ化の基準とするフィールド名
‘ ———————————————————
Sub CreateDynamicGroup(groupName As String, fieldName As String)
Dim proj As Project
Dim grp As Group
Dim grpDef As GroupCriterion

Set proj = ActiveProject

‘ 1. 同名グループのクリーンアップ(既存定義の破棄)
On Error Resume Next
proj.Groups(groupName).Delete
On Error GoTo 0

‘ 2. 新規グループの定義
Set grp = proj.Groups.Add(groupName)

‘ 3. グループ定義の構築(階層化の極み)
‘ 部署(Text1) -> スキル(Text2) の順でグルーピング
With grp.GroupCriteria
.Add FieldName:=”Text1″, Ascending:=True
.Add FieldName:=”Text2″, Ascending:=True
End With

‘ 4. 可視化の適用
ApplyGroup Name:=groupName

‘ 5. メモリ解放
Set grp = Nothing
Set proj = Nothing
End Sub

3. シニアエンジニアが意識すべき「負荷可視化」の最適化

Windows APIによる制御の余地

もし、数千タスク規模の巨大なプロジェクトファイルを扱う場合、`Application.ScreenUpdating = False` だけでは不十分だ。Windows APIの `LockWindowUpdate` を併用し、描画負荷を完全に遮断することで、グループ適用時のパフォーマンスを劇的に改善できる。

If VBA7 Then
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hWndLock As LongPtr) As Long
Else
Private Declare Function LockWindowUpdate Lib “user32” (ByVal hWndLock As Long) As Long
End If

‘ 実行前に LockWindowUpdate(Application.hWnd) を呼び出し、処理後に 0 を渡す。

レガシー環境への配慮:遅延バインディングの原則

社内の異なるProjectバージョン(2016/2019/365)が混在する環境では、参照設定(Early Binding)は地雷だ。必ず `Object` 型を用いた遅延バインディングを採用し、実行時にメソッドの存在を判定する防御的プログラミングを徹底せよ。

4. チーフアーキテクトからの提言:データ連携の未来へ

「部署×スキル」のグループ化は、単なる可視化で終わらせてはならない。
ここで生成したグループ情報を、Excel経由でBIツールへ流し込む、あるいはSQL Serverへ吐き出すための「データ抽出インターフェース」として機能させるべきだ。

Projectの `GroupCriteria` を走査すれば、現在どのリソースがどのプロジェクトで、どの程度のアサイン負荷を持っているかという多次元配列を容易に取得できる。これをCSVではなく、JSON形式で出力するように実装すれば、モダンなWebフロントエンドとも容易に連携可能だ。

結論:
VBAを「古い言語」と切り捨てるのは簡単だ。しかし、Projectの内部APIを掌握し、メモリと描画の制約を制御下に置くことができれば、それは最強のプロジェクト・インテリジェンス・ツールへと変貌する。

次回の記事では、このグループ化データを活用し、リソース平準化を自動計算するアルゴリズムの深淵に触れる。現場からは以上だ。

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