Project VBAを掌握する:依存関係の「監査ログ」をタスクメモに刻む極限の実装術
プロジェクトマネジメントにおいて、タスク間の依存関係(Predecessors)は、プロジェクトという巨大な有機体の神経系そのものだ。しかし、多くの現場でその「設定理由」はブラックボックス化している。
「なぜこのタスクは完了していなければならないのか?」
後任のPMや監査担当者がこの問いに直面したとき、VBAによる自動化でその痕跡を「タスクメモ」に残す仕組みは、プロジェクトの透明性を担保する最後の砦となる。今回は、Project VBAの深淵に触れ、オブジェクトのライフサイクルを制御しながら、実用的な監査ログを刻み込む技術を伝授する。
—
1. アーキテクチャの設計思想:なぜ「メモ」なのか
Projectの`Task.Notes`フィールドは、一見すると単なるテキスト領域だが、ここを「構造化された監査ログの永続化場所」として利用する。
外部データベースやExcelへの書き出しは、タスクの削除や移動によって整合性が破綻しやすい。タスクオブジェクト自身にログを抱え込ませることで、「オブジェクトと履歴の不可分性」を保証する。これが、保守性を極めたアーキテクトの答えだ。
—
2. 実装の要諦:オブジェクトの解放とメモリ管理
VBAにおける最大の敵は、暗黙的なオブジェクトの生成と破棄の失敗によるメモリリークだ。特に`Project.Tasks`へのアクセスは重い。`Set`したオブジェクトは、スコープを抜ける前に必ず`Nothing`を代入し、メモリプールを綺麗に保つことが、長期間稼働するシステムにおける鉄則である。
【極限のコード例】監査ログ追記ロジック
‘ @description 依存関係設定時に、その論理的根拠をタスクメモに追記する
‘ @param targetTaskID 対象のタスクID
‘ @param reason 依存関係設定の理由
Public Sub AppendAuditLogToTask(ByVal targetTaskID As Long, ByVal reason As String)
Dim proj As Project
Dim tsk As Task
Dim logEntry As String
Set proj = ActiveProject
‘ オブジェクトの明示的取得
Set tsk = proj.Tasks(targetTaskID)
If tsk Is Nothing Then Exit Sub
‘ 監査ログの整形(ISO 8601準拠のタイムスタンプ)
logEntry = vbCrLf & “— [Audit Log: ” & Now & ” | User: ” & Environ(“USERNAME”) & “] —” & vbCrLf & _
“Action: Predecessor Constraint Set” & vbCrLf & _
“Reason: ” & reason & vbCrLf
‘ メモの更新
‘ 既存のメモを保持しつつ、追記を行う(オーバーフロー防止のため適宜文字数制限を設けること)
tsk.Notes = tsk.Notes & logEntry
‘ メモリの解放
Set tsk = Nothing
Set proj = Nothing
End Sub
—
3. Windows APIによる「操作の不可視化」と安定性
大規模なプロジェクトファイルでは、`Task.Notes`への更新処理が画面の再描画やイベントループを阻害することがある。Windows APIの`LockWindowUpdate`を併用することで、更新処理中のチラつきを抑え、パフォーマンスの低下を最小限に留めることができる。
‘ Windows APIの宣言
If VBA7 Then
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hwndLock As LongPtr) As Long
Else
Private Declare Function LockWindowUpdate Lib “user32” (ByVal hwndLock As Long) As Long
End If
‘ 処理の高速化と安定化
Public Sub SafeUpdateTask(targetID As Long, reason As String)
LockWindowUpdate Application.hWnd
On Error Resume Next
AppendAuditLogToTask targetID, reason
On Error GoTo 0
LockWindowUpdate 0 ‘ 解除
End Sub
—
4. 伝説的エンジニアからの忠告:レガシーとの共存
この手法を導入する際、最も注意すべきは「既存のメモ運用との衝突」だ。現場には既に運用ルールが存在するはずである。
- バリデーションの徹底: `tsk.Notes`を読み込み、既に同一の変更理由が記録されていないかチェックするサニタイズ処理を挟むこと。
- 例外処理: プロジェクトファイルが読み取り専用で開かれている場合、あるいはタスクが「サマリータスク」である場合の挙動を明確に定義すること。
- API連携の未来: 将来的にはこのメモ内容をPower Automate経由でDataverseやSQL Serverへ吸い上げ、BIツールで可視化するフェーズへ移行せよ。
結びに代えて
VBAはレガシーではない。使い手次第で、それはProjectという巨大なシステムの深層に潜り込むための「精密なメス」となる。
タスクのメモに刻まれる一行のログは、単なるテキストではない。それは、プロジェクトがどのような意思決定を経て現在に至ったかを示す、エンジニアの誇りと責任の記録だ。このコードを、君の現場の「信頼の礎」にしてほしい。
