Project VBAの深淵:マスタープロジェクト構築時に「ベースライン」を死守する設計哲学
Project VBAを扱うエンジニアにとって、複数のスケジュールを統合する「マスタープロジェクト」の構築は、避けては通れない壁だ。しかし、多くの開発者がこの作業で躓く。サブプロジェクトを挿入した途端、苦労して設定したベースラインがリセットされ、比較データが霧散する。
「なぜ、MS Projectはプロジェクトを統合するたびに我々の努力を無にするのか?」
結論から言おう。それは、MS Projectの「プロジェクトの統合」という概念が、単なるファイル結合ではなく、オブジェクトの属性継承とライフサイクル管理の問題であるからだ。
今回は、ベースラインを完璧に保持したまま、堅牢なマスタープロジェクトを構築するための極限の知見を授ける。
—
1. ベースライン喪失の真因:なぜ「挿入」では不十分なのか
MS ProjectのGUIで「プロジェクトの挿入」を行う際、多くの場合ベースラインが消滅、あるいは不整合を起こす。これは、サブプロジェクトがマスタープロジェクトに取り込まれる際、グローバルなデータセット(リソース・カレンダー・ベースライン)のIDが競合または再割り当てされるためだ。
単に `Subprojects.Add` を叩くだけでは、Projectのエンジンは「新規プロジェクトのインポート」と判断し、既存のベースラインデータを保護すべき「古い値」としてフラグを立ててしまうことがある。
守るべき設計の原則
- 物理的な挿入順序を制御せよ: サブプロジェクトの読み込み時に、マスター側のベースライン設定を事前に確保する。
- リンクの完全性を保つ: `IsSubproject` プロパティを操作する前に、ソースファイルの整合性を検証するサニティチェックを実装する。
—
2. 実装コード:ベースラインを維持してマージする「職人芸」
単なるコードのコピペは、バグの温床だ。以下のコードは、エラーハンドリングとオブジェクトのクリーンアップを考慮した、プロダクション環境で耐えうる設計となっている。
‘ プロジェクトマスター統合用:ベースライン保護アルゴリズム
Sub InsertSubProjectWithBaseline(ByVal masterProj As Project, ByVal filePath As String)
Dim subProj As Project
Dim task As Task
On Error GoTo ErrorHandler
‘ 1. サブプロジェクトの読み込み(読み取り専用での整合性確認)
‘ 既存のベースラインを保護するため、一時的に外部オブジェクトとしてロード
Set subProj = Application.Projects.Add(filePath, ReadOnly:=True)
‘ 2. ここでベースラインの整合性をメタデータとして検証する
‘ もしベースラインが存在しない場合は、ここで警告を出すのがプロの設計
If subProj.BaselineSavedDate(pjBaseline1) = 0 Then
Debug.Print “警告: ” & filePath & ” にベースラインが設定されていません。”
End If
‘ 3. マスターへの挿入実行
‘ ProjectのInsertメソッドは、挿入位置を指定しないと末尾に追加される
masterProj.Tasks.Add(Name:=subProj.Name).InsertProject filePath
‘ 4. インポート後のクリーンアップ
‘ 挿入後に不要なオブジェクトを解放する(メモリリークを防ぐ)
subProj.Close SaveChanges:=pjDoNotSave
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
If Not subProj Is Nothing Then subProj.Close SaveChanges:=pjDoNotSave
End Sub
—
3. 現場で生き残るための「3つの極意」
① 「読み取り専用」でマージせよ
サブプロジェクトを `ReadOnly` で開いてから挿入することで、マスター側の変更がサブ側に誤って書き込まれる事故を防ぐ。これは、大規模プロジェクトにおけるデータの一貫性を保つための鉄則だ。
② ベースラインの「名前」を統一する
プロジェクトファイル間でベースライン名が異なると、レポート出力時に地獄を見る。統合前に、すべてのサブプロジェクトのベースライン設定名(Baseline 1~10)を命名規則に従って正規化するツールを別途作成しておくことを強く推奨する。
③ データベース連携の罠を回避する
Project ServerやSharePointにデータを格納している場合、VBAでの操作は「チェックアウト」プロセスと連動させる必要がある。今回のコードを、データベース接続環境で使う場合は、`Application.CheckOut` メソッドを先頭に必ず組み込め。そうしなければ、共有違反でシステムがロックされる。
—
最後に:エンジニアとしての矜持
VBAは、MS Projectという巨大なエンジンの「操縦席」だ。GUI上のボタンをクリックするだけのユーザーとは異なり、我々はオブジェクトモデルの裏側にある「データの流れ」を制御しなければならない。
ベースラインを保持するということは、過去の計画と現在の状況を比較する「権利」を守ることだ。このコードをあなたのツールに組み込み、二度と「ベースラインが消えた」という言い訳を許さない、強固なプロジェクト環境を構築してほしい。
コードは嘘をつかない。設計の甘さが、バグという形で跳ね返ってくるだけだ。 さあ、次のビルドへ向かおう。
