【入門編】【上級者向け】プロジェクトのグローバルテンプレート(.MPT)を動的に切り替える運用 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録すらない孤高のアプリ「Microsoft Project」において、VBAを操ることは、まるで要塞のマスターキーを手に入れるようなものです。

今回は、現場のエンジニアなら誰もが一度は頭を悩ませる「グローバルテンプレート(GLOBAL.MPT)」の動的切り替えという、一歩進んだ極限の知見をお伝えします。

「複数のプロジェクトで異なるカスタムフィールドやビューを使いたいけれど、毎回PCの設定を変えるのは面倒……」
そんな悩みを鮮やかに解決するアプローチを、優しく、そして本質的な部分までしっかりと解説していきましょう。ここをクリアすれば、あなたのProject VBAスキルは間違いなくプロの領域に到達しますよ!

1. なぜ「GLOBAL.MPTの動的切り替え」が必要なのか?

MS Projectには、すべてのプロジェクトの土台となる設定(ビュー、テーブル、フィルター、そしてカスタムフィールドなど)を保持する`GLOBAL.MPT`という特別なファイルが存在します。

通常、ProjectはこのファイルをローカルPCの隠しフォルダから自動読み込みします。しかし、ここで大きな壁にぶつかります。

  • 環境依存の悲劇: 部署A用の設定と部署B用の設定が混ざり合い、別のPCで開くとカスタムフィールドの定義が狂う。
  • 配布の限界: ユーザー全員に「このファイルを指定フォルダに上書きしてね」と頼んでも、大抵はファイル迷子になってトラブルが起きる。

これを解決するのが、「VBAを使って、開くプロジェクトの性質に応じたテンプレート(または別名のMPT)を動的にアタッチ・適用する」というスマートな仕組みです。

2. 【基本理解】Project VBAの作法とグローバル設定

まずは、Project VBAの基本的なお作法を確認しておきましょう。Excel VBAと違い、Projectは「スケジュールそのもの」を扱うため、オブジェクトのスコープ(有効範囲)が少し独特です。

Projectにおけるグローバル設定やテンプレート操作のキホンは以下の通りです。

1. ActiveProject:現在アクティブなプロジェクトを指すオブジェクト。
2. Organizer(オーガナイザー):テンプレート間やプロジェクト間で、ビューやカスタムフィールドなどをコピーするための強力な機能。
3. Templateプロパティ:プロジェクトがどのテンプレートに基づいているかを確認・設定するプロパティ。

これらを組み合わせて、「VBAの起動時に、必要なテンプレートから最新の設定を現在のプロジェクトへ流し込む」という動的制御を実現します。

3. 【実践コード】動的テンプレート適用エンジンの実装

それでは、実際の現場でそのままコピペして使える実用コードを公開します。
このコードは、指定したフォルダにある「プロジェクト種別ごとのテンプレートファイル(.mpt)」から、現在のプロジェクトへ必要なカスタムフィールドやビューを動的にインポート(同期)するプロシージャです。

‘ ==============================================================================
‘ モジュール名: modTemplateManager
‘ 概要: プロジェクトの性質に応じて外部MPTから設定を動的に同期する
‘ 執筆者: チーフアーキテクト
‘ ==============================================================================
Option Explicit

Public Sub ApplyDynamicTemplate()
Dim targetTemplatePath As String
Dim projectType As String

On Error GoTo ErrorHandler

‘ 1. プロジェクトの性質を判定(例: プロジェクト名やユーザー入力、あるいはプロパティから判定)
‘ ここでは簡潔に、ユーザーにモードを選択させるダイアログを例とします
projectType = InputBox(“適用するプロジェクト種別を入力してください。” & vbCrLf & _
“1: システム開発標準 (IT)” & vbCrLf & _
“2: 土木建築標準 (Construction)”, _
“グローバルテンプレート動的切替”, “1”)

If projectType = “” Then Exit Sub ‘ キャンセルされたら終了

‘ 2. テンプレートファイルのパスを動的に決定
‘ 実際の現場では、ネットワーク共有ドライブ(UNCパス)などを指定すると効果的です
Dim baseDir As String
baseDir = “C:\ProjectTemplates\” ‘ ※環境に合わせて変更してください

Select Case projectType
Case “1”
targetTemplatePath = baseDir & “IT_Standard.mpt”
Case “2”
targetTemplatePath = baseDir & “Construction_Standard.mpt”
Case Else
MsgBox “無効な選択です。”, vbCritical, “エラー”
Exit Sub
End Select

‘ 3. テンプレートファイルの存在確認
If Dir(targetTemplatePath) = “” Then
MsgBox “指定されたテンプレートが見つかりません:” & vbCrLf & targetTemplatePath, vbCritical, “ファイルエラー”
Exit Sub
End If

‘ 4. オーガナイザーを使用して、テンプレートから現在のプロジェクトへカスタムフィールドを動的インポート
‘ 例として「タスク費用のカスタムフィールド」を同期するケースを想定
Application.OrganizerItemCopy _
Source:=targetTemplatePath, _
Destination:=ActiveProject.FullName, _
Object:=pjOrganizerObjectFields, _
Name:=”費用01″ ‘ テンプレート側に存在するフィールド名

‘ 5. ビューの同期も同時に行う場合
Application.OrganizerItemCopy _
Source:=targetTemplatePath, _
Destination:=ActiveProject.FullName, _
Object:=pjOrganizerObjectViews, _
Name:=”【PMO指定】進捗管理ガント”

MsgBox “テンプレートの動的適用が正常に完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

4. 陥りやすい罠とエンジニアの知見(トラブルシューティング)

この高度なテクニックを実装する際、多くのエンジニアがハマる「落とし穴」があります。事前に知っておくことで、無駄なデバッグ時間をゼロにしましょう。

罠1: 「ファイルが使用中で開けません」エラー

  • 原因: Projectがすでに開いているMPTファイルに対して排他制御をかけるため、別プロセスから同時に書き込もうとすると弾かれます。
  • 対策: 動的に読み込むテンプレート(`Source`側)は、必ず「読み取り専用(Read-Only)」としてアクセスするか、ネットワーク上の共有リポジトリに置く場合はローカルのテンポラリフォルダに一度コピーしてから参照する設計にしましょう。

罠2: OrganizerItemCopyで同名アイテムの競合

  • 原因: 既にプロジェクト内に同名のカスタムフィールドやビューが存在する場合、上書き確認のダイアログがポップアップし、VBAの実行が止まってしまいます(無人実行・自動化の妨げになります)。
  • 対策: Project VBAには直接の上書き強制フラグはありませんが、事前に同名アイテムを削除するサブルーチンを挟むか、エラーハンドリングを堅牢に構築しておくのがプロの技です。

5. おわりに:ここをクリアすれば、Project VBAの基本はバッチリです!

今回は「グローバルテンプレートを動的に切り替える運用」という、一歩進んだアーキテクチャについて解説しました。

一見すると複雑に見えるOrganizer機能やパスの動的制御も、仕組みの本質(「どこから何をコピーし、どこに適用するか」)さえ理解してしまえば、恐るるに足らずです。この手法を導入するだけで、チーム全体のスケジュール管理の品質が劇的に均一化され、「あの人のPCだとエラーが出る」といった環境依存のトラブルから完全に解放されます。

ぜひ、あなたの開発現場やPMO業務にこの知見を組み込み、スマートな自動化ライフを満喫してください。それでは、次回の極限の知見でお会いしましょう!

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