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

スポンサーリンク

テンプレートの「魂」を継承せよ:Project VBAでカスタムフィールドを強制同期させる極意

こんにちは。現場で泥臭く、しかし誰よりもエレガントな自動化を追求するエンジニアです。

Project VBAの世界へようこそ。多くの人が「マクロの記録」という入り口から入りますが、そこから一歩先へ進むには、「オブジェクトのライフサイクル」を理解する必要があります。

今回は、組織標準のカスタムフィールドが崩壊したプロジェクトファイルに対し、テンプレート(.mpt)から定義を「強制的に同期」させ、ガバナンスを保つための実用的な手法を伝授します。

1. なぜ「同期」が必要なのか?

プロジェクトの現場では、誰かが誤ってカスタムフィールド(ユーザー設定フィールド)を削除したり、名前を変えたりすることは日常茶飯事です。

もし、組織標準の「重要度」というフィールドが、あるファイルでは「重要度_修正版」になっていたら? レポート出力や分析ロジックは即座に破綻します。「テンプレートから定義を強制的に上書きする」。この強引とも言える手法こそが、大規模PMOにおける整合性の防波堤なのです。

2. 核心技術:`OrganizerCopy` メソッド

Project VBAにおいて、フィールド定義やビュー、カレンダーなどの設定を別ファイルから持ち込むための最強の武器が `OrganizerCopy` です。

基本的な考え方

Projectオブジェクトには `OrganizerCopy` という強力なメソッドがあります。これを使うと、まるでエクスプローラーでファイルをコピーするように、特定の要素をテンプレートファイルから現在開いているプロジェクトへ「強制転送」できます。

3. 実践コード:カスタムフィールド強制同期マクロ

以下のコードを、あなたの「管理用ツール」に組み込んでください。

Sub ForceSyncCustomFields()
‘ テンプレートのパスを指定(ネットワークドライブ推奨)
Const strTemplatePath As String = “C:\Templates\Standard_Project.mpt”

Dim projTarget As Project
Set projTarget = ActiveProject

‘ 念のためエラーハンドリングを仕込むのがプロの流儀
On Error GoTo ErrorHandler

‘ OrganizerCopyの構文:
‘ OrganizerCopy(ソース元パス, 宛先パス, アイテム名, アイテムの種類)
‘ pjCustomFields は定数で、カスタムフィールド定義を指す

OrganizerCopy Source:=strTemplatePath, _
Destination:=projTarget.FullName, _
Name:=”重要度”, _
Object:=pjCustomFields

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

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

コードの解説

  • `pjCustomFields`: これはProject VBAが内部で持っている列挙型定数です。これを使うことで「フィールド定義をコピーする」と明示しています。
  • `Destination:=projTarget.FullName`: 現在開いているファイルのパスを宛先に指定することで、アクティブなプロジェクトに定義を直接流し込みます。

4. 初学者が陥りやすい「3つの罠」

ここをクリアすれば、あなたはもう脱・初級者です。

1. パスの記述ミス: `.mpt` ファイルがネットワーク上にある場合、フルパスの指定は慎重に。「\」の数やサーバーの接続状況を確認してください。
2. 存在しない名前の指定: `Name:=”重要度”` で指定する名前がテンプレート内に存在しないと、エラーになります。事前にテンプレートを開いて、正確な名称を確認しましょう。
3. 保存のタイミング: このマクロは「定義」を同期しますが、プロジェクトファイルを保存するのはあくまでユーザーの操作か、コード内の `ActiveProject.Save` です。同期後は必ず保存を促すUIを実装しましょう。

5. 次のステップへ

今回の手法をマスターすれば、次は「ビュー(ガントチャートのレイアウト)」や「カレンダー(稼働日設定)」の同期にも応用できます。`pjCustomFields` の部分を `pjViews` や `pjCalendars` に変えるだけです。

エンジニアの心得:
「マクロに記録させる」のではなく、「オブジェクトモデルを操る」という意識を持ってください。Projectのファイルは単なる箱ではなく、構造化されたデータベースです。その構造を理解し、正しい定義を強制的に注入する。この姿勢が、大規模プロジェクトを動かすシステムを支えるのです。

もし分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、全力で応援しています。


それでは、良いコーディングライフを!

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