テンプレートの「魂」を継承せよ: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のファイルは単なる箱ではなく、構造化されたデータベースです。その構造を理解し、正しい定義を強制的に注入する。この姿勢が、大規模プロジェクトを動かすシステムを支えるのです。
もし分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、全力で応援しています。
—
それでは、良いコーディングライフを!
