【テクニカル・上級編】リソースの「代行者」設定をVBAで管理し、プロジェクトメンバー変更をスムーズに行う – Project VBA解析バイブル

スポンサーリンク

継承されるべき「代行者」の系譜:VBAによるリソース管理の極致

プロジェクト管理において、最もコストがかかり、かつ最もバグの温床となりやすいのが「リソースの引き継ぎ」だ。担当者が交代する際、過去のタスク割り当てをExcelのセル上でのコピペで管理するなど、プロのエンジニアの所業ではない。

今回は、Project VBAにおける「代行者(Delegate)設定」の自動化を題材に、システムを堅牢に保つためのメモリ管理と、APIレベルの介入手法について深掘りする。

—

1. 概念の再定義:なぜ「代行者」設定を自動化するのか

単なる「担当者変更」と「代行者設定」は意味が異なる。前者は参照の書き換えに過ぎないが、後者は「過去のコンテキスト(工数、進捗、アサイン経緯)を維持したまま、権限を委譲する」というライフサイクル上の不可逆なイベントだ。

ここで重要なのは、VBAからProject Object Modelを操作する際、単に値を代入するのではなく、「リソースの有効期間(Effective Date)」を制御することにある。

—

2. 実装の極意:Windows APIとオブジェクト解放

VBAはガベージコレクションが脆弱だ。特にProject Object Modelは、COMオブジェクトの生成と破棄が不完全だと、バックグラウンドでメモリリークを引き起こし、長時間のバッチ処理でExcel/Project自体をクラッシュさせる。

実装のポイント

  • 明示的なNothing代入: 変数スコープを徹底的に絞り、ループ内で生成したオブジェクトは即座に解放する。
  • Windows APIによるプロセス監視: 巨大なプロジェクトファイルの読み込み時は、APIを用いてプロセスの応答を待機する。

リソース代行者設定コード(抜粋)

‘ プロジェクトのリソース代行者を設定する高精度ルーチン
Public Sub AssignDelegateResource(ByVal TargetResourceName As String, ByVal DelegateResourceName As String)
Dim pj As MSProject.Project
Dim resTarget As MSProject.Resource
Dim resDelegate As MSProject.Resource

‘ メモリ最適化: オブジェクトの明示的参照
Set pj = ActiveProject

On Error GoTo Cleanup

‘ 内部検索エンジンの負荷を考慮し、コレクションインデックスではなく名前検索を最適化する
Set resTarget = pj.Resources(TargetResourceName)
Set resDelegate = pj.Resources(DelegateResourceName)

‘ 代行者設定の実装
‘ ※Project APIには直接的なDelegateプロパティがないため、
‘ カスタムフィールドへのマッピング、またはリソースカレンダーのオーバーライドで実装する
resTarget.EnterpriseResourceOutlineCode1 = resDelegate.Name
resTarget.Notes = “代行者設定: ” & resDelegate.Name & ” (Date: ” & Now & “)”

‘ 変更の確定(トランザクション)
pj.Application.CalculateAll

Cleanup:
‘ 極限のメモリ管理: 参照の明示的切断
Set resTarget = Nothing
Set resDelegate = Nothing
Set pj = Nothing

If Err.Number <> 0 Then
Debug.Print “Error: ” & Err.Description
End If
End Sub

—

3. レガシー環境におけるシステム間連携の知見

多くの現場では、Projectは単独で動いていない。Active DirectoryやSharePoint、あるいはオンプレミスのSQL Serverと連携しているはずだ。

安定性を確保するための「掟」

1. Late Bindingの回避: 参照設定を固定せよ。実行時にライブラリを解決するLate Bindingは、開発環境と本番環境の差異で予期せぬ挙動を生む。
2. API呼び出しによるレスポンス制御: `Application.Wait`は甘えだ。Windows APIの `Sleep` を利用し、CPUリソースを解放しながら同期を待つのが、シニアエンジニアの流儀である。

‘ Windows APIの宣言
If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If

—

4. チーフアーキテクトからの提言

プロジェクト管理ツールを自動化する際、最も陥りやすい罠は「現状を完璧に再現しようとすること」だ。

自動化の真の目的は、人為的ミスを排除し、「交代の瞬間」に蓄積されたナレッジが消失しない仕組みを構築することにある。代行者を設定することは、単なるデータ操作ではなく、プロジェクトの歴史に「バトン」を渡す作業なのだ。

このコードをただコピペするのではなく、君たちの現場の複雑なリソース構造に合わせて、メタデータをどう付与すべきか、もう一度設計し直してほしい。それができる者だけが、システムを掌握できる。

何かあれば、またこの場所へ来るといい。技術の核心は、常に現場の泥臭い課題の中にあるのだから。

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