【実務・中級編】リソースの「ベースカレンダー」を外部の休日マスター(JSON/XML)から自動生成する – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握せよ:外部休日データによる「ベースカレンダー」自動同期の極意

多くのVBAエンジニアが陥る罠がある。それは、ProjectのGUIをポチポチと手動で操作し、休日をカレンダーに反映させるという「無駄なルーチン」だ。プロジェクトの規模が大きくなればなるほど、この作業はリスクと化す。担当者が一人変われば祝日設定がズレ、スケジュールは崩壊する。

今回は、Project VBAの核心である`Calendar`オブジェクトを操作し、外部のJSON/XMLマスターから休日を自動同期させる「堅牢なアーキテクチャ」を伝授する。

—

1. なぜ「手動設定」がプロジェクトを殺すのか

Projectの`BaseCalendar`は、一度設定を誤ると後からの修正が極めて困難だ。特に、例外日(Exception)の定義は、日付の重複や範囲指定のミスが発生しやすく、計算ロジックに致命的なバグを埋め込む。

真のプロフェッショナルは「状態」を保持しない。
外部ファイルをマスターとし、VBAは常に「理想の状態を再構築する」という冪等性(Idempotency)を担保した設計にすべきだ。

—

2. 実装の要諦:オブジェクトのライフサイクルと例外処理

Project VBAでのカレンダー操作における鉄則は以下の3点だ。

1. 既存例外の全消去: 差分更新を考えるな。一度クリアして再構築する方が、論理的な整合性を保てる。
2. カレンダーの存在確認: ターゲットとするカレンダーが存在しない場合、あるいは誤ったカレンダーを書き換えるリスクを排除せよ。
3. JSON/XMLのパース: VBA標準機能でJSONを扱うのは苦行だ。`ScriptControl`(32bit環境)か、あるいは外部ライブラリを活用し、必ずバリデーションを通せ。

—

3. プロダクションコード:休日同期エンジン

以下は、外部JSON(休日マスター)を読み込み、Projectのベースカレンダーへ反映させるためのコードである。

‘ 必要な参照設定: Microsoft Project Object Library
‘ ※JSON解析には別途ライブラリ(VBA-JSON等)を推奨

Public Sub SyncBaseCalendar(calendarName As String, jsonFilePath As String)
Dim proj As Project
Dim cal As Calendar
Dim fso As Object
Dim jsonString As String
Dim holidays As Object ‘ JSON解析後のオブジェクト

Set proj = ActiveProject
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. カレンダーの存在チェック
On Error Resume Next
Set cal = proj.BaseCalendars(calendarName)
If cal Is Nothing Then
MsgBox “指定されたカレンダーが見つかりません。”, vbCritical
Exit Sub
End If
On Error GoTo 0

‘ 2. ファイル読み込み
jsonString = fso.OpenTextFile(jsonFilePath, 1).ReadAll
Set holidays = ParseJson(jsonString) ‘ JSON解析関数(別途実装済みと仮定)

‘ 3. カレンダーの初期化(全例外の削除)
Dim exc As Exception
For Each exc In cal.Exceptions
exc.Delete
Next exc

‘ 4. 休日データの反映
Dim item As Object
For Each item In holidays(“holidays”)
‘ Exceptionの追加: Name, Start, Finish, Type(1=休日)
cal.Exceptions.Add Name:=item(“name”), _
Start:=item(“date”), _
Finish:=item(“date”), _
Type:=pjExceptionTypeNonworking
Next item

MsgBox “カレンダー同期が完了しました。”, vbInformation
End Sub

—

4. 堅牢性を高めるためのアーキテクチャのヒント

ファイル連携の注意点

  • 排他制御: 外部ファイルが読み取り中にならないよう、`FileSystemObject`の利用時は必ず`OpenTextFile`で適切なアクセス権限を確認すること。
  • バリデーション: 日付フォーマットが `YYYY/MM/DD` に準拠しているか、また過去の日付を意図せず含んでいないか。この「データ・クレンジング」のフェーズをVBAの前段に必ず設けること。

パフォーマンスの最適化

数百件の休日をループで回す場合、`Application.ScreenUpdating = False`を併用してもProjectのUI更新は重い。もし数千件規模の複雑なカレンダーを扱うなら、一時的にカレンダーをコピーし、編集後にマスターと差し替える「スワップ・アーキテクチャ」が有効だ。

—

5. 最後に:エンジニアとしての矜持

このスクリプトは単なる自動化ツールではない。「プロジェクトの予定」という最も不確実な変数に対し、「外部ソースから定数化する」という規律を導入するための武器だ。

VBAは枯れた技術だと言われるが、正しく扱えば、これほどまでにプロジェクトの基盤を強固にする手段は他にない。今日書いたこのコードが、あなたのチームの無駄な残業を一つ消し、より本質的な「プロジェクトの価値創造」に時間を充てられるようになることを願っている。

さあ、Projectを支配せよ。

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