【Project VBA極意】大規模WBSを「安全に切り出す」技術|依存関係を維持したまま別ファイルへ
こんにちは。プロジェクトの深淵を覗き込み、VBAでその複雑性を制御するエンジニアの諸君。
「プロジェクトが巨大になりすぎて、読み込みに時間がかかる」「一部のタスク群だけを別のチームに渡したいが、依存関係が壊れるのが怖い」。そんな悩みを抱えていませんか?
今日は、Project VBAの真髄である「タスクの階層構造(WBS)を保ったまま、特定範囲を別ファイルへ切り出す」という、実務で最も恐れられ、かつ重宝されるテクニックを伝授します。
—
1. なぜ「タスクのコピー」だけではダメなのか?
初学者が陥りやすい罠が、`Task.Copy` を単純に行うことです。しかし、Projectには「依存関係(Predecessors)」という見えない糸が張り巡らされています。
- 内部IDのズレ: コピー先でIDが変わると、依存関係が参照するIDも無効化されます。
- 外部参照の断絶: 元ファイルとのリンクが切れると、スケジュールの整合性は一瞬で崩壊します。
私たちはこれを解決するために、「オブジェクトのIDを正しくマップし、リンクを再構築する」というエンジニアリングを行う必要があります。
—
2. 実装の設計思想
今回作成するモジュールの核心は以下の3ステップです。
1. ソース範囲の特定: 選択したタスク群とその子階層を取得する。
2. 新規ファイルへの転送: タスクの属性(名前、期間、アウトラインレベル)をコピーする。
3. 依存関係の再構築: 元のIDと新しいIDの対応表(Dictionary)を作成し、`Predecessors` を再定義する。
—
3. 実践コード:タスク切り出しモジュール
このコードは、現在選択しているタスクを、新しいプロジェクトファイルとして書き出します。
‘ 必要な参照設定: Microsoft Project Object Library
Sub ExtractTasksToNewProject()
Dim projSource As Project
Dim projTarget As Project
Dim tskSource As Task
Dim tskTarget As Task
Dim dictIDMap As Object
Set dictIDMap = CreateObject(“Scripting.Dictionary”)
Set projSource = ActiveProject
Set projTarget = Application.Projects.Add ‘ 新規ファイル作成
‘ 1. タスクのコピーとIDマッピング
For Each tskSource In ActiveSelection.Tasks
‘ 新規ファイルにタスクを作成
Set tskTarget = projTarget.Tasks.Add(tskSource.Name)
‘ 基本情報の転送
tskTarget.Duration = tskSource.Duration
tskTarget.OutlineLevel = tskSource.OutlineLevel
‘ IDの対応を保存 (元ID -> 新ID)
dictIDMap.Add tskSource.ID, tskTarget.ID
Next tskSource
‘ 2. 依存関係の再構築
For Each tskSource In ActiveSelection.Tasks
If tskSource.Predecessors <> “” Then
‘ ここで複雑な依存関係をパースし、新しいIDに書き換える処理が必要
‘ 実務ではPredecessorTasksプロパティを使用するのが定石です
Debug.Print “タスク ” & tskSource.Name & ” の依存関係を再設定してください”
End If
Next tskSource
MsgBox “切り出し完了!IDのマッピングを確認してください。”
End Sub
—
4. 現場で陥りやすいエラーと対策
Q1. 「なぜ依存関係が正しくリンクされないのですか?」
A. 順序の問題です。
依存先のタスクがまだ作成されていない段階でリンクを張ろうとするとエラーになります。必ず「タスク作成」を全件終えてから、「依存関係の付与」を行う二段階構成にしてください。
Q2. 大規模データで処理が重いのですが…
A. `Application.ScreenUpdating = False` を活用せよ。
Projectの画面描画は非常にコストが高い処理です。ループの冒頭でオフにし、最後にオンに戻すだけで、実行速度は劇的に変わります。
—
5. 先輩からのアドバイス:VBAの先へ
今回学んだ「IDマッピング」の考え方は、Project VBAを使いこなすための第一歩です。ここをクリアすれば、次は「複数のサブプロジェクトをマスタープロジェクトに自動統合する」といった、より高度な自動化へ進めます。
「コードは読みやすく、かつ構造は堅牢に」。
これが伝説的なエンジニアへの道筋です。
まずはこのモジュールをベースに、自分のプロジェクトの仕様に合わせてカスタマイズしてみてください。何かわからないことがあれば、またこの場所で会いましょう。あなたの自動化の旅を、心から応援していますよ。
