【入門編】依存関係の「複雑度」をスコアリング:リンクが多すぎるタスクを自動抽出する品質管理 – Project VBA解析バイブル

スポンサーリンク

こんにちは!現場でバリバリVBAを書いていると、最初は「マクロの記録」で満足していたはずが、気づけば「どうやったらもっとスマートに、大きなプロジェクトを自動制御できるんだろう?」という壁にぶぶつかりますよね。

特にMicrosoft Project(MSP)を相手にする時、タスクのスケジュール管理は複雑怪奇になりがちです。
「あれ、このタスク、なんでこんなに前工程がぶら下がってるんだ?」
「ここを変更したら、プロジェクト全体のスケジュールが崩壊した……」

そんな現場の悲鳴を未然に防ぐため、今回は「タスクの依存関係の複雑度を自動スコアリングし、メンテナンス困難なボトルネックを炙り出す品質管理スクリプト」を授けましょう。

ここをクリアすれば、あなたも単なる「マクロの使い手」から、プロジェクトの健康状態を操る「アーキテクト」へと一歩踏み出せますよ。バッチリ解説していくので、ついてきてくださいね!

1. なぜタスクの「依存関係」をスコアリングするのか?

プロジェクト管理において、WBS(Work Breakdown Structure)のタスク同士を繋ぐ「前提条件(リンク)」は命綱です。しかし、これがスパゲッティのように絡み合っているプロジェクトは、例外なく「炎上」します。

  • 何重もの先行タスク(Predecessors)がついているタスクは、スケジュール変更のたびに再計算の嵐になり、担当者が追いつかなくなります。
  • 後続タスク(Successors)が多すぎるタスク(=ハブとなっているタスク)が遅延すると、プロジェクト全体のドミノ倒しが起きます。

これらを人の目だけでチェックするのは至難の業。だからこそ、VBAに計算を代行させ、危険なタスクを自動で炙り出すのです。

2. Project VBAの基本と「オブジェクトのライフサイクル」

Excel VBAと違って、Project VBAには独特のルールがあります。
「ActiveProject」というアクティブな世界を基準に、`Tasks`コレクションや`Task`オブジェクトを操作します。

ここでプログラミング初学者がハマりがちな罠が、「オブジェクトの重み」です。
MSPのタスク数千件に対して、ループの中で無闇にプロパティを書き換えたり選択(Select)したりすると、処理がカメのように遅くなります。

【ここがプロの知見】
依存関係の分析は、「読む(参照する)」だけの処理なので、画面の再描画を止める(`ScreenUpdating = False`)テクニックを使う必要すらありませんが、コレクションを回すときは「インデックスアクセスを最小限にする」のが鉄則です。

3. 実装コード:依存関係スコアリング・エンジン

それでは、実際の現場でそのままコピペして使える完全版のコードを公開します。
このスクリプトは、各タスクの「先行タスクの数」と「後続タスクの数」を足し合わせ、「依存度スコア(Complexity Score)」を算出。スコアが閾値(デフォルトでは5以上)を超えた「危険なタスク」を抽出し、ノート欄に警告を書き込みます。

Sub AnalyzeTaskComplexity()
‘ =====================================================================
‘ 目的: タスクの依存関係(先行・後続)をスコアリングし、複雑な箇所を特定する
‘ 対象: ActiveProject
‘ =====================================================================

Dim tsk As Task
Dim predCount As Long
Dim succCount As Long
Dim complexityScore As Long
Dim threshold As Long
Dim warningCount As Long

‘ 複雑度とみなす閾値(この数以上のリンクを持つタスクを検挙する)
threshold = 5
warningCount = 0

‘ 処理速度向上と余計な画面描画を防ぐための一手
On Error GoTo ErrorHandler

‘ プロジェクト内の全タスクを走査
For Each tsk In ActiveProject.Tasks
‘ サマリータスク(大項目)やマイルストーンを除外したい場合はここで制御可能ですが、
‘ 今回は実作業(Active)のタスクを厳しくチェックします
If Not tsk Is Nothing Then
If tsk.Summary = False And tsk.Active = True Then

‘ 1. 先行タスク(Predecessors)の数をカウント
‘ リンク文字列をカンマで分割して数を割り出すプロフェッショナルな手法
predCount = CountLinks(tsk.Predecessors)

