【Project VBA】新規プロジェクト作成時にカレンダーと標準作業時間を強制適用するテンプレート自動化術
開発現場でMS Projectを導入する際、最も頻発する「初期設定ミス」をご存知だろうか。
それは、担当者が新規プロジェクトファイルを作成した際、デフォルトのグローバルカレンダーや組織標準の作業時間(1日あたりの労働時間など)を適用し忘れるというヒューマンエラーだ。
このミスを放置するとどうなるか。
- 稼働日設定がズレたままリソースアサインが行われ、スケジュールが完全に破綻する。
- 担当者ごとに「8時間労働」ベースだったり「7.5時間労働」ベースだったりが混在し、工数集計が無意味になる。
我々業務自動化エンジニアの使命は、こうした「人間の注意力に依存した運用」をシステムで根絶することにある。今回は、新規プロジェクト作成の瞬間に、組織標準のカレンダーと作業時間を自動適用する堅牢なVBAテンプレート構築法を伝授しよう。
—
なぜ「手動設定」や「標準テンプレートファイル」だけでは破綻するのか?
多くの現場では、「プロジェクトテンプレート(.mpt)をデスクトップに置いておき、そこから開くように」とマニュアルを配布する。だが、現場のエンジニアやPMは忙しい。古いテンプレートを開いてしまったり、まっさらな状態から「新規作成」を押してしまったりする事故が後を絶たない。
また、VBA初心者がやりがちな非効率なアプローチとして、以下のようなコードがある。
‘ 【アンチパターン】これでは実務で使い物にならない例
Sub BadExample()
‘ 単にカレンダー名を設定しているだけ
ActiveProject.Calendar = “組織標準カレンダー”
‘ これだけだと、プロジェクト全体のオプション(1日の時間数など)がデフォルトのまま取り残される
‘ 結果、スケジュールの計算エンジンが狂う
End Sub
MS Projectのバックエンド(スケジューリングエンジン)は極めてシビアだ。カレンダーの割り当てだけでなく、「1日の作業時間(MinutesPerDay)」「週の作業時間(MinutesPerWeek)」といったプロジェクトオプションが、ベースラインやEVM(アーンド・バリュー・マネジメント)の計算根拠と完全に一致していなければならない。
この整合性を、マクロによってプログラム側で強制担保するのが今回のアプローチの本質である。
—
プロダクションコード:堅牢な初期化マクロの実装
以下のコードは、新規プロジェクト作成時(あるいはテンプレート適用時)に実行し、組織標準の稼働カレンダーの作成・割り当て、およびプロジェクト全体の標準作業時間を一括設定するプロダクションコードだ。
実務での耐障害性を考慮し、エラーハンドリングとオブジェクトのライフサイクルを意識した設計にしている。
Option Explicit
‘ ==============================================================================
‘ 組織標準プロジェクト初期化モジュール
‘ 概要: 新規プロジェクトに対し、標準カレンダーと労働時間パラメータを強制適用する
‘ ==============================================================================
Public Sub ApplyStandardProjectSettings()
Dim prj As Project
Set prj = ActiveProject
‘ 1. エラーハンドリングの有効化(MS Project特有の例外をキャッチ)
On Error GoTo ErrorHandler
‘ アプリケーション全体の画面描画を停止し、処理速度を劇的に向上させる
App.ScreenUpdating = False
‘ 2. プロジェクト基本オプションの設定(組織標準:1日 = 8時間 = 480分)
‘ ※ここの数値をハードコーディングせず、外部DBや定数管理する設計がベスト
Const STANDARD_HOURS_PER_DAY As Double = 8#
Const STANDARD_DAYS_PER_WEEK As Double = 5#
With prj
.MinutesPerDay = STANDARD_HOURS_PER_DAY 60 ‘ 480分
.MinutesPerWeek = STANDARD_DAYS_PER_WEEK 480 ‘ 2400分
.DaysPerMonth = 20 ‘ 月平均稼働日
‘ スケジュールの基点(開始日または完了日)をプロジェクトプロパティに設定
.Start = Date
.ScheduleFrom = pjScheduleFromStart
End With
‘ 3. 組織標準カレンダーの適用と作成
Call EnsureAndApplyCustomCalendar(prj, “【組織標準】標準稼働カレンダー”)
‘ 4. 完了処理
App.ScreenUpdating = True
MsgBox “組織標準のプロジェクト設定が正常に適用されました。”, vbInformation, “初期化完了”
Exit Sub
ErrorHandler:
App.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub
‘ ==============================================================================
‘ 補助プロシージャ: カレンダーの存在確認・生成・適用
‘ ==============================================================================
Private Sub EnsureAndApplyCustomCalendar(targetPrj As Project, calendarName As String)
Dim cal As Calendar
Dim targetCal As Calendar
Dim isExist As Boolean
isExist = False
‘ 既存のプロジェクトカレンダーコレクションを走査
For Each cal In targetPrj.Calendars
If cal.Name = calendarName Then
isExist = True
Set targetCal = cal
Exit For
End If
DeregisterObject:
Next cal
‘ カレンダーが存在しない場合は新しくベースカレンダーとして作成
If Not isExist Then
‘ 標準カレンダーをベースにして新規作成
Set targetCal = targetPrj.Calendars.Add(calendarName)
‘ ここで特殊な休日や就業時間(例: 9:00〜18:00、休憩1時間)のチューニングが可能
‘ targetCal.WorkingTimes.Add … (必要に応じて拡張)
End If
‘ プロジェクトのベースカレンダーとして強制設定
targetPrj.Calendar = targetCal.Name
‘ アクティブビューのタイムスケール等にもカレンダーを反映させる処理をここに記述可能
End Sub
—
現場でトラブルを防ぐための設計上の注意点
このマクロを実際のプロジェクト管理基盤に組み込む際、以下のアーキテクチャ上のポイントを押さえておいてほしい。
1. グローバルテンプレート(Global.mpt)への寄生を避ける
初心者がやりがちなミスとして、「Global.mptにこのマクロを仕込んで全社展開しよう」とするケースがある。しかし、Global.mptの配布管理はバージョン競合や破損リスク(いわゆるグローバル破損)の温床になる。
推奨するのは、「マスタープロジェクトテンプレート(.mpt)」のThisWorkbook(Project_Openイベント)にこのコードを埋め込み、そのテンプレートから新規作成させる手法だ。
‘ ThisProject モジュールに記述
Private Sub Project_Open(ByVal jp As Project)
‘ テンプレートから新規作成された瞬間のみ自動発火させるガード節を入れるとさらに堅牢になる
If jp.Name Like “プロジェクト” Then
Call ApplyStandardProjectSettings
End If
End Sub
2. `ScreenUpdating = False` の徹底
MS ProjectのVBAは、UIの再描画が発生するたびに内部のスケジューリングエンジンが再計算走り、処理が重くなる。大規模なWBSやリソースプールを抱えるファイルでは、カレンダーや作業時間変更の際、必ず画面描画を止めること。これがパフォーマンス劣化を防ぐプロの作法だ。
—
まとめ
プロジェクト管理の自動化において、ルールの「形骸化」を防ぐ唯一の手段は、「人間が手動で設定する余地をコードで奪うこと」である。
今回紹介したテンプレート活用術と初期化マクロを導入すれば、誰がいつ新規プロジェクトを起こそうとも、カレンダーと作業時間は寸分たがわず組織標準に統一される。結果として、複数プロジェクトの横断集計やリソース平準化の精度が劇的に向上するはずだ。
あなたの開発現場の基盤強度を、ワンランク上のレベルへと引き上げてほしい。
