【上級者向け】依存関係の「複雑度」をスコアリング:リンクが多すぎるタスクを自動抽出する品質管理ツール
プロジェクトマネジメントにおいて、Microsoft ProjectのWBS(Work Breakdown Structure)やタスク間の依存関係(リンク)は、スケジュールを精緻にコントロールするための生命線だ。
しかし、現場で組まれた実際のスケジュールを見て、こう絶望したことはないだろうか?
「このタスク、前後関係のリンクが多すぎて、1日ずらしただけで全体の半分のタスクが連鎖的に狂うぞ……?」
過剰な依存関係(Over-linking)は、スケジュール変更に対する「硬直化」を招き、リスク管理上の最大の爆弾となる。しかし、何千行もある巨大なMSPファイルを目視で監査するなど不可能だ。
今回は、Project VBAのオブジェクトモデルを極限まで知り尽くしたアーキテクトの視点から、タスクの依存関係の「複雑度」を自動スコアリングし、リスクの高いタスクを瞬時にあぶり出す品質管理ツールの実装コードを伝授する。
—
1. なぜ「リンクの多すぎるタスク」は悪なのか?(設計思想)
MS ProjectのTaskオブジェクトには、`Predecessors`(先行タスク)と`Successors`(後続タスク)というコレクションが存在する。
理論上、これらを網羅的に繋げば完璧なクリティカルパスができるように思えるが、実務では以下の弊害を生む。
1. スパゲッティ・スケジュール化: 一箇所の遅延が想定外の箇所へ伝播し、プロジェクトマネージャーのコントロールを離れる。
2. 保守性の崩壊: 計画変更のたびにデッドロックが発生し、スケジュール引き直しの工数が爆発する。
これを防ぐためには、単にリンクの有無を見るのではなく、「1つのタスクに集中している入出力の総数(次数:Degree)」を定量的に評価し、閾値を超えたものを「要警戒タスク」として自動検知する仕組みが必要なのだ。
—
2. 堅牢なVBA設計のポイント
Project VBAで大規模なタスク群を走査する際、初心者が陥りがちな罠が「パフォーマンスの劣化」と「COMオブジェクトの解放漏れ」だ。
- 画面描画のロック: `Application.ScreenUpdating = False` を忘れると、数千行のタスクを走査するたびに画面が再描画され、処理が何十倍も遅くなる。
- コレクションアクセスのコスト: ループ内でむやみにプロパティを叩くのではなく、必要な情報を変数にキャッシュして高速化を図る。
- カスタムフィールドの活用: 検出した複雑度スコアは、視覚的に分かりやすいようMSPのカスタムテキスト/数値フィールド(例: `Number1`)に書き戻し、ビュー上で赤色フィルターをかけられるようにする。
—
3. 【プロダクションコード】依存関係複雑度チェッカー
以下のコードをProjectのVBAエディタ(標準モジュール)に貼り付け、そのまま実行してほしい。アクティブプロジェクト内の全タスクを走査し、先行・後続リンクの総数をカウントしてスコアリングを行う。
Option Explicit
‘ ==============================================================================
‘ 処理名: タスク依存関係 複雑度スコアリング&品質監査ツール
‘ 概要 : 各タスクの先行・後続リンク数を集計し、過剰な依存を持つタスクを特定する。
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Sub AuditTaskComplexity()
‘ 1. 定数定義
Const THRESHOLD_COMPLEXITY As Long = 5 ‘ 警告を発するリンク数の閾値(先行+後続の合計)
Const TARGET_CUSTOM_FIELD As String = “Number1” ‘ スコアを書き込むカスタムフィールド
Dim prj As Project
Set prj = ActiveProject
‘ プロジェクトが存在しない、またはタスクがない場合は終了
If prj.Tasks.Count = 0 Then
MsgBox “監査対象のタスクが存在しません。”, vbExclamation, “品質管理ツール”
Exit Sub
End If
‘ 2. パフォーマンス最大化のための環境設定
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Application.Calculation = pjManual
Dim t As Task
Dim predCount As Long
Dim succCount As Long
Dim totalLinks As Long
Dim warningCount As Long
warningCount = 0
Dim auditReport As String
auditReport = “【依存関係 複雑度監査レポート】” & vbCrLf & vbCrLf
‘ 3. 全タスクの走査とスコアリング
For Each t In prj.Tasks
‘ サマリータスクやマイルストーンを除外したい場合はここで条件分岐を入れる
If Not t Is Nothing Then
If Not t.Summary Then ‘ サマリータスクを除外する場合
‘ 先行タスク数と後続タスク数を取得
‘ ※Predecessors / Successors コレクションのCountプロパティを利用
On Error Resume Next
predCount = t.Predecessors.Count
succCount = t.Successors.Count
On Error GoTo ErrorHandler
totalLinks = predCount + succCount
‘ カスタムフィールドにスコアを書き込み(ビューでの可視化用)
‘ ※事前にMSP側でNumber1を「依存複雑度」としておくことを推奨
t.Number1 = totalLinks
‘ 4. 閾値超過タスクの抽出とログ蓄積
If totalLinks >= THRESHOLD_COMPLEXITY Then
warningCount = warningCount + 1
t.Text1 = “要見直し(過剰リンク)” ‘ フラグ用テキストフィールド
‘ レポート文字列の構築(上位過剰タスクを抜粋)
If warningCount <= 20 Then ' ログが長くなりすぎないよう上位20件まで
auditReport = auditReport & _
"・ID: " & t.ID & " | 名称: " & t.Name & _
" (先行: " & predCount & " / 後続: " & succCount & " / 合計: " & totalLinks & ")" & vbCrLf
End If
Else
t.Text1 = ""
End If
End If
End If
Next t
' 5. 処理終了後の後始末と結果通知
Application.ScreenUpdating = True
Application.Calculation = pjAutomatic
If warningCount > 0 Then
auditReport = auditReport & vbCrLf & “合計 ” & warningCount & ” 件の過剰リンクタスクを検出しました。” & vbCrLf & _
“カスタムフィールド ‘Number1’ および ‘Text1’ を確認してください。”
MsgBox auditReport, vbExclamation, “品質監査完了:警告あり”
Else
MsgBox “監査完了:閾値(” & THRESHOLD_COMPLEXITY & “)を超える複雑な依存関係を持つタスクはありませんでした。”, vbInformation, “品質監査完了:正常”
End If
Exit Sub
ErrorHandler:
‘ 異常発生時も必ず描画と計算モードを復元する(極めて重要)
Application.ScreenUpdating = True
Application.Calculation = pjAutomatic
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. コードの深掘り:プロが仕込む「3つの防壁」
上記のコードは、単に動くだけのスクリプトではない。実務の現場で耐えうるために以下のアーキテクチャ上の工夫が施されている。
① `On Error Resume Next` の限定的運用
タスクによってはリンクが存在しない、あるいは参照時に特殊なエラーを返すエッジケースがある。そのため、コレクションのカウント取得部分のみピンポイントでエラーをいなし、全体のループが止まらない堅牢性を担保している。
② 計算モードと画面描画の完全制御
`Application.Calculation = pjManual` にすることで、VBAが値を書き換えるたびにMSPが全体スケジュールを再計算するのを防ぎ、処理速度を劇的に向上させている。また、エラーハンドラ内でも確実に `pjAutomatic` に戻す構造にしているため、「マクロ実行後にMSPがフリーズしたように重くなる」という事故を100%防ぐ。
③ 監査結果の「可視化」の連動
検出した結果をVBAのメッセージボックスだけで終わらせず、タスクの `Number1`(数値)と `Text1`(文字列)に書き戻している点に注目してほしい。これにより、開発者はマクロ実行後、MS Projectの標準機能(フィルターやグループ化)を使って、「複雑度が高い順にタスクを並べ替えて画面で確認する」という次のアクションへシームレスに移行できる。
—
5. 運用への組み込みと今後の拡張
このツールは、単発のチェッカーとして使うだけでなく、以下のように拡張することで真価を発揮する。
- Excel/DB連携への発展: 検出された過剰リンクタスクのリスト(ID、名称、スコア)をADO経由でSQL ServerやPower BIのデータソースに吐き出し、組織全体の「スケジュール品質ダッシュボード」のKPIとして常時モニタリングする。
- CI/CDパイプライン的な運用: PMOが週次で走らせる定例バッチに組み込み、スケジュールベースライン登録前の「自動ゲート審査」として機能させる。
スケジュール管理の品質は、属人的な勘に頼る時代は終わった。
オブジェクトのライフサイクルを理解し、ロジカルにリスクを数値化する――これこそが、次世代の業務自動化エンジニアが備えるべきアプローチである。
現場のスパゲッティ・スケジュールを、今すぐあなたの手で美しくリファクタリングしてほしい。
