こんにちは。Project VBAの世界へようこそ。
「マクロの記録」で生成される、あの冗長で不安定なコードに別れを告げる時が来ましたね。今日は、Project管理における心臓部とも言える「WBS(Work Breakdown Structure)の自動構築」について、プロの視点から核心を伝授します。
なぜ多くの人がここで挫折するのか。それは「プロジェクトの階層構造」を単なるデータの羅列として見ているからです。Projectのタスクは、親子関係を持つ「ツリー構造」であるという本質を理解すれば、コードは劇的に美しくなります。
—
1. なぜ「再帰処理(Recursion)」なのか?
WBSを構築する際、多くの方がやりがちなのが「上から順番にインデントを適用する」という単純ループです。しかし、プロジェクトが複雑化し、サブタスクの中にさらにサブタスクが潜り込むようになると、この手法は崩壊します。
ここで登場するのが再帰関数です。「自分自身を呼び出す」という、一見すると魔術のようなこの手法を使うことで、どんなに深い階層構造であっても、わずか数行のコードで「親を特定し、子供を紐付ける」ことが可能になります。
—
2. 実践:インデントレベルを判定して階層化するコード
今回は、Excelなどのリストからプロジェクトデータを取り込み、Project上で自動的にインデントを適用する基本的なアルゴリズムを解説します。
‘ Project VBAの標準モジュールに記述してください
Sub BuildWBS()
Dim proj As Project
Set proj = ActiveProject
‘ タスクを処理するためのメインループ
Dim t As Task
For Each t In proj.Tasks
If Not t Is Nothing Then
‘ タスク名の先頭にあるスペースの数を数えてレベルを判定
‘ ※実際には「階層レベル」を示す列があるとより堅牢です
Dim indentLevel As Integer
indentLevel = CountLeadingSpaces(t.Name)
‘ インデントを適用(OutlineIndentメソッド)
‘ これにより、WBSの親子関係が自動計算されます
t.OutlineLevel = indentLevel + 1
End If
Next t
End Sub
‘ 文字列の先頭にあるスペースをカウントするヘルパー関数
Private Function CountLeadingSpaces(taskName As String) As Integer
Dim i As Integer
For i = 1 To Len(taskName)
If Mid(taskName, i, 1) <> ” ” Then
CountLeadingSpaces = i – 1
Exit Function
End If
Next i
CountLeadingSpaces = 0
End Function
コードの解説:ここが「プロの境界線」
- OutlineLevel プロパティ: Project VBAにおいて、インデントを手動で調整するのではなく、`OutlineLevel`を直接指定するのが鉄則です。これがProject内部のエンジンを正しく駆動させ、サマリータスクの期間計算などを自動化させます。
- Nothing判定: `For Each t In proj.Tasks` を回す際、削除済みのタスクがメモリに残っていることがあります。`If Not t Is Nothing` というガード節を書くことは、プロフェッショナルの嗜みです。
—
3. 初心者が陥る「罠」と回避策
罠1:サマリータスクの期間が「0日」になる
インデントを適当に操作すると、親タスクの期間が正しく計算されません。Project VBAでは、「先にタスクを生成してから、下位から順にインデントを適用する」のが安全です。順序を間違えると、計算エンジンが予期せぬ挙動を起こします。
罠2:処理速度の低下
数千行のタスクを操作する場合、`Application.ScreenUpdating = False` を忘れてはいけません。これを記述するだけで、処理速度は数倍に跳ね上がります。
—
4. さあ、次のステージへ
このコードは、いわば「WBS構築の最小単位」です。現場では、ここから「特定のインデントレベルを超えたら警告を出す」「依存関係(Link)を自動的に付与する」といったロジックを積み上げていきます。
Project VBAを掌握するということは、「プロジェクトという生き物を、コードで制御する」ということです。まずはこの再帰的な考え方を手元で動かしてみてください。インデントがカチッと決まり、WBSが美しく折り畳まれた瞬間、あなたはマクロ記録のユーザーから「システムアーキテクト」へと一歩進化しています。
何か不明な点があれば、いつでも聞いてください。あなたのコードが、現場の生産性を劇的に変えることを確信しています。頑張りましょう!
