プロジェクトの「闇」を暴く:孤立タスクを自動検出するProject VBAの極意
こんにちは。現場で泥臭く、しかし誰よりもスマートに自動化を追求しているエンジニアです。
Project VBAを触り始めた皆さんが、まず最初に直面する壁。それは「複雑なプロジェクトの中で、誰とも繋がっていない『孤立タスク』が放置される」という悲劇です。依存関係(Predecessors)のないタスクは、プロジェクトのタイムラインにおいて「浮遊する幽霊」のようなもの。これが増えると、進捗管理は崩壊します。
今日は、マクロの記録ボタンを押すだけの卒業生から、「プロジェクトの整合性を守るアーキテクト」へとステップアップするための、実用的な品質管理ツールを一緒に作っていきましょう。
—
1. なぜ「孤立タスク」を見つける必要があるのか?
Projectにおけるタスクの依存関係は、言わば「プロジェクトの血液循環」です。
依存関係がないタスクは、プロジェクト開始日(Project Start)に固定され、全体スケジュールが変更されてもピクリとも動きません。これでは、遅延の影響範囲を可視化できないのです。
今回作るスクリプトは、単なる抽出ツールではありません。「プロジェクトの健全性をチェックする検疫官」です。
—
2. 実践:孤立タスク抽出スクリプト
以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。単に動くだけでなく、メモリ効率とオブジェクトの特性を考慮した「プロの書き方」を意識しています。
Sub DetectOrphanTasks()
‘ Projectオブジェクトへの参照を明示的に定義(パフォーマンス向上の基本)
Dim proj As Project
Dim tsk As Task
Dim orphanCount As Integer
Set proj = ActiveProject
orphanCount = 0
‘ 画面更新を一時停止して処理速度を劇的に向上させる
Application.ScreenUpdating = False
‘ プロジェクト内の全タスクを走査する
‘ ここで重要なのは「サマリータスク(階層の親)」を除外すること
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 孤立タスクの条件:
‘ 1. サマリータスクではない (Summary = False)
‘ 2. 前提条件がない (Predecessors = “”)
‘ 3. マイルストーンではない(必要に応じて)
If Not tsk.Summary Then
If tsk.Predecessors = “” Then
‘ 孤立タスクを発見したら、タスク名に印を付けるかイミディエイトウィンドウへ
Debug.Print “孤立タスク発見: ID ” & tsk.ID & ” – ” & tsk.Name
tsk.Flag1 = True ‘ Flag1フィールドを「警告」として活用
orphanCount = orphanCount + 1
Else
tsk.Flag1 = False
End If
End If
End If
Next tsk
Application.ScreenUpdating = True
If orphanCount > 0 Then
MsgBox orphanCount & “件の孤立タスクが見つかりました!Flag1を確認してください。”, vbExclamation
Else
MsgBox “素晴らしい!すべてのタスクに依存関係が設定されています。”, vbInformation
End If
End Sub
—
3. コードの「魂」を読み解く(解説)
① なぜ `Set proj = ActiveProject` なのか?
初心者の方は直接 `ActiveProject.Tasks` を叩きがちですが、これではメソッドを呼び出すたびにオブジェクトを再検索するオーバーヘッドが発生します。変数に格納することで、メモリ上の参照を維持し、高速かつ安全にアクセスできます。
② `tsk.Summary` のチェック
これこそが「構造」を理解しているエンジニアの視点です。サマリータスク(親)は、子タスクの集計結果を表示する箱に過ぎません。これにまで依存関係を設定しようとすると、プロジェクト構造がスパゲッティ化します。「実作業(子タスク)のみを監視する」のが品質管理の鉄則です。
③ `Flag1` の活用
結果をただメッセージボックスで出すだけでは、すぐに忘れてしまいます。Projectには「Flag1~20」という便利なカスタムフィールドがあります。これに「警告」を書き込むことで、ガントチャート上に色を付けたり、フィルタリングしたりと、後続の運用に繋げられるのがポイントです。
—
4. 陥りやすい罠:ここだけは注意して!
- 削除タスクの存在: `For Each tsk In proj.Tasks` を回す際、途中でタスクを削除するとインデックスがずれてエラーになります。今回は情報を「読み取る」だけなので安全ですが、タスクを操作(削除や追加)する際は、必ず 「後ろからループ(For i = count To 1 Step -1)」 するのが鉄則です。
- 例外処理の欠如: 非常に大きなプロジェクトでは、たまに「Nothing」のタスクが混じることがあります。`If Not tsk Is Nothing Then` というガード句は、あなたのコードをクラッシュから守る最強の盾です。
—
最後に:エンジニアとしての一歩先へ
今回作成したツールは、最初の小さな一歩です。
慣れてきたら、このスクリプトを「プロジェクト保存時に自動実行する(`Project_BeforeSave` イベント)」ように改造してみてください。そうすれば、「孤立タスクがあるプロジェクトは絶対に保存させない」という、強力なゲートキーパーを構築できます。
技術を覚えることは、ツールを動かすことではありません。「プロジェクトの品質をコントロールする」という意識を持つことです。
ここをクリアすれば、あなたはもうただのVBAユーザーではありません。プロジェクトを支配するアーキテクトの入り口に立っています。次は何を自動化しましょうか?またいつでも相談してくださいね。