‘ 2. 後続タスク(Successors)の数をカウント
succCount = CountLinks(tsk.Successors)

‘ 3. 総合複雑度スコアの算出(先行+後続)
complexityScore = predCount + succCount

‘ 4. 閾値を超えたタスクへのアプローチ
If complexityScore >= threshold Then
warningCount = warningCount + 1

‘ タスクのテキスト欄(Text1)にスコアを記録
tsk.Text1 = “要注意 (Score: ” & complexityScore & “)”

‘ タスクのノートに詳細を自動追記
tsk.Notes = “[自動診断] このタスクは依存関係が過密です。” & vbCrLf & _
“先行タスク数: ” & predCount & ” / 後続タスク数: ” & succCount & vbCrLf & _
“スケジュール変更時の影響範囲に注意してください。”

‘ 視覚的に気づきやすいようにタスクの色を変える(赤色ハイライト)
‘ ※MSPのパレット制御はColorEnumを使用
tsk.FontColor = pjRed
Else
‘ 正常なタスクはクリア
tsk.Text1 = “正常”
tsk.FontColor = pjAutomatic
End If

End If
End If
Next tsk

‘ 完了メッセージ
MsgBox “依存関係の分析が完了しました!” & vbCrLf & _
“複雑度が閾値(” & threshold & “)を超えた危険なタスク: ” & warningCount & “件” & vbCrLf & _
“※該当タスクはText1とフォントカラー(赤)でハイライトされています。”, vbInformation, “品質管理完了”

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ =====================================================================
‘ 補助関数: リンク文字列から接続数を正確にカウントする
‘ =====================================================================
Private Function CountLinks(ByVal linkString As String) As Long
If Trim(linkString) = “” Or linkString = “経過時間” Or linkString = “なし” Then
CountLinks = 0
Else
‘ MSPのリンク文字列はセミコロン(;)区切りで格納されることが多い
‘ 例: “1FS+2d; 3SS; 5FF”
CountLinks = UBound(Split(linkString, “;”)) + 1
End If
End Function

4. コードのここがポイント!知っておくべき技術的背景

このコードには、実務で使えるいくつかの「アーキテクチャの知見」が詰まっています。

1. `Split`関数によるリンク数カウントの妙
Projectの `Predecessors` プロパティは、オブジェクトコレクションではなく「文字列」として返ってきます(例: `3FS+2d; 5`)。これを真っ向からオブジェクトで辿ろうとすると泥沼にハマります。文字列の区切り文字(`;`)を `Split` で配列化し、その要素数を数えるというアプローチこそ、コードを軽量に保つ秘訣です。
2. 実務に即したセーフティネット (`If tsk Is Nothing`)
MSPの `Tasks` コレクションは、途中でタスクが削除された際に「空のオブジェクト(Nothing)」を挟むことがあります。これを無視してプロパティを叩くと、容赦なく「オブジェクト変数が設定されていません」エラー(Runtime Error 91)が起きます。初学者が必ず踏むこの地雷を、`If Not tsk Is Nothing` で完璧にガードしています。
3. 視覚的フィードバックとデータの分離
単にログを出すだけでなく、`Text1` というカスタムフィールドと、`FontColor = pjRed` による視覚的アプローチを組み合わせています。プロジェクトマネージャーがガントチャートを開いた瞬間、「赤くなっているタスク=爆弾」と一目で分かる状態を作るのが、自動化エンジニアの仕事です。

最後に:ここをクリアすれば、Project VBAはバッチリ!

いかがでしたでしょうか?
「マクロの記録」では絶対に手に入らない、オブジェクトの裏側を意識したデータ処理と、現場の品質管理を結びつける感覚を掴んでいただけたなら幸いです。

複雑に絡み合ったWBSを綺麗に整理し、プロジェクトを成功へと導く裏方として、このスクリプトをあなたの武器庫に加えてみてください。

「ここをもっとこう改変したい」「こういう複雑な依存関係も検知したい」といった応用への挑戦も大歓迎です。あなたのVBAライフが、より知的でエキサイティングなものになりますように!

タイトルとURLをコピーしました