プロジェクトの「なぜ」を資産に変える:Project VBAによる依存関係の自動監査ログ実装術
やあ。プロジェクトマネジメントの現場で、こんな経験はないだろうか?
「このタスク、なぜ先行タスクと紐付いているんだ?」
「いつの間にか依存関係が変わっているけど、誰がやったんだ?」
プロジェクトが巨大化するほど、この「なぜ(理由)」の追跡は困難を極める。マクロの記録で自動化する段階は卒業だ。今日は、Project VBAを使いこなし、タスクの依存関係に「論理的な足跡」を刻み込む、ワンランク上のアーキテクチャを伝授しよう。
—
1. なぜ「メモ」フィールドを使うのか?
Project VBAにおいて、タスクは単なるオブジェクトではない。複雑な依存関係を持つ「生きた情報構造体」だ。
標準の「先行タスク」フィールドには、IDしか記録されない。しかし、ビジネスの現場では「なぜその依存関係が必要なのか」というコンテキスト(背景)こそが、プロジェクトのリスク管理の要となる。
今回の戦略はこうだ。
1. VBAでタスクの依存関係を変更する関数を作成する。
2. その際、変更理由を引数として受け取る。
3. 自動的に「メモ(Notes)」フィールドに、[タイムスタンプ][実行者][変更理由]を追記する。
これで、あなたのプロジェクトは「誰が・いつ・なぜ」を説明できる、盤石なデータ構造を手に入れることになる。
—
2. 実装:依存関係設定と自動監査ログの関数
まずは、このコードを見てほしい。これが、現場でそのまま使える「依存関係設定の標準メソッド」だ。
‘ 【上級者向け】依存関係設定と監査ログ自動生成
‘ ターゲットタスクに先行タスクを設定し、メモに理由を追記する
Sub SetDependencyWithAudit(targetTask As Task, predecessorTask As Task, reason As String)
On Error GoTo ErrorHandler
‘ 1. 依存関係の構築 (Predecessorsプロパティへの追加)
‘ 既に先行タスクがある場合はカンマ区切りで追加する
If targetTask.Predecessors <> “” Then
targetTask.Predecessors = targetTask.Predecessors & “,” & predecessorTask.ID
Else
targetTask.Predecessors = CStr(predecessorTask.ID)
End If
‘ 2. 監査ログの生成(メモ欄への追記)
Dim logEntry As String
logEntry = vbCrLf & “— 監査ログ: ” & Now & ” —” & vbCrLf & _
“実行者: ” & Application.UserName & vbCrLf & _
“変更内容: タスクID ” & predecessorTask.ID & ” を先行タスクに設定” & vbCrLf & _
“理由: ” & reason & vbCrLf
targetTask.Notes = targetTask.Notes & logEntry
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
—
3. コードの読み解き:ここを抑えれば「プロ」への道が開ける
① オブジェクト指向の考え方
`targetTask As Task` という書き方に注目してほしい。これはProject VBAにおける「型指定」だ。
初学者は `TaskID` だけでタスクを操作しがちだが、プロはタスクそのものをオブジェクトとして捉える。これにより、`targetTask.Notes` や `targetTask.Predecessors` といったプロパティに直接アクセスでき、コードの可読性と安全性が劇的に向上する。
② `vbCrLf` の重要性
メモフィールドはテキストボックスだ。一行で全てを繋げると後で読む人間が絶望する。`vbCrLf`(Visual Basic Carriage Return Line Feed)を使って、適切な改行を入れることは、コードを書く者の「誠実さ」の表れだ。
③ 陥りやすい罠:エラーハンドリング
「依存関係に循環参照が含まれたらどうなるか?」Projectは自動的にエラーを吐く。`On Error GoTo` を入れずに自動化を走らせるのは、シートベルトなしで高速道路を走るようなものだ。必ず実装すること。
—
4. 次のステージへ:さらに洗練させるには
この仕組みを導入すると、あなたのプロジェクトは「変更履歴を保持するデータベース」へと進化する。さらに突き詰めるなら、以下のアプローチが有効だ。
- カスタムフィールドの活用: `Notes` は容量に限界がある。大量のログを吐くなら、カスタムフィールド(Text1, Text2…)にログを退避させる設計に切り替えよう。
- バリデーションの強化: `reason` が空欄の場合はエラーにするなど、強制的に「理由」を書かせる運用にすれば、チーム全体の品質管理レベルが一段階上がるはずだ。
—
最後に:自動化は「対話」である
自動化とは、ただ面倒な作業を消し去ることではない。「プロジェクトの情報を、後から読み解ける資産として整えること」だ。
今回のコードをベースに、自分の現場の運用に合わせてカスタマイズしてみてほしい。最初は難しく感じるかもしれないが、この「オブジェクトを操る感覚」さえ掴めれば、君はもう単なるVBAユーザーではない。プロジェクトの構造を設計するアーキテクトだ。
ここをクリアした君なら、次はもっと複雑なWBSの自動生成や、リソース配分の最適化アルゴリズムも書けるようになるはずだ。応援しているよ。何か詰まったら、いつでも戻っておいで。
