【テクニカル・上級編】【中級者向け】タスクの「カスタムフィールド」をフル活用した、依存関係の論理的根拠の自動記録 – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:WBS依存関係の「論理的根拠」をコードで永続化する

システム開発において、最もコストを要するのはコードを書くことではない。「なぜそのタスクがその順序で並んでいるのか」という、仕様の背後にある意思決定の経緯を追跡することだ。

Project VBA(MS ProjectのVBA)を扱う際、多くのエンジニアは`Task.TaskDependencies`を操作して終わりにする。だが、真のアーキテクトは、そのリンクが「ビジネス上の要請」なのか「技術的な制約」なのかを明示的に記録する。

今回は、カスタムフィールドを駆使し、依存関係の論理的根拠をメタデータとして永続化する極限の実装手法を伝授する。

—

1. なぜ「カスタムフィールド」による管理が不可欠なのか

Projectの標準機能である依存関係(FS, SSなど)は、あくまでスケジューラ上の「制約」に過ぎない。しかし、プロジェクトが炎上する際、問題になるのは「なぜこの制約が存在するのか」というコンテキストの欠落だ。

我々は以下の戦術をとる。
1. テキスト型カスタムフィールド(Text1等)を「RootCause(論理的根拠)」として再定義する。
2. 依存関係生成時に、その決定に至った背景(チケット番号、担当者、合意日)を自動挿入する。
3. メモリ管理を厳格化し、Projectの重厚なオブジェクトモデルを高速に操作する。

—

2. 実装:依存関係生成とメタデータの自動注入

単にリンクを繋ぐのではなく、`Task.Text1`に根拠を書き込み、Projectが再計算を行う瞬間に不整合が起きないよう堅牢なガードを敷く。

‘ 伝説的なアーキテクトによる依存関係構築の定石
Public Sub SetDependencyWithLogic(ByVal PredecessorID As Long, _
ByVal SuccessorID As Long, _
ByVal LogicMemo As String)
Dim proj As Project
Dim predTask As Task
Dim succTask As Task

Set proj = ActiveProject

‘ 内部キャッシュを保護するためのエラーハンドリング
On Error GoTo Cleanup

Set predTask = proj.Tasks(PredecessorID)
Set succTask = proj.Tasks(SuccessorID)

‘ 依存関係の構築(FS: Finish-to-Start)
succTask.TaskDependencies.Add Predecessor:=predTask, Type:=pjFinishToStart

‘ ロジックの記録(カスタムフィールド Text1 を論理的根拠として利用)
‘ 既存のメモがある場合は追記型にするのが運用のコツだ
succTask.Text1 = Format(Now, “yyyy/mm/dd HH:nn”) & ” | ” & LogicMemo & ” | Prev:” & predTask.Name

‘ メモリ最適化:Projectオブジェクトモデルは複雑であるため、参照は明示的に解放する
Cleanup:
Set predTask = Nothing
Set succTask = Nothing
Set proj = Nothing

If Err.Number <> 0 Then
Debug.Print “Critical Error: ” & Err.Description
End If
End Sub

—

3. シニアエンジニアのための最適化の極意

オブジェクトの明示的解放

VBAはガベージコレクションが脆弱だ。特にProjectのように膨大なタスクオブジェクトを抱える環境では、`Set = Nothing`を怠ればメモリリークは必至。ループ処理を行う際は、必ずスコープ外で参照を破棄せよ。

Windows APIによる「強制再計算」の抑制

大規模プロジェクトで数千のリンクを一度に設定すると、Projectはその都度再計算を行い、パフォーマンスが致命的に低下する。これを防ぐには、以下のWindows APIを活用し、描画を一時的に停止させるのが通のやり方だ。

‘ 描画更新を停止させるAPI宣言
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” _
(ByVal hwndLock As LongPtr) As Long

‘ 処理開始時
LockWindowUpdate Application.hWnd

‘ … 処理を実行 …

‘ 処理終了時
LockWindowUpdate 0

—

4. プロジェクト管理の「メタデータ」という思想

この手法の真骨頂は、「誰が、いつ、なぜリンクを繋いだか」がタスクそのものに埋め込まれている点にある。

半年後にプロジェクトが引き継がれた際、後任者は「なぜこのタスクはここにあるのか?」と悩む必要はない。`Text1`フィールドをフィルタリングするだけで、プロジェクトの意思決定ツリーが浮き彫りになるからだ。

最後に

自動化とは、単なる作業の代行ではない。「情報に価値を付与し、未来の自分や仲間を助けるための仕組みづくり」である。Project VBAの標準機能に甘んじることなく、カスタムフィールドという「キャンバス」に、プロジェクトの知見を書き込み続けよ。

それが、レガシーを乗りこなし、真のマスターとなるための唯一の道だ。

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