Project VBAを掌握せよ:タスク階層を維持した「完コピ」エンジニアリングの極意
プロジェクト管理の自動化において、最も忌むべきは「力技のコピー&ペースト」だ。
特にMicrosoft Project(MSP)のタスク階層(WBS)をコードで操作しようとすると、多くのエンジニアが「インデントの崩壊」や「依存関係の消失」という泥沼にはまる。
今日は、場当たり的なスクリプトではなく、オブジェクトのライフサイクルを制御し、階層構造を論理的に再構築する「生産レベル」の設計思想を授ける。
—
1. なぜ「単純なコピペ」は破綻するのか
MSPのタスク構造は、単なる行の集合体ではない。`OutlineLevel`というプロパティが示すのは、ツリー状の論理データだ。
多くの初心者は、UI上のコピー操作をマクロでエミュレートしようとするが、これはNGだ。`Selection.Copy` や `Paste` は、クリップボードという不安定な共有メモリに依存しており、実行速度も遅く、何よりエラーハンドリングが困難を極める。
真のアーキテクトが目指すべきは、オブジェクトモデルへの直接介入である。
—
2. 堅牢な設計へのアプローチ:階層の再帰的再現
タスクを別のプロジェクトへインポートする際、守るべき鉄則は以下の3点だ。
1. インデントの正規化: 貼り付け先の親タスクの `OutlineLevel` を起点に、相対的なレベルを再計算する。
2. 依存関係の排除と再構築: `Predecessors`(先行タスク)はID参照だ。コピー先でIDが変わるため、コピー直後の依存関係は必ず「切断」され、マッピング後に再設定せよ。
3. トランザクション管理: `Application.ScreenUpdating` を制御し、画面描画を抑制して処理速度を極限まで引き上げる。
—
3. 実装:階層維持インポートの核心コード
以下は、あるプロジェクトのタスク群を、別のプロジェクトの特定親タスク配下にインポートする際の実装例だ。このコードは「動く」だけでなく「壊れない」ことを重視している。
‘ プロジェクトタスク移行モジュール
Public Sub ImportTasksWithHierarchy(sourceProject As Project, targetProject As Project, targetParentTask As Task)
Dim t As Task
Dim newTask As Task
Dim offsetLevel As Integer
‘ 画面描画を停止し、パフォーマンスを最大化
Application.ScreenUpdating = False
‘ インデントレベルのオフセットを計算
‘ (貼り付け先のレベル + 1) を基準に調整する
offsetLevel = targetParentTask.OutlineLevel + 1 – sourceProject.Tasks(1).OutlineLevel
On Error GoTo ErrorHandler
For Each t In sourceProject.Tasks
If Not t Is Nothing Then
‘ 新規タスクの作成
Set newTask = targetProject.Tasks.Add(t.Name, targetParentTask.ID + 1)
‘ 基本属性のコピー
newTask.Duration = t.Duration
newTask.Start = t.Start
‘ 階層の再構築
‘ MSPのOutlineLevelはRead-Onlyに近いが、Indent/Outdentメソッドで制御可能
‘ 階層が深い場合はここを再帰的に調整するロジックが必要
Do While newTask.OutlineLevel < (t.OutlineLevel + offsetLevel)
newTask.Indent
Loop
Do While newTask.OutlineLevel > (t.OutlineLevel + offsetLevel)
newTask.Outdent
Loop
End If
Next t
CleanUp:
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “移行プロセスでエラーが発生しました: ” & Err.Description
Resume CleanUp
End Sub
—
4. プロダクション環境での重要注意点
ファイル間連携の罠
MSPのプロジェクト間でオブジェクトを扱う際、`Task`オブジェクトがどの`Project`に属しているかを常に意識せよ。`targetProject.Tasks.Add` のように、必ず対象を明示的に修飾すること。暗黙の`ActiveProject`に頼るコードは、マルチプロジェクト環境では必ずバグの温床となる。
データベース連携の注意点
もし移行元データがExcelやSQL Serverにある場合、直接MSPに流し込む前に「中間オブジェクト」を生成せよ。`Collection`や`Dictionary`クラスを用いて、依存関係のIDマッピングリスト(旧ID:新ID)をメモリ上で管理し、全てのタスク生成後に`Predecessors`を一括更新する設計が最も堅牢だ。
—
5. 最後に:エンジニアとしての矜持
自動化の目的は「楽をすること」ではない。「ミスをゼロにすること」だ。
今回紹介した階層の再計算ロジックは、どんなに複雑なWBSであっても、論理的な階層さえ定義されていれば確実に再現する。
もし君が大規模プロジェクトの管理ツールを作っているなら、まずはこの「階層再構築」のロジックをマスターしてほしい。それができれば、MSPの自動化領域において君に敵う者はいない。
さあ、コードを開け。非効率なコピペ作業を過去の遺物に変える時が来た。
