こんにちは。Project VBAの世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から、一歩踏み出そうとしているあなたへ。今日は、Projectマネジメントの要である「カレンダー(稼働日)」を、外部データと同期させるという、現場で最も重宝される技術を伝授します。
多くの人が躓く「なぜか反映されない」「休日設定がズレる」という悩み。これらはすべて、Projectのオブジェクトモデルの構造を理解していないことから生まれます。今日で、その霧を晴らしましょう。
—
1. なぜ「外部マスター」が必要なのか?
Projectの休日設定をGUIでポチポチ手動入力するのは、企業のエンジニアとしてやってはいけない「負債」です。
休日マスターをJSONやXMLで一元管理することで:
- 整合性の維持: 複数のプロジェクト間で休日設定がズレない。
- 自動化: 祝日変更や社内カレンダーの更新に一瞬で追従できる。
- トレーサビリティ: 誰がいつ休日を設定したかのログが残る。
今回は、最も汎用的な「JSONファイル」から休日を読み込み、Projectの`Calendar`オブジェクトに反映させるロジックを紐解きます。
—
2. 核心:Project VBAにおける「カレンダー」の構造
まず、頭に入れておくべきはこの階層構造です。
- Project (Application)
- Calendars (コレクション)
- Calendar (オブジェクト)
- Exceptions (例外設定)
- Exception (個別の休日)
Projectにおける「休日」は、`Exceptions`というコレクションに、特定の期間(Start/Finish)を登録することで成立します。この「例外(Exception)」という名前に注目してください。Projectにとって、デフォルトの稼働日以外はすべて「例外」なのです。
—
3. 実践:休日マスターを同期させるコード
今回は、軽量で高速な`ScriptControl`(またはJSONパースライブラリ)を想定した、実用的なアプローチを紹介します。
‘ プロジェクトの特定のカレンダーに休日を反映させる
Sub ApplyHolidaysFromJson(filePath As String)
Dim pj As Project
Dim cal As Calendar
Dim jsonObj As Object ‘ JSON解析用オブジェクト
Dim holiday As Variant
Set pj = ActiveProject
‘ カレンダー名は環境に合わせて変更してください
Set cal = pj.BaseCalendars(“標準”)
‘ 1. JSONをパースする(※別途JSON解析ライブラリ等をご利用ください)
‘ ここでは簡略化のため、配列を取得した前提で記述します
Dim holidays As Collection
Set holidays = ParseJsonFile(filePath)
‘ 2. 既存の例外をクリアする(運用ポリシーに合わせて調整)
‘ 全てクリアするのではなく、過去のものは残すのが現場の定石です
‘ 3. 休日を登録
For Each holiday In holidays
‘ Exceptions.Add で休日を追加
‘ Name: 休日名, Start: 開始日, Finish: 終了日
cal.Exceptions.Add Name:=holiday(“name”), _
Start:=holiday(“date”), _
Finish:=holiday(“date”)
Debug.Print “登録完了: ” & holiday(“name”) & ” (” & holiday(“date”) & “)”
Next holiday
MsgBox “カレンダーの同期が完了しました。”, vbInformation
End Sub
コードの解説
- `BaseCalendars`: これが「ベースカレンダー」を指します。プロジェクト全体に影響を与える「標準」などのカレンダーを操作する際は、ここからアクセスします。
- `Exceptions.Add`: 最も重要なメソッドです。ここでのポイントは`Start`と`Finish`を同じ日に設定すること。これで「1日だけの休日」が定義されます。
- エラーハンドリングの極意: 実務では`cal.Exceptions.Add`の前に「既に登録されている日付か?」をチェックするロジックを挟むのがプロの仕事です。重複登録はProjectの動作を重くし、予期せぬ計算エラーを招きます。
—
4. 陥りやすい罠と解決策
罠1:日付形式の不一致
Project VBAは`Date`型に対して非常に神経質です。JSONから読み込んだ文字列を`CDate()`で明示的に変換しないと、型不一致エラーで止まります。必ず`CDate(holiday(“date”))`と型を確定させてください。
罠2:ベースカレンダーとリソースカレンダーの混同
「ベースカレンダー」はプロジェクトの共通設定、「リソースカレンダー」は個人の稼働設定です。リソース個別の休日をいじる場合は、`ActiveProject.Resources`から対象リソースを特定し、その`Calendar`プロパティを操作する必要があります。まずは「ベース」で成功させてから、リソースへ応用しましょう。
—
5. 最後に:エンジニアとしてのマインドセット
自動化とは、単にコードを書くことではありません。「いかにしてメンテナンスコストを下げるか」という設計思想です。
今回紹介したJSONを外部から読み込む手法は、休日が変わるたびにVBAコードを書き換えるという「前時代的な苦行」からあなたを解放します。まずはこのコードをコピーして、ご自身の環境で動かしてみてください。
「動いた!」という瞬間、あなたはもう、単なるユーザーではなく、Projectという巨大なシステムを制御するエンジニアの入り口に立っています。
次回の記事では、このカレンダー設定を「リソースの稼働率」と連動させて、ガントチャートの進捗を自動補正する高度なテクニックについてお話ししましょう。
応援しています。あなたの自動化の旅が、素晴らしいものになりますように。
