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を書き込んでみてください。そこから新しい世界が見えてくるはずです。
もしコードで詰まることがあれば、またいつでも聞きに来てください。あなたの挑戦を、心から応援しています。
