Project VBAの深淵へ:タスクの階層構造を自在に操る「極限のメソッド」
こんにちは。プロジェクト管理の自動化という、深淵でありながら極めて生産性の高い領域へようこそ。
「マクロの記録」ボタンを押して生成されたコードを眺め、「なぜか動かない」「なぜか重い」と頭を抱えたことはありませんか? Project VBAは、Excel VBAとは一線を画す「階層構造(WBS)」という概念を持つ、特殊なオブジェクトモデルです。
今回は、タスクの階層を自在に昇格・降格させるための、現場で最も信頼される実装パターンを伝授します。ここをクリアすれば、あなたはもう脱・初級者です。
—
1. なぜ「OutlineIndent」と「OutlineOutdent」なのか
Projectにおけるタスクの移動は、単なるプロパティの書き換えではありません。親タスクとの親子関係を再構築する「構造変更」です。
- OutlineIndent(降格): 選択したタスクを1つ下の階層へ。
- OutlineOutdent(昇格): 選択したタスクを1つ上の階層へ。
これらを扱う際、最も重要なのは「今、どのタスクが選択されているか」というカレントコンテキストの制御です。
—
2. 安全に階層を操作するための「鉄則コード」
多くの初心者が陥る罠は、ループ処理中に階層を変更し、イテレータ(ループの制御変数)を見失うことです。以下のコードは、エラーハンドリングを内包した、実戦でそのまま使えるテンプレートです。
‘ タスクを安全に降格(インデント)させる汎用メソッド
Sub IndentTaskSafe(targetTask As Task)
‘ エラーハンドリング:タスクが空でないか、親になれる状態かを確認
On Error Resume Next
‘ タスクを選択状態にしてからIndentを実行
‘ ※Projectオブジェクトは「選択」を介さないと操作が不安定になる性質がある
targetTask.Select
‘ 階層を1つ下げる(降格)
ActiveSelection.Tasks(1).OutlineIndent
If Err.Number <> 0 Then
Debug.Print “階層変更失敗: ” & targetTask.Name & ” (エラー: ” & Err.Description & “)”
End If
On Error GoTo 0
End Sub
‘ タスクを安全に昇格(アウトデント)させる汎用メソッド
Sub OutdentTaskSafe(targetTask As Task)
On Error Resume Next
targetTask.Select
‘ 階層を1つ上げる(昇格)
ActiveSelection.Tasks(1).OutlineOutdent
If Err.Number <> 0 Then
Debug.Print “階層変更失敗: ” & targetTask.Name & ” (エラー: ” & Err.Description & “)”
End If
On Error GoTo 0
End Sub
—
3. 実践:WBSを自動構築する現場のロジック
では、このメソッドをどう活用するか。例えば「特定のフラグが立っているタスクをすべてサブタスク化する」といった自動化ロジックは以下のようになります。
Sub BuildWBSStructure()
Dim t As Task
‘ 画面描画を停止して高速化(重要:Project VBAは描画更新が重い)
Application.ScreenUpdating = False
For Each t In ActiveProject.Tasks
‘ もしタスク名が”SUB_”で始まっていたら、自動的に降格させる
If Left(t.Name, 4) = “SUB_” Then
Call IndentTaskSafe(t)
End If
Next t
Application.ScreenUpdating = True
MsgBox “階層構造の再構築が完了しました。”
End Sub
—
4. 陥りやすいエラーと「伝説の知見」
① 「選択」の罠
Project VBAは、Excelと異なり`ActiveSelection`(現在選択されている範囲)というオブジェクトが非常に強力です。コード内で`Select`メソッドを多用することに抵抗を感じるかもしれませんが、Projectにおいては「操作対象を明示的に選択状態にしてからメソッドを叩く」のが、最もバグを生みにくい「安全な実装」です。
② パフォーマンスの重さ
`ScreenUpdating = False` は必須です。これがないと、タスクが100個あるだけでマクロの実行時間は数倍に膨れ上がります。
③ 親タスクの扱い
タスクを降格させると、その上のタスクは自動的に「サマリータスク」に変化します。サマリータスクになった瞬間に、開始日や終了日は手動編集できなくなります(子タスクの集計値になるため)。この仕様を忘れると、「なぜ日付が変わらないんだ!」というデバッグ地獄に陥ります。注意してくださいね。
—
最後に:自動化の先にあるもの
階層構造をプログラムで制御できるようになると、あなたはただの作業者ではなく、「プロジェクトの骨組みを定義するアーキテクト」になります。
今回紹介したコードは、あくまで「型」です。ここから、条件分岐を複雑にしたり、外部のExcelファイルからWBS構成を読み込んで自動で階層化したりと、応用範囲は無限大です。
分からないことがあれば、またいつでも聞きに来てください。あなたの自動化の旅を、全力でサポートしますよ。頑張りましょう!
