【入門編】VBAでタスクの「カスタムフィールド」を活用した依存関係の管理 – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握する極限の知見:カスタムフィールドで依存関係を「ハック」せよ

こんにちは。現場で泥臭い自動化を積み重ね、Projectの深淵を覗いてきたチーフアーキテクトです。

MS Projectの標準機能である「先行タスク(Predecessors)」は、確かに強力です。しかし、大規模プロジェクトの現場では、「標準機能だけでは表現できない柔軟なリンク関係」が求められることが多々あります。

今日は、標準のプロパティに縛られず、「カスタムフィールド」というキャンバスを使って依存関係を動的に再構築する、プロフェッショナルな設計手法を伝授します。マクロの記録から一歩先へ進みたいあなたへ、贈る言葉です。

1. なぜ「標準のPredecessors」では不十分なのか?

標準の依存関係設定は、IDやUUIDに強く依存します。タスクが移動したり、IDがズレたりすると、リンクが切れる(あるいは意図しないタスクと繋がる)という悪夢を経験したことはありませんか?

そこで登場するのが「カスタムフィールドによるID管理」です。
例えば「テキスト1」フィールドに「親タスクID」を書き込んでおき、VBAでそれを読み取ってリンクを再構築する。この手法なら、タスクの順序が変わっても、論理的なつながりをロバスト(堅牢)に保つことができます。

2. 実践:カスタムフィールドを活用したリンク再構築ロジック

まずは、タスクの「テキスト1」フィールドに依存先のIDが格納されている前提で、動的にリンクを張るコードを見てみましょう。

実用コード:カスタム依存関係の再構築

Sub RebuildDependenciesFromCustomField()
Dim tsk As Task
Dim targetID As String
Dim targetTask As Task

‘ プロジェクト内の全タスクを走査
For Each tsk In ActiveProject.Tasks
‘ テキスト1(Text1)に依存先IDが書かれているか確認
targetID = tsk.Text1

If targetID <> “” Then
‘ IDからタスクオブジェクトを特定
Set targetTask = ActiveProject.Tasks.UniqueID(targetID)

‘ 既存のリンクを一度クリアしてから再設定する(重複エラー回避)
tsk.TaskDependencies.Clear

‘ 依存関係を構築(FS:終了-開始関係)
tsk.TaskDependencies.Add From:=targetTask, Type:=pjFinishToStart

Debug.Print “タスク [” & tsk.Name & “] を [” & targetTask.Name & “] に紐付けました。”
End If
Next tsk

MsgBox “依存関係の再構築が完了しました。”
End Sub

3. ここがプロの視点:陥りやすい「罠」と対策

このコードをそのまま使う前に、アーキテクトとしていくつか「現場の鉄則」を共有しておきます。

① インデックスとUniqueIDの混同

初心者が最もハマるのがここです。`Tasks(1)` と `Tasks.UniqueID(1)` は全くの別物。行番号(インデックス)は並び替えで変動しますが、UniqueIDはタスクが削除されるまで不変です。依存関係を管理するなら、必ずUniqueIDを使うこと。これが鉄則です。

② .Clearの重み

`tsk.TaskDependencies.Clear` を忘れると、スクリプトを実行するたびに古いリンクが残り続け、プロジェクトが「スパゲッティ状態」になります。自動化の基本は「常にクリーンな状態から再構築する(冪等性の担保)」です。

③ 存在しないIDへのアクセス

もし「テキスト1」に存在しないIDが書かれていた場合、VBAはエラーで停止します。本番環境では `On Error Resume Next` で囲み、エラーログを吐き出すようなガードを必ず入れてください。

4. なぜこの設計が最強なのか?

この手法の最大のメリットは「プロジェクトの再利用性」です。

1. テンプレート化: 依存関係をカスタムフィールドに持たせておけば、新しいプロジェクトを作る際に、そのカスタムフィールドをコピーするだけで、自動的に依存関係が復元されます。
2. デバッグの容易性: リンクが切れたとき、画面上で複雑なガントチャートを追いかける必要はありません。カスタムフィールドを確認するだけで、「どこが間違っているか」が一目瞭然です。

最後に:自動化は「道具」ではなく「哲学」

VBAをただの「作業短縮ツール」だと思わないでください。それは、あなたの設計思想をプロジェクトに埋め込むための「言語」です。

「標準機能がダメなら、別の場所(カスタムフィールド)に逃げ道を作ればいい」。この発想こそが、現場を救うエンジニアの第一歩です。

まずは、あなたのプロジェクトにある「テキスト1」に、依存先のIDを書き込んでみてください。そこから新しい世界が見えてくるはずです。

もしコードで詰まることがあれば、またいつでも聞きに来てください。あなたの挑戦を、心から応援しています。

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