【実務・中級編】【中級者向け】テンプレート(.mpt)から新規作成する際、特定のカスタムフィールド定義を強制的に同期させるマクロ – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:テンプレートによるカスタムフィールド強制同期の設計思想

MS Projectの運用において、最も頭を悩ませるのが「カスタムフィールドの散逸」だ。
PMOが配布したはずのテンプレートから作成されたはずのプロジェクトファイルが、いつの間にか個人の手でフィールド定義を書き換えられ、組織全体のレポート集計を破壊する。この「設定のドリフト」を防ぐことこそ、自動化エンジニアの腕の見せ所である。

今回は、単なる「インポート」ではない。「組織標準を強制的に適用し、整合性を担保する」ための、堅牢なVBA設計を伝授する。

なぜ「単純なコピペ」では失敗するのか

多くの開発者が陥る罠は、`OrganizerMove` メソッドを単に呼び出すだけの実装だ。
これでは、以下の問題が発生する。

1. 名前の衝突とIDの不整合: 同じ名前で異なる型(テキスト型と数値型など)のフィールドが存在する場合、Projectは黙ってエラーを吐くか、定義を壊す。
2. インデックスの競合: 内部的なフィールドインデックス(`FieldConstant`)を無視すると、後のVBA処理で `CustomFieldGet` が例外を投げる。
3. テンプレートの過剰依存: テンプレート自体が壊れている場合に、システム全体が連鎖的に崩壊する。

我々が目指すべきは、「ターゲットを清浄化し、正本を上書きする」というトランザクション的なアプローチだ。

実装の極意:Organizerオブジェクトの制御

以下のコードは、組織標準の `.mpt` からカスタムフィールドの定義を抽出し、現在開いているファイルへ強制的に同期させるプロフェッショナル・コードだ。

‘ ————————————————————————-
‘ 組織標準フィールド同期モジュール
‘ 目的: テンプレートファイルからカスタムフィールド定義を強制同期する
‘ ————————————————————————-
Public Sub ForceSyncCustomFields()
Dim sourceTemplate As String
Dim currentProject As Project

‘ テンプレートパスは環境変数や設定シートから読み込むのが定石
sourceTemplate = “C:\Standards\Enterprise_Standard.mpt”
Set currentProject = ActiveProject

On Error GoTo ErrorHandler

‘ 1. 組織標準の定義をOrganizer経由でインポート
‘ 既存の設定を上書き(Overwrite)する設定を徹底する
‘ 引数: Source, Destination, Name, ObjectType
Application.OrganizerMoveItem _
Source:=sourceTemplate, _
Destination:=currentProject.FullName, _
Name:=””, _
ObjectType:=pjOrganizerField

MsgBox “カスタムフィールド定義の同期が完了しました。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “同期失敗: ” & Err.Description, vbCritical
End Sub

このコードの設計ポイント

  • ワイルドカードの活用: `Name:=””` を指定することで、特定のフィールドだけでなく、テンプレート内の全ての定義を強制的に同期させる。
  • 例外処理の重要性: `OrganizerMoveItem` は失敗した際、Project本体を不安定にするリスクがある。必ず `On Error` でトラップし、異常系での整合性を保証すること。

本番環境(プロダクション)での運用上の注意点

このツールを現場に投入する際、以下の3点をアーキテクチャの要件として加えてほしい。

1. 「上書き」の不可逆性を理解せよ

このスクリプトは、既存のプロジェクトファイル内の同名カスタムフィールドを強制的に上書きする。ユーザーが独自にカスタマイズしていた数式やルックアップテーブルも消し飛ぶ可能性がある。

  • 対策: 実行前に必ず「バックアップファイルの自動生成」を行うルーチンを組み込むこと。

2. インデックスの再構築

定義をインポートしただけでは、Projectのインメモリ・オブジェクトが最新状態を正しく認識しない場合がある。

  • 極意: 同期処理の直後に `Application.CalculateAll` を呼び出し、内部インデックスを強制的に再インデックスさせることで、その後の計算処理でのバグを未然に防げる。

3. ファイルアクセスの排他制御

MS Projectは、同時に複数のファイルから同一のグローバル設定を読み込もうとすると、内部の `Global.MPT` との競合でクラッシュすることがある。

  • 対策: サーバー上の共有テンプレートを使用する場合は、一度ローカルの一時フォルダに `FileCopy` でコピーしてからインポート処理を行う。これが、ネットワーク負荷と整合性リスクを回避する唯一の解だ。

結論:自動化は「規律」をコードにする作業

カスタムフィールドの同期は、単なるマクロの実装ではない。「プロジェクトのデータ構造という名の土台を、組織の標準に適合させる」という、ガバナンスそのものだ。

君たちが書く一行のコードが、何百ものプロジェクトファイルの品質を決定づける。
このコードをベースに、各組織特有のルール(フィールドの命名規則チェックなど)を `If` 文で追加していけば、それはもう、どこに出しても恥ずかしくない「エンタープライズ・グレードの自動化ツール」となるはずだ。

次は、このフィールド定義をベースライン設定と連動させる方法について触れよう。だが、まずはこの基本を完璧にマスターすることから始めてほしい。健闘を祈る。

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