こんにちは!マクロの記録ボタンを押すだけの毎日に少し物足りなさを感じ始めていませんか?「もっとスマートに、プログラミングらしく実務を自動化したい!」そう思った瞬間こそ、あなたがVBAエンジニアとして一皮むける最高のタイミングです。
今回は、ExcelではなくMicrosoft Project(MS Project)を舞台にした、少しディープで最高に実用的な世界へご案内します。
テーマは「タスクの『名前』から自動的に階層(WBS)を判定し、インデントを適用するパーサー」です。
現場でよくある「Excelで作られたタスクリストをProjectにコピペしたけど、アウトラインレベルがバラバラで泣きそう…」という絶望を、たった数行の洗練されたVBAコードで華麗に解決してみせましょう。
ここをクリアすれば、Project VBAの基本と、オブジェクトを操る本当の楽しさがバッチリ掴めますよ。それでは、優しく知的にお供しますので、ゆっくりついてきてくださいね。
—
なぜ、MS Projectの「インデント」は自動化が必要なのか?
MS Projectの本質は、タスクの「親子関係(WBS:Work Breakdown Structure)」にあります。親タスクが動けば子タスクも連動する、この美しいツリー構造こそがProjectの命です。
しかし、実務ではどうでしょう。Excelで整理した以下のようなリストをプロジェクトに持ってくること、よくありますよね。
- 1. 準備フェーズ
- 1.1 要件定義
- 1.1.1 ヒアリング実施
- 1.1.2 議事録作成
これを手動で一つずつ選択して「インデントを上げる/下げる」ボタンをポチポチ押す……。タスクが50個ならまだしも、500個あったら発狂してしまいますよね。
ならば、タスク名の「ドット(.)の数」や「番号のパターン」を読み取り、VBAに自動で階層構造を作らせればいいのです。
—
攻略の鍵:OutlineLevelプロパティの正体
Project VBAにおいて、タスクの階層を操る主役は `OutlineLevel` プロパティです。
非常にシンプルなプロパティに見えますが、ここにはProject特有の「お作法」があります。それは、「親から順に(上の階層から)正しく構築していかないと、意図しないガタガタのツリーになる」というライフサイクルの厳格さです。
今回のパーサー(解析プログラム)のアルゴリズムはこうです。
1. プロジェクト内の全タスクを上から順にスキャンする。
2. タスク名(Name)を正規表現や文字列解析にかけ、ドットの数から「何階層目(OutlineLevel)であるべきか」を算出する。
3. 算出したレベルを `OutlineLevel` に代入し、インデントを適用する。
言葉にするとシンプルですが、これを実装すると実務でどえらい威力を発揮します。
—
実装コード:WBS自動インデント・パーサー
それでは、開発環境(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。コピペですぐに実戦投入できます。
Sub AutoIndentTasksByWBS()
‘ =====================================================================
‘ 処理概要: タスク名に含まれるドット(.)の数をカウントし、
‘ 自動的にアウトラインの階層(インデント)を設定するパーサー
‘ 著者: チーフアーキテクト
‘ =====================================================================
Dim tsk As Task
Dim wbsName As String
Dim dotCount As Integer
Dim i As Long
‘ エラーハンドリングの基本:画面描画を停止してパフォーマンスを爆上げする
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ アクティブなプロジェクトにタスクが存在するかチェック
If ActiveProject.Tasks.Count = 0 Then
MsgBox “タスクが登録されていません。”, vbExclamation, “処理中断”
Exit Sub
End If
‘ プロジェクト内のすべてのタスクを上から順にループ処理
For Each tsk In ActiveProject.Tasks
‘ 削除されたタスクや空行を除外
If Not tsk Is Nothing Then
wbsName = tsk.Name
‘ 【コアロジック】タスク名に含まれる「.」の数を数えて階層を決定する
‘ 例: “1.” -> 1個, “1.1.” -> 2個, “1.1.1” -> 2個(末尾のドット有無に対応)
dotCount = CountCharacter(wbsName, “.”)
‘ アウトラインレベルは 1 から始まるため、ドットの数 + 1 が基本レベルとなる
‘ ※実際の運用ルール(命名規則)に合わせてここは微調整してください
Dim targetLevel As Integer
targetLevel = dotCount + 1
‘ Projectの上限レベル(通常は最高19階層だが、実務では5階層程度が安全)を超える場合のガード
If targetLevel > 19 Then targetLevel = 19
‘ アウトラインレベルを適用
tsk.OutlineLevel = targetLevel
End If
Next tsk
Application.ScreenUpdating = True
MsgBox “WBSの階層化(インデント自動整形)が完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ ————————————————————————-
‘ 補助関数: 文字列ထဲから特定の文字(今回は “.”)が何回登場するかを数える
‘ ————————————————————————-
Function CountCharacter(ByVal targetString As String, ByVal searchChar As String) As Integer
Dim originalLength As Integer
Dim replacedLength As Integer
originalLength = Len(targetString)
‘ 文字列から検索対象文字を消去した長さとの差分をカウントするイディオム
replacedLength = Len(Replace(targetString, searchChar, “”))
CountCharacter = originalLength – replacedLength
End Function
—
コードの解説:ここがエンジニアのこだわりポイント
初心者の方に向けて、コードの重要なポイントを優しく解説しますね。
1. `Application.ScreenUpdating = False` の魔法
Projectは、タスクのインデントを変えるたびに裏側でガントチャートの再描画(レイアウト計算)走らせます。タスクが数百個あると、これが原因で画面が固まったように遅くなります。処理の最初に画面更新を止め、最後に `True` に戻す。これがプロの速度を出す鉄則です。
2. `CountCharacter` 関数のスマートさ
「文字列からドットを消去したときの文字数の差」でカウントするテクニックを使っています。これならループを回して一文字ずつ判定するよりも圧倒的に高速で、バグりにくい美しいコードになります。
—
陥りやすいエラーと回避のテクニック
このコードや、独自のProjectマクロを組む際によくある「罠」を先回りしてお伝えしておきます。
罠1: 「親がないのに子を作ろうとして怒られる」エラー
Projectの仕様上、レベル3のタスクの直上に、いきなりレベル1のタスクを配置することはできません(ツリー構造が破綻するため)。
- 対策: 基本的には上から順に正しいWBS番号(1. -> 1.1 -> 1.1.1)の規則でタスク名をつけておき、今回のコードのように上から順番に `OutlineLevel` を流し込むことで、このエラーを綺麗に回避できます。
罠2: 実行したけどインデントが反映されない?
マクロを実行したのに見た目が変わらない場合、Projectの「グループ化」や「フィルター」が有効になっているケースがあります。
- 対策: 実行前には必ず、表示形式を「ガント チャート」にし、グループ化を「[なし]」にリセットした状態でマクロを走らせてください。
—
まとめ
今回は、タスク名から自動で階層を判定し、インデントを適用するパーサーを通じて、MS Project VBAの極意を解説しました。
「マクロの記録」の先にある、「オブジェクトの特性を理解し、ロジックで実務を圧倒的に効率化する世界」の心地よさが少しでも伝わったでしょうか?
このパーサーをベースに、「特定のキーワード(例: 【フェーズ】など)が含まれたら太字にする」「自動的にサマリータスク化する」といった独自のカスタマイズを加えていくと、あなただけの最強のプロジェクト管理自動化ツールが完成します。
ここをクリアしたあなたなら、もう立派なVBAエンジニアの仲間入りです。ぜひ現場で試して、周囲をあっと言わせてくださいね!
