【実務・中級編】【初心者向け】プロジェクトファイル作成時に自動で標準カレンダーを適用するテンプレート活用術 – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握する極限の知見

【初心者向け】プロジェクトファイル作成時に自動で標準カレンダーを適用するテンプレート活用術

開発現場において、スケジュール管理の精度はプロジェクトの成否を分ける。しかし、現場の担当者に「新しいプロジェクトファイルを作って」と指示したとき、初期設定のままカレンダー(稼働日・休日)をデフォルトの「標準」のまま放置してしまうミスが後を絶たない。

土日祝日や自社固有の夏季休暇、プロジェクト独自の稼働時間が適用されていないスケジュールなど、百害あって一利なしだ。

今回は、Project VBAのライフサイクルとオブジェクトモデルを熟知したアーキテクトの視点から、「新規プロジェクトファイル作成時、あるいはテンプレート読込時に、強制かつ自動で自社標準カレンダーを適用・上書きする堅牢なマクロ」の構築手法を伝授する。

—

なぜ手動運用や甘い設計は破綻するのか?

多くの初心者は、「プロジェクトテンプレート(.mpt)のデフォルト設定を変更しておけばいい」と考えがちだ。しかし、組織全体で複数のサブジェクトが乱立する環境や、外部から持ち込まれたファイルをベースにする場合、この方法は容易に破綻する。

  • テンプレートのパス迷子: 担当者のPCローカルに古い.mptが残っており、古いカレンダーが伝播する。
  • 手動設定のヒューマンエラー: 「後でカレンダーを設定しよう」とタスクを登録し始め、後から変更した結果、リソースの工数計算が狂う。

だからこそ、「ファイル生成・オープンのフックで、コードが物理的に強制上書きする」というアプローチが必要なのだ。

—

堅牢なプロダクションコード:自動カレンダー適用モジュール

以下のコードは、Projectのグローバルテンプレート(`Global.mpt`)の `App_NewProject` イベント、または専用のオープン処理に組み込むことで、ファイル生成時に一瞬で自社標準カレンダーを適用するプロシージャである。

甘いエラーハンドリングを排除し、例外時にもプロジェクトの整合性を落とさないプロ仕様で記述している。

‘ ==============================================================================
‘ モジュール名: clsProjectInitializer (または標準モジュール)
‘ 概要: 新規作成・オープンされたプロジェクトに自社標準カレンダーを強制適用する
‘ ==============================================================================
Option Explicit

Public Sub ApplyStandardCalendarToActiveProject()
Dim prj As Project
Dim targetCal As Calendar
Dim customCalName As String

‘ 自社標準カレンダーの定義(社内基準に合わせること)
customCalName = “自社標準カレンダー”

‘ 1. アクティブプロジェクトの存在チェック
On Error GoTo ErrorHandler
If ActiveProject Is Nothing Then
MsgBox “アクティブなプロジェクトが存在しません。”, vbCritical, “カレンダー適用エラー”
Exit Sub
End If

Set prj = ActiveProject

‘ 2. 対象のカレンダーが存在するか走査
Dim calFound As Boolean
calFound = False

For Each targetCal In prj.Calendars
If targetCal.Name = customCalName Then
calFound = True
Exit For
End If
Next targetCal

‘ 3. カレンダーが存在しない場合はベースカレンダーから作成またはインポート
If Not calFound Then
‘ ここでは標準ベースのカレンダーを新規作成する例
‘ ※実際には外部ファイルやマスタファイルからBaseCalendarをインポートする設計が望ましい
Set targetCal = prj.Calendars.Add(customCalName)

‘ 稼働時間の調整例(例:平日 9:00 – 18:00、休憩 12:00 – 13:00)
Call SetupWorkingTimes(targetCal)
End If

‘ 4. プロジェクト全体の標準カレンダーとして適用
‘ プロジェクト情報ダイアグラムの「カレンダー」を書き換える
prj.Calendar = customCalName

‘ 5. 全既存タスクのデフォルトカレンダーを強制上書きする場合の処理(必要に応じて有効化)
‘ Dim t As Task
‘ For Each t In prj.Tasks
‘ If Not t Is Nothing Then t.Calendar = customCalName
‘ Next t

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
‘ ログ出力基盤への連携をここに記述すること
End Sub

Private Sub SetupWorkingTimes(ByRef cal As Calendar)
‘ 例として月曜~金曜の稼働時間を再設定するロジック
Dim day As Long
For day = pjMonday To pjFriday
With cal.WeekDays(day)
.Working = True
.WorkTimes.Add From:=#9:00:00 AM#, To:=#12:00:00 PM#
.WorkTimes.Add From:=#1:00:00 PM#ยี To:=#6:00:00 PM#
End With
Next day

‘ 土日は非稼働に設定
cal.WeekDays(pjSaturday).Working = False
cal.WeekDays(pjSunday).Working = False
End Sub

—

アーキテクトが教える:実装上の重要ポイントと罠

このコードを現場に導入するにあたり、以下の「プロの知見」を必ず押さえておいてほしい。

1. イベントプロシージャ(`NewProject`)との統合

上記のマジュールを単体で動かしても、ユーザーが手動で実行しなければ意味がない。
MS Projectの `ThisProject` または `Global.mpt` の `App` イベント (`NewProject` や `WorkbookOpen` に相当する `Project_Open` / `Project_New` イベント) にフックさせ、プロジェクト生成・オープンと同時に走らせるのが定石だ。

‘ ThisProject モジュールに記述
Private Sub Project_Open(ByVal EventProject As Project)
Call ApplyStandardCalendarToActiveProject
End Sub

Private Sub Project_New(ByVal EventProject As Project)
Call ApplyStandardCalendarToActiveProject
End Sub

2. 外部データベース・マスタファイル連携のすすめ

コード内にハードコードでカレンダーの設定(営業時間など)を書くのは、労働法改正や社内規定の変更があった際にメンテナンス漏れを引き起こす温床となる。
大規模な組織であれば、「マスターとなるProjectファイル(Server上の共通ファイル)やSharePointリスト、あるいはDBから最新のカレンダー定義を読み込み、Organizerインポート機能を使って同期する」アーキテクチャを採用すべきだ。

—

結びにかえて:自動化は「品質のバラつき」を殺すためにある

「カレンダーの設定ミス」という、人間なら誰もが犯す原始的なミスを、VBAの数行で完全にハックし、排除する。これこそが業務自動化エンジニアの存在意義である。

属人性を排し、誰が作っても一分の狂いもない正確なプロジェクトファイルを即座に生み出す基盤を、あなたの組織にも今すぐ実装してほしい。

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