【実務・中級編】Projectの「カレンダー」設定をVBAで操作する:稼働日・休日設定の自動反映ツール – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:カレンダー自動同期でプロジェクトの「時間」を支配せよ

プロジェクトマネジメントにおいて、カレンダー設定は「工数見積もり」という心臓部を司る設定だ。ここが不正確であれば、どんなに高度なガントチャートも、ただの絵空事に過ぎない。

多くのエンジニアがGUIで手動設定し、転記ミスや漏れによるスケジュール崩壊に泣いている。今日は、Excelからカレンダーを自動流し込みし、Projectの計算エンジンを完璧に同期させるための「プロフェッショナルな設計術」を伝授する。

1. なぜ「手動」が致命的なバグを生むのか

Project VBAにおいて、`BaseCalendar`はプロジェクト全体のリソース稼働を左右する極めて重要なオブジェクトだ。しかし、ここには落とし穴がある。

  • カレンダーの競合: 既存の設定を破壊せずに特定の休日のみを追記・更新するロジックが甘いと、プロジェクト全体のクリティカルパスが再計算時に暴走する。
  • 例外処理の不在: `Calendar.Exceptions`オブジェクトの扱いに慣れていないと、重複登録によるエラーで処理が止まる。
  • パフォーマンスの罠: 数百行の休日を一つずつ書き込むのは非効率だ。処理のオーバーヘッドを最小化する設計が必要となる。

2. 堅牢な設計へのアプローチ

このツールを作成するにあたって、以下の設計原則を守る必要がある。

1. 冪等性(べきとうせい)の確保: 何度実行しても結果が同じになるようにする。既存の例外を一度クリアして再構築するか、存在チェックを厳密に行う必要がある。
2. 型安全なインターフェース: Excelのセルから読み込む際は、日付型(Date)であることを厳密にチェックする。
3. エラーハンドリング: Projectのオブジェクトモデルは、無効な日付や期間が渡された瞬間に実行時エラーを吐く。`On Error`によるガードは必須だ。

3. 実装:ExcelからProjectカレンダーへの流し込みコード

以下のコードは、ExcelのA列に「休日日付」が入力されている前提の、プロダクション・レディなコードだ。

‘ 必要な参照設定: Microsoft Project 16.0 Object Library
Sub SyncExcelCalendarToProject()
Dim projApp As Object
Dim targetProj As Project
Dim baseCal As Calendar
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim holidayDate As Date

‘ 1. Projectアプリケーションの取得
Set projApp = Application ‘ Project内から実行する場合
Set targetProj = projApp.ActiveProject

‘ 2. 対象カレンダーの指定(例: 標準カレンダー)
Set baseCal = targetProj.BaseCalendars(“標準”)

‘ 3. Excelデータ取得(事前にExcelオブジェクトを参照または外部ファイルとして開く)
‘ ここではActiveSheetから読み込む例とする
Set ws = ThisWorkbook.Sheets(“HolidayList”)
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row

On Error GoTo ErrorHandler

‘ 4. 既存の例外をクリア(再構築する場合)
‘ 注意: 特定の休日のみ追加したい場合は、Existsチェックを挟むこと
For Each exc In baseCal.Exceptions
exc.Delete
Next exc

‘ 5. カレンダーへの反映
For i = 2 To lastRow
holidayDate = ws.Cells(i, 1).Value

‘ 休日として例外を追加
‘ Type:=1 は休日を表す定数
baseCal.Exceptions.Add Type:=1, Start:=holidayDate, Finish:=holidayDate

Debug.Print “Added Holiday: ” & holidayDate
Next i

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

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

4. 現場で生き残るための運用テクニック

データベース連携の注意点

もし休日マスタがSQL ServerやSharePointリストにある場合、Excelを経由させるのは「情報の鮮度」を損なう原因となる。その場合は、`ADODB`を使用して直接データベースからレコードセットを取得し、Projectの`Calendar`オブジェクトへ直接流し込むべきだ。中間ファイルは、往々にして「最新ではないデータ」の温床となる。

パフォーマンスを最大化する「再計算の抑制」

大規模プロジェクトでは、カレンダーの変更ごとにProjectが自動再計算を行い、UIが固まることがある。これを防ぐには、処理の冒頭で `Application.Calculation = pjManual` に設定し、すべての更新が終わった後に `pjAutomatic` へ戻すのが、エンジニアとしての作法だ。

最後に:なぜ「エンジニア」がやるべきなのか

カレンダー設定という「地味な作業」を自動化できる人間こそが、プロジェクトの現場で最も価値あるエンジニアだ。それは単なる作業の短縮ではない。「プロジェクトの定義をコードで管理する」という、属人性を排除した強固なマネジメント基盤を築くことに他ならないからだ。

さあ、手作業という負債を今すぐコードで返済せよ。あなたのプロジェクトが、より精緻で揺るぎないものになることを期待している。

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