【実務・中級編】大規模WBSの分割:VBAで特定の階層を別ファイルに切り出し、依存関係を維持する – Project VBA解析バイブル

スポンサーリンク

巨大WBSの呪縛を解く:Project VBAによる「階層別ファイル分割」と依存関係の完全同期

大規模プロジェクトにおけるMicrosoft Projectの運用で、最もエンジニアを疲弊させるのは「単一ファイルへの過度な依存」だ。数百タスクを超えた瞬間、GUI操作は重くなり、保存のたびにヒヤヒヤする。そして、誰かが誤ってリンクを破壊すれば、プロジェクト全体が崩壊する。

今回は、Project VBAを駆使して「巨大WBSを階層ごとに別ファイルへ切り出し、マスターファイルとの依存関係(リンク)を維持したまま運用する」という、極めて実戦的なアーキテクチャを伝授する。

1. なぜ「分割」が必要なのか:アーキテクチャの視点

巨大なWBSを1ファイルで管理するのは、データベースの正規化を怠ったテーブルで巨大なクエリを叩くのと同義だ。

  • パフォーマンスの限界: オブジェクトのプロパティ参照が指数関数的に遅くなる。
  • デプロイの困難さ: 担当者ごとにファイルを分けたいのに、マスターファイルがロックされていると何もできない。

「ファイル分割」は単なる整理整頓ではなく、プロジェクト管理における「疎結合化」である。

2. 堅牢な設計指針:依存関係をどう維持するか

別ファイルに切り出した際、最も恐ろしいのは「外部依存リンク」の破損だ。これを回避する鉄則は以下の3点である。

1. Unique IDの永続化: タスクの行番号(ID)は移動で変わる。必ず`UniqueID`をキーとしてリンクを張る。
2. マスターのハブ構造: 子ファイル同士で直接リンクを張るな。必ず「マスターファイル」をハブとし、マスターが各サブプロジェクトの進捗を吸収するスター型構成にする。
3. パスの相対参照: フルパスで書くと移動した瞬間にリンクが切れる。UNCパスか、プロジェクトファイルと同一階層からの相対パスを常に保証する設計にせよ。

3. 実践コード:階層切り出しとリンク設定モジュール

以下は、選択したタスクを別ファイルとして書き出し、マスター側から外部プロジェクトとして取り込むための基幹ロジックだ。

‘ ———————————————————
‘ 機能: 特定階層を別ファイルとして書き出し、マスターとリンクする
‘ ———————————————————
Sub ExportAndLinkSubProject(targetTask As Task, savePath As String)
Dim masterProj As Project
Dim subProj As Project
Dim newSubTask As Task

Set masterProj = ActiveProject

‘ 1. 新規プロジェクトを作成し、タスクをコピー
Set subProj = Application.Projects.Add(False)
targetTask.Copy
subProj.Paste

‘ 2. 保存処理(エラーハンドリング必須)
On Error Resume Next
subProj.SaveAs savePath
If Err.Number <> 0 Then
MsgBox “保存に失敗しました: ” & Err.Description
Exit Sub
End If
subProj.Close
On Error GoTo 0

‘ 3. マスター側で元のタスクを削除し、サブプロジェクトとして挿入
‘ これにより、依存関係が外部ファイル参照(Subproject)に置き換わる
Dim outlineLevel As Integer
outlineLevel = targetTask.OutlineLevel

targetTask.Delete

‘ 外部プロジェクトとして挿入することで依存関係を維持
Set newSubTask = masterProj.Tasks.Add(Before:=targetTask.ID)
newSubTask.SubProject = savePath

MsgBox “切り出し完了: ” & newSubTask.Name
End Sub

4. 運用上の注意点:避けるべき「アンチパターン」

  • 「とりあえず全自動化」を避ける:

すべてのサブプロジェクトを一括で更新しようとすると、I/O待ちでVBAがフリーズする。サブプロジェクトの更新は「手動トリガー」を基本にし、ステータス同期のみを自動化するのがプロの作法だ。

  • パスのハードコーディング:

`”C:\Users\Name\Desktop\…”` のようなパスを書いた瞬間、そのコードは死んでいる。`ActiveProject.Path` を活用し、必ず同一フォルダ構成で動くポータブルな設計にすること。

  • 外部参照の更新忘れ:

Projectは外部ファイルが更新された際、必ずしも即座に反映しない。`Application.CalculateAll` を明示的に呼び出し、依存関係の再計算を強制するルーチンを組み込んでおくこと。

最後に:自動化の真髄は「制御」にある

VBAによる自動化は、単なる作業の代行ではない。「プロジェクトという巨大な有機体を、いかにして制御可能な単位に分割し、再構成するか」という高度な設計行為だ。

今回紹介した手法をベースに、各サブプロジェクトが独立して動きつつ、マスターが全体像を俯瞰する「疎結合システム」を構築してほしい。それができれば、どんな巨大なWBSも、あなたの管理下で美しく動くはずだ。

次は、この分割された各ファイルを「SharePoint APIと連携させて自動同期する」フェーズについて話そう。VBAエンジニアとしての真価が問われる領域だ。準備はいいか?

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