【Project VBAを掌握する極限の知見】プロジェクト作成時に「プロジェクト情報」ダイアログを自動入力する定型化マクロ
開発プロジェクトの立ち上げにおいて、MS Projectの初期セットアップほど不毛な手作業はない。
新しいプロジェクトファイルを起票するたびに、「プロジェクト情報」ダイアログを開き、開始日を合わせ、スケジュールモードを確認し、カレンダーを切り替える。この「儀式」をエンジニアの手で行わせること自体が、プロジェクトマネジメントの観点からも設計ミス(ヒューマンエラー)の温床であり、完全な悪である。
今回は、Project VBAのライフサイクルとオブジェクトモデルを知り尽くしたチーフアーキテクトの視点から、新規プロジェクト作成時の初期設定を秒速で完了させ、チーム全体の品質を均一化する「堅牢な定型化マクロ」の全貌を授ける。
—
なぜ「手動でのプロジェクト情報入力」は現場を崩壊させるのか?
多くの現場では、プロジェクトのテンプレート( `.mpt` )を用意して対応している。しかし、テンプレート運用には致命的な弱点がある。
- 基準日のズレ: テンプレート保存時の古い開始日を引きずり、WBS全体のスケジュール計算が狂う。
- カレンダーの不統一: 担当者が勝手にカスタムカレンダーの紐付けを忘れ、標準カレンダーのままタスクを積んでしまう。
- スケジュールモードの混在: 「自動スケジュール」ではなく「手動スケジュール」のままタスクが作成され、依存関係が機能しない。
これらを防ぐ唯一の解法が、「ファイル生成と同時に、VBAがコードベースでプロジェクトの遺伝子を強制書き込みする」アプローチである。
—
堅牢なマクロ設計の勘所
MS ProjectのVBAにおいて、新規作成直後のプロジェクトオブジェクト(`ActiveProject`)を操作する際、最も恐れなければならないのは「暗黙の前提によるコンテキストエラー」だ。
例えば、プロジェクトの開始日を設定する際、単に日付を代入するだけでは、現在のスケジュール方向(開始日基準か完了日基準か)や、アクティブなカレンダーのロード状態によってエラーを吐く。
プロフェッショナルなコードは、以下の3点を担保しなければならない。
1. スケジュールの基軸の明示: 開始日(`ProjectStart`)を設定する前に、スケジュール管理の起点を明確にする。
2. カレンダーアサインの確実性: 適用したいベースカレンダーがプロジェクト内に確実に存在するか(あるいはグローバルから正しく継承されているか)を担保する。
3. エラーハンドリングと不可逆性の排除: 予期せぬ状態のプロジェクトに対して実行された場合でも、中途半端な設定でファイルを汚さないトランザクション的な発想。
—
【コピペ即実戦】プロダクションコード例
以下のコードは、新規作成したプロジェクトの「プロジェクト情報」ダイアログに相当するパラメータを、一撃で最適化された状態に初期化する実務仕様のプロシージャだ。
通常のアタッチ先(Global.mpt内、または専用のアドイン)に配置して使用する。
Option Explicit
‘ ==============================================================================
‘ 処理名 : InitializeNewProject
‘ 概要 : 新規プロジェクトの初期プロパティ(プロジェクト情報)を強制設定する
‘ 備考 : 開発標準カレンダーの適用および開始日・スケジュール方向の統一
‘ ==============================================================================
Sub InitializeNewProject()
‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler
Dim prj As Project
Set prj = ActiveProject
‘ 1. プロジェクトが正常に取得できているか検証
If prj Is Nothing Then
MsgBox “有効なプロジェクトが開かれていません。”, vbCritical, “初期化マクロエラー”
Exit Sub
End If
‘ 2. アプリケーション全体の画面描画をロックし、処理速度を劇的に向上させる
App.ScreenUpdating = False
With prj
‘ — スケジュール方向の設定 (0: 開始日基準, 1: 完了日基準) —
‘ 基本は「開始日基準 (pjTaskStartDate)」で固定する
.ScheduleFrom = pjTaskStartDate
‘ — プロジェクト開始日の設定 —
‘ ここでは「本日の翌営業日、あるいは指定の月曜日」などを動的に計算するロジックを挟むとさらに堅牢
‘ 今回はサンプルとして「本日の日付」をセット
Dim targetStartDate As Date
targetStartDate = Date ‘ 必要に応じて “2023/10/01” などの固定値やInputBoxに変更可能
.ProjectStart = targetStartDate
‘ — 標準カレンダーの設定 —
‘ 組織標準のカスタムカレンダー(例: “全社標準カレンダー”)を強制適用する
‘ ※あらかじめプロジェクトまたはGlobalに存在している必要がある
Dim targetCalendarName As String
targetCalendarName = “標準” ‘ 現場の要件に合わせて変更 (“プロジェクト標準” 等)
On Error Resume Next
.Calendar = targetCalendarName
If Err.Number <> 0 Then
‘ カレンダーが見つからない場合はフォールバックとしてデフォルトを使用し、警告を出す
MsgBox “指定されたカレンダー ‘” & targetCalendarName & “‘ が見つかりませんでした。” & vbCrLf & _
“デフォルトのカレンダーが適用されます。”, vbExclamation, “カレンダー警告”
Err.Clear
End If
On Error GoTo ErrorHandler
‘ — プロジェクトプロパティ(ファイル情報)のメタデータ設定 —
.Company = “株式会社〇〇テクノロジーズ”
.Author = Application.UserName
.Title = .Name
End With
‘ 画面描画の復元
App.ScreenUpdating = True
‘ 完了通知
MsgBox “プロジェクトの初期化が完了しました。” & vbCrLf & _
“開始日: ” & Format(prj.ProjectStart, “yyyy/mm/dd”) & vbCrLf & _
“基準カレンダー: ” & prj.Calendar, vbInformation, “初期化成功”
Exit Sub
ErrorHandler:
‘ 異常終了時の後始末
App.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
現場で運用する上でのアーキテクトからの助言
このコードを実際の業務システムやPMOの統制ツールに組み込む際は、以下のポイントを遵守してほしい。
1. Global.mpt への依存を断つ
マクロを個別のファイルに埋め込むのではなく、組織共通の `Global.mpt` に配置するか、リボンカスタマイズと連携したアドイン( `.ppa` / `.dll` )として配布すること。これにより、どのメンバーがどの端末で新規プロジェクトを起こしても、一瞬でガバナンスの効いた状態からスタートできる。
2. データベース(PWA / Project Online)連携への布石
将来的にMicrosoft Project ServerやProject Online(Dataverse)へデータをアップロードする環境において、プロジェクトの開始日やカレンダーの不整合は、サーバー側のタスク同期エンジンで重大なコンフリクトを引き起こす。VBAの段階で入力値をバリデーションするこの仕組み自体が、上流工程のデータ品質を守る防壁となる。
手作業を自動化するのではない。「ヒューマンエラーの余地そのものをコードで焼き払う」。
これこそが、真の業務自動化エンジニアが持つべき思想である。今すぐこのスクリプトをあなたの環境に投入し、無駄なセットアップ作業を過去のものにしてほしい。
