プロジェクトの「時間」を支配せよ:ExcelからProjectカレンダーを完全自動制御する極意
こんにちは。現場で泥臭く、かつエレガントな自動化を追求し続けているエンジニアです。
Project VBAを触り始めた皆さんが最初にぶつかる壁、それは「スケジュールがなぜか計算通りにならない」という問題です。その原因の9割は、カレンダー設定の不一致にあります。手動でポチポチと休日を入力するのは、もう終わりにしましょう。
今日は、Excelにある「会社独自の休日リスト」を読み込み、ProjectのBaseCalendarに瞬時に反映させる「カレンダー自動同期エンジン」の構築術を伝授します。これさえマスターすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。
—
1. Project VBAの心臓部:オブジェクトモデルを理解する
Project VBAを操る上で、以下の階層構造は「住所」のようなものです。ここを間違えると、プログラムは迷子になります。
- Application: Projectアプリそのもの。
- Project: 現在開いているプロジェクトファイル。
- BaseCalendar: プロジェクト全体で共有する「カレンダーの型」。
- CalendarException: カレンダーの中にある「例外日(休日や特別稼働日)」。
今回ターゲットにするのは、この`BaseCalendar`です。特定のプロジェクトに依存しない「共通の型」を操作することで、正確な工数計算が可能になります。
—
2. 実践:Excelからカレンダーを流し込むスクリプト
それでは、実践的なコードを見ていきましょう。このコードは「Excelのシートに『日付』が並んでいる」ことを前提としています。
Sub UpdateProjectCalendar()
‘ 変数宣言を厳密に行うのがプロの第一歩
Dim projApp As Object
Dim projFile As Project
Dim baseCal As Calendar
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim holidayDate As Date
‘ Projectアプリを操作するための接続
Set projApp = Application
Set projFile = projApp.ActiveProject
‘ Excelシートから休日リストを取得(ActiveSheetを想定)
Set ws = ThisWorkbook.ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
‘ ベースカレンダーを取得(「標準」カレンダーを指定)
Set baseCal = projFile.BaseCalendars(“標準”)
‘ 既存の例外設定を一度クリアしたい場合はここを有効に
‘ For Each exc In baseCal.Exceptions: exc.Delete: Next
‘ 休日リストをループしてProjectに反映
For i = 2 To lastRow ‘ 1行目はヘッダーと仮定
holidayDate = ws.Cells(i, 1).Value
‘ 休日として例外を追加(開始日と終了日は同じにする)
‘ 例外名は適宜「社内休日」等に設定
baseCal.Exceptions.Add Type:=pjDayTypeWorking, _
Start:=holidayDate, _
Finish:=holidayDate, _
Name:=”社内休日”
Next i
MsgBox “カレンダーの同期が完了しました!”, vbInformation
End Sub
コードの解説:ここが「キモ」です
- `BaseCalendars(“標準”)`: これが最も重要です。ここを間違えると、特定のタスク専用のカレンダーだけを書き換えてしまい、全体のスケジュールが崩壊します。
- `Exceptions.Add`: カレンダーの「例外」とは、デフォルトの稼働日ルールを上書きする特別な日のことです。ここを正確に指定することで、Projectは「あ、この日は稼働しなくていいんだな」と瞬時に計算し直します。
—
3. 陥りやすい罠と対策(ここを読めばプロレベル)
罠①:日付の型が合わない
Excelのセル値は`Variant`型ですが、Projectの`Start/Finish`プロパティは厳密な`Date`型を要求します。`CDate()`関数を使って明示的に変換する癖をつけましょう。
罠②:重複登録エラー
同じ日付を二度登録しようとすると、VBAは容赦なくエラーを吐いて停止します。
- 対策: 登録前に既存の例外をチェックするか、一度すべての例外をクリアしてから再構築する「クリーン・ビルド方式」を採用するのが最も安全です。
罠③:プロジェクトの「標準」以外のカレンダー
会社によっては「開発部カレンダー」「営業部カレンダー」のように複数存在することがあります。`BaseCalendars(名前)`で指定する際、名前が一つでも違うとエラーになるため、事前にProject側で名前を統一しておく運用が必須です。
—
最後に:自動化は「正確な基盤」から始まる
カレンダー設定の自動化は、ただの事務作業の効率化ではありません。「プロジェクトの工数計算の論理的根拠をプログラムで保証する」という、極めてエンジニアリング的な行為です。
ここをクリアしたあなたは、もうタスクの進捗管理やリソースの割り当てといった、より高度な自動化領域へ進む準備ができています。
もしエラーが出たり、うまくいかないことがあっても焦らないでください。それは、あなたのプログラムが「現実に適合しようと戦っている証」です。何かあれば、いつでもこのコードを読み返してください。あなたのプロジェクトが、正確な時間の上でスムーズに動くことを願っています。
さあ、次はどのオブジェクトを支配しに行きましょうか?
