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

スポンサーリンク

プロジェクトの「時間」を支配せよ: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側で名前を統一しておく運用が必須です。

最後に:自動化は「正確な基盤」から始まる

カレンダー設定の自動化は、ただの事務作業の効率化ではありません。「プロジェクトの工数計算の論理的根拠をプログラムで保証する」という、極めてエンジニアリング的な行為です。

ここをクリアしたあなたは、もうタスクの進捗管理やリソースの割り当てといった、より高度な自動化領域へ進む準備ができています。

もしエラーが出たり、うまくいかないことがあっても焦らないでください。それは、あなたのプログラムが「現実に適合しようと戦っている証」です。何かあれば、いつでもこのコードを読み返してください。あなたのプロジェクトが、正確な時間の上でスムーズに動くことを願っています。

さあ、次はどのオブジェクトを支配しに行きましょうか?

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