プロジェクト管理を極める!Project VBAでテンプレート(.mpt)を動的に差し替えて新規作成する「ファクトリパターン」超入門
こんにちは!いつも業務自動化の旅を一緒に歩んでくれてありがとうございます。頼れる先輩エンジニアの私と一緒に、一歩上のVBAの世界へ踏み出してみましょう。
Microsoft Project(以下、MS Project)を使いこなしているあなたなら、「プロジェクトの種類(新規開発、保守、インフラ構築など)によって、タスクの初期構成やカレンダーの設定をガラッと切り替えたい」と思ったことはありませんか?
毎回、手動でテンプレート(`.mpt` ファイル)を選んで開くのは面倒ですし、何よりミスの原因になります。
そこで今回は、VBAを使って「条件に応じて最適なテンプレートを自動で選択し、新しいプロジェクトをスマートに立ち上げる」という動的テンプレート差し替え(ファクトリパターン風)の自動化に挑戦します!
「上級者向け」と聞いて身構える必要はありません。マクロの記録から脱却したいあなたに向けて、Project VBAの本質を優しく紐解きながら解説します。ここをクリアすれば、Project VBAの基本はバッチリですよ!
—
1. なぜ「テンプレートの動的差し替え」が必要なのか?
MS Projectでプロジェクトを立ち上げる際、すべてのプロジェクトが同じ構造であることは稀です。
- 大規模開発プロジェクト:詳細なWBS、厳密なマイルストーン、専用のリソースカレンダーが必要。
- 保守・運用プロジェクト:定常運用のタスクリスト、比較的緩やかなリソース割り当て。
- クイックタスク:最小限のタスクと、標準カレンダー。
これらを1つの共通テンプレートで運用しようとすると、不要なタスクを消したり、足りない設定を追加したりする「無駄な手作業」が発生します。
VBAの力で「この案件は『開発』だから『開発用テンプレート.mpt』を使ってね」とプログラムに判断(ファクトリパターンの考え方)させることで、ボタン一つで完璧な初期設定のプロジェクトファイルが生成されるようになります。
—
2. 【図解】動的テンプレート生成の流れ
プログラムを書き始める前に、全体のイメージを頭に入れておきましょう。処理の流れはとてもシンプルです。
[ユーザーの入力 / 案件情報]
│ (例: 「開発案件」 or 「保守案件」)
▼
┌──────────────────────────────┐
│ VBAファクトリ関数 (判定処理) │
└──────────────┬───────────────┘
│
┌───────┴───────┐
▼ ▼
【開発用.mpt】 【保守用.mpt】 (最適なテンプレートを選択)
│ │
└───────┬───────┘
▼
┌──────────────────────────────┐
│ FileOpenEx メソッド実行 │
└──────────────┬───────────────┘
│
▼
[新しいプロジェクト(Project1等)が自動生成!]
このように、VBAがクッションとなり、裏側で適切なテンプレートファイルを指定して開くことで、ユーザーは何も意識せずに正しい設定でプロジェクトを開始できるのです。
—
3. Project VBAでテンプレートを開く魔法のメソッド
Excel VBAでブックを開くときは `Workbooks.Open` を使いますが、Project VBAでは `Application.FileOpenEx` というメソッドを使用します。
このメソッドは非常に強力で、通常のプロジェクトファイル(`.mpp`)だけでなく、テンプレートファイル(`.mpt`)を指定して開くこともできます。テンプレートを開いた場合、MS Projectは「そのテンプレートをベースにした未保存の新規プロジェクト」を自動的に作成してくれます。元のテンプレートファイルを上書きしてしまう心配がないため、非常に安全です。
主要な引数の紹介
- `Name`: 開きたいファイル(テンプレート)のフルパスを指定します。
- `ReadOnly`: テンプレートを壊さないよう、通常は `True`(読み取り専用)で開きます。
—
4. 実践コード:動的テンプレートファクトリVBA
それでは、実際に使える美しいコードを見てみましょう。
このコードは、案件の種類を表す「キー(Key)」を渡すと、適切なテンプレートを選択して新規プロジェクトを立ち上げる「ファクトリ(工場)」の役割を果たします。
標準モジュールを作成し、以下のコードを貼り付けてみてください。
Option Explicit
‘ 案件タイプを定義する列挙型(コードの可読性を高めるため)
Public Enum ProjectType
ptSoftwareDevelopment = 1 ‘ ソフトウェア開発
ptMaintenanceOperation = 2 ‘ 保守・運用
ptSimpleTask = 3 ‘ 簡易タスク
End Enum
”’
”’
”’ 案件のタイプ(ProjectType列挙型)
Public Sub CreateNewProjectFromTemplate(ByVal targetType As ProjectType)
Dim templateFolder As String
Dim templateFileName As String
Dim fullPath As String
‘ 1. テンプレートが保存されているフォルダパスを設定
‘ ※実際の環境に合わせて変更してください(末尾に “\” を含めます)
templateFolder = ThisProject.Path & “\Templates\”
‘ テスト用に、デスクトップなどを指定する場合は以下のようにします
‘ templateFolder = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\ProjectTemplates\”
‘ 2. 条件分岐(ファクトリ処理):タイプに応じてテンプレートのファイル名を決定
Select Case targetType
Case ProjectType.ptSoftwareDevelopment
templateFileName = “Dev_Template.mpt”
Case ProjectType.ptMaintenanceOperation
templateFileName = “Maint_Template.mpt”
Case ProjectType.ptSimpleTask
templateFileName = “Simple_Template.mpt”
Case Else
MsgBox “未定義のプロジェクトタイプが指定されました。”, vbCritical, “エラー”
Exit Sub
End Select
fullPath = templateFolder & templateFileName
‘ 3. テンプレートファイルの存在確認(エラーを未然に防ぐプロの作法)
If Dir(fullPath) = “” Then
MsgBox “指定されたテンプレートファイルが見つかりません:” & vbCrLf & fullPath, _
vbExclamation, “ファイル未検出”
Exit Sub
End If
‘ 4. MS Projectの画面更新と警告を一時的に停止してパフォーマンス向上
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Application.DisplayAlerts = False
‘ 5. テンプレートから新規プロジェクトを生成
‘ FileOpenExでテンプレートを指定して開くと、新規プロジェクトが立ち上がります
Application.FileOpenEx Name:=fullPath, ReadOnly:=True
‘ アクティブになった新規プロジェクトに、わかりやすい仮の名前(タイトル)を設定
ActiveProject.Title = “新規プロジェクト_” & Format(Date, “YYYYMMDD”)
MsgBox “テンプレート [” & templateFileName & “] から新規プロジェクトを作成しました!”, _
vbInformation, “作成完了”
Cleanup:
‘ 警告表示と画面更新を必ず元に戻す(ライフサイクルのクリーンアップ)
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “プロジェクトの作成中にエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
Resume Cleanup
End Sub
”’
”’
Sub Test_CreateDevProject()
‘ 開発用プロジェクトを作成するファクトリを呼び出す
Call CreateNewProjectFromTemplate(ProjectType.ptSoftwareDevelopment)
End Sub
”’
”’
Sub Test_CreateMaintProject()
‘ 保守用プロジェクトを作成するファクトリを呼び出す
Call CreateNewProjectFromTemplate(ProjectType.ptMaintenanceOperation)
End Sub
—
5. コードの解説と本質的なポイント
このコードには、ただ「マクロを記録しただけ」では絶対に到達できない、プロフェッショナルな設計思想が詰まっています。いくつか大切なポイントを解説しますね。
① 列挙型(`Enum`)による「マジックナンバー」の排除
コードの最初にある `Enum ProjectType` は、プログラム内で「1番は開発、2番は保守……」という暗黙のルール(マジックナンバー)を排除するためのものです。
`CreateNewProjectFromTemplate(ProjectType.ptSoftwareDevelopment)` と書くことで、誰が見ても「開発用のプロジェクトを作っているんだな」と直感的に理解できるようになります。
② 安全を担保する `Dir` 関数での事前チェック
`FileOpenEx` を実行する前に、`Dir(fullPath)` を使って「本当にファイルが存在するか」をチェックしています。
これを行わずにエラーが発生すると、ユーザーに対して不親切な「実行時エラー」のダイアログが表示されてしまいます。事前にチェックして、優しい日本語のメッセージを出してあげるのが先輩エンジニアの気配りです。
③ 画面更新(`ScreenUpdating`)とダイアログ(`DisplayAlerts`)の制御
Projectの操作中、画面がチラチラ動くのを防ぎ、処理速度を向上させるために `ScreenUpdating = False` にしています。
また、テンプレートを開く際に出てくるかもしれない不要なダイアログを `DisplayAlerts = False` でシャットアウトしています。
これらは、処理が終わった後(またはエラーが発生した時)に、必ず `True` に戻すのが鉄則です。`Cleanup:` というラベルを用意して、どのようなルートを通っても必ずここを通るように設計しているのがポイントです。
—
6. 陥りやすい罠とプロの回避策
Project VBAならではの、陥りやすい罠についても触れておきます。ここさえ押さえておけば、トラブルシューティングも怖くありません!
罠1: グローバルテンプレート(Global.mpt)との衝突
MS Projectには、すべてのファイルに共通の設定を適用するための `Global.mpt` というシステムファイルが存在します。
自作のテンプレート(`.mpt`)を開いたとき、カレンダーやビューの名前が `Global.mpt` にあるものと重複していると、「上書きしますか?」といった警告ダイアログが出ることがあります。
- 対策: `Application.DisplayAlerts = False` を記述しておくことで、これらの問い合わせを自動的にデフォルトの回答でスキップさせることができます。
罠2: ファイルパスの相対指定
`ThisProject.Path` は、現在マクロを実行しているプロジェクトファイルが保存されているフォルダを指します。
もし、一度も保存していない「プロジェクト1」の状態でマクロを実行すると、`ThisProject.Path` は空文字(`””`)になってしまい、ファイルが見つからないエラーになります。
- 対策: テンプレートはネットワーク共有フォルダ(`\\server\share\templates\`)など、常にアクセス可能な絶対パスで管理することをお勧めします。
—
まとめと次のステップ
お疲れ様でした!今回は、プロジェクトテンプレートを動的に選択して新規ファイルを作成する、実用的な「ファクトリパターン」の実装方法を解説しました。
今回の知識を身につければ、以下のような一歩進んだ自動化も簡単に作れるようになります。
1. Excelの案件管理台帳と連携し、Excel上のボタンを押すだけで、案件の種別に応じたMS Projectファイルを自動生成して保存する。
2. 新規作成したプロジェクトに、本日の日付を起点とした基準計画(ベースライン)を自動でセットする。
「マクロの記録」で作られたコードは、環境の変化に弱いものです。しかし、今回のように「オブジェクトのライフサイクル」や「丁寧なエラーハンドリング」を意識して書かれたコードは、開発現場で長く愛用される強力な武器になります。
一歩一歩、確実にステップアップしていきましょう。あなたなら、きっと素晴らしい自動化システムを構築できますよ!応援しています!
