こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、自分の手でプロジェクトを意のままにコントロールしたいあなたへ。
今回は、Project VBAにおける「タスクの階層構造(WBS)の操作」、特にインデントを使ったタスクの昇格・降格の基本について解説します。
ここをクリアすれば、バラバラだったタスクの群れに「構造」という命を吹き込み、WBSを自動構築するVBAの基本がバッチリ身につきますよ。さあ、一緒に扉を開けましょう!
—
1. なぜ「インデント(階層)」の操作が重要なのか?
Microsoft Projectの本質は、単なる「TODOリスト」ではなく、タスク同士の親子関係(WBS)とスケジュールを管理するエンジンにあります。
- 親タスク(サマリータスク):プロジェクトの大まかな工程(例:「1. 設計フェーズ」)
- 子タスク:その工程を構成する具体的な作業(例:「1.1 要件定義」「1.2 基本設計」)
これを手動でぽちぽちとインデントボタンを押して整理していくのは、タスクが100個、1000個と増えた瞬間に破綻します。だからこそ、VBAでプログラムに「ここは子にしなさい」「ここは親に戻しなさい」と指示を出せる必要があるのです。
—
2. 魔法のプロパティ「OutlineLevel」の正体
Project VBAでタスクの階層を操作するためによく使われるのが `OutlineLevel`(アウトラインレベル) プロパティです。
言葉の通り、タスクが「何階層目の深さにいるか」を数値で表したものです。
- `OutlineLevel = 1` :一番上の親(トップレベル)
- `OutlineLevel = 2` :その子供
- `OutlineLevel = 3` :孫
このプロパティに直接数字を代入したり、現在のレベルを読み取ったりすることで、プログラムから自由にWBSの構造をコントロールできるようになります。
—
3. 【実践】タスクを昇格・降格させる基本コード
百聞は一見に如かず。実際に動かせるコードを見てみましょう。
以下のコードは、指定したタスクの階層を下げたり(インデント)、上げたり(アウトdent)する基本のサンプルです。
Sub ControlTaskHierarchy_Basic()
Dim tsk As Task
‘ エラーハンドリングの基本:プロジェクトにタスクが1つ以上あるか確認
If ActiveProject.Tasks.Count = 0 Then
MsgBox “タスクが登録されていません。”, vbExclamation
Exit Sub
End If
‘ ID 2のタスクを対象にする例
Set tsk = ActiveProject.Tasks(2)
If Not tsk Is Nothing Then
‘ ————————————————–
‘ 1. タスクを降格させる(子タスクにする)
‘ ————————————————–
‘ OutlineLevelを今の値より1つ増やすことで、下の階層に潜らせます
‘ ※UI上の「インデント」ボタンと同じ効果です
tsk.OutlineLevel = tsk.OutlineLevel + 1
MsgBox “タスク「” & tsk.Name & “」を子タスクに降格しました。現在のレベル: ” & tsk.OutlineLevel, vbInformation
‘ ————————————————–
‘ 2. タスクを昇格させる(親の階層に戻す)
‘ ————————————————–
‘ 少し待つためにあえて分けています。実際にはどちらかを使います
‘ OutlineLevelを1つ減らすことで、上の階層に戻します
‘ ※UI上の「アウトdent」ボタンと同じ効果です
‘ tsk.OutlineLevel = tsk.OutlineLevel – 1
‘ MsgBox “タスク「” & tsk.Name & “」を親の階層に昇格しました。”, vbInformation
End If
‘ メモリの解放
Set tsk = Nothing
End Sub
コードのポイント解説
1. `ActiveProject.Tasks(2)`:Projectのタスクには上から順にIDが振られています。ここではID:2のタスクをターゲットにしています。
2. `tsk.OutlineLevel = tsk.OutlineLevel + 1`:「現在のレベルに +1 する」という書き方は、VBAプログラミングの鉄則です。これで1段階、右へ引っ込みます(子タスク化)。
—
4. 初学者が必ずハマる「落とし穴」と回避策
Project VBAを始めたばかりのエンジニアが、ほぼ100%直面するトラップがいくつかあります。ここを知っておくだけで、開発スピードが何倍も変わりますよ。
トラップその1:存在しないIDを指定してエラーになる
「`Tasks(5)` と指定したのに、タスクが4つしかなくて実行時エラー(1105: このような項目は見つかりません)になった!」
- 回避策:コードを実行する前に必ず `ActiveProject.Tasks.Count` でタスクが存在するか、指定した番号を超えていないかチェックしましょう。
トラップその2:OutlineLevelを無理やり飛ばして設定する
親(レベル1)のすぐ下に、いきなり孫(レベル3)を作ろうとすると、Microsoft Projectの仕様上、データ構造がバグを起こしたり、意図しない自動修正が働いたりします。
- 回避策:階層構造は必ず 「1つずつ順番に(1 → 2 → 3)」 掘り下げていくのが安全です。
—
5. さらに実践的なテクニック:ループで一括階層化
実際の業務では、Excelから読み込んだデータや、特定のキーワードを持つタスク群を一網打尽に階層化したいはずです。
最後に、名前に「【子】」とついているタスクを自動でインデント(子タスク化)する実用的なコードを紹介します。
Sub AutoIndentTasks()
Dim tsk As Task
‘ プロジェクト内のすべてのタスクを上から順に総チェック
For Each tsk In ActiveProject.Tasks
‘ タスクが空白(削除済みなど)でないことを確認
If Not tsk Is Nothing Then
‘ タスク名に「【子】」という文字が含まれていたら
If InStr(tsk.Name, “【子】”) > 0 Then
‘ レベルを1つ下げて子タスクにする
‘ (※無限に下がらないよう、現在のレベルが3未満の場合のみなど条件をつけるとさらに安全です)
tsk.OutlineLevel = tsk.OutlineLevel + 1
End If
End If
Next tsk
MsgBox “条件に合致するタスクの階層化が完了しました!”, vbInformation
End Sub
—
まとめ
今回は、Project VBAにおけるWBS操作の第一歩として、`OutlineLevel` プロパティを使ったタスクの昇格・降格の基本を解説しました。
- `OutlineLevel` を使えば、タスクの深さ(親子関係)を自由自在に操れる。
- 「現在値 + 1」で子タスクへ降格、「現在値 - 1」で親へ昇格。
- ループ文(`For Each`)と組み合わせることで、大量のタスクも一瞬で構造化できる。
ここをマスターすれば、次は「タスク間の依存関係(先行・後続タスクのリンク)」へと進むことができます。WBSの自動生成という強力な武器を手に入れたあなたなら、もうマクロの記録に頼る必要はありません。
ぜひ自分の環境でコードを動かして、その手応えを実感してみてくださいね。次回のステップアップもお楽しみに!
