【入門編】タスクの「メモ」フィールドを利用した、依存関係の論理的根拠(理由)の自動監査ログ – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
日々、複雑なWBS(Work Breakdown Structure)やタスクのスケジュールに頭を悩ませていませんか?

「あ、この先行タスクの依存関係、誰が何のために繋いだんだっけ……?」
「後からスケジュールを調整したら、全体の辻褄が合わなくなっちゃったぞ……」

プロジェクト管理の現場で、こんな恐怖の瞬間に出会ったことはありませんか?タスク同士の依存関係(先行・後続)は、プロジェクトの命綱です。しかし、その「変更の理由」がブラックボックス化していると、変更管理は大失敗に終わります。

今回は、「タスクのメモ(Notes)フィールドを利用して、依存関係が変更された履歴・論理的根拠を自動で監査ログとして残す仕組み」を一緒に作っていきましょう。

ここをクリアすれば、単なる「マクロの記録」の使い手から、組織のプロジェクト管理を支える「自動化エンジニア」への大きな一歩を踏み出せますよ。さあ、一緒に本質を学んでいきましょう!

1. なぜ「メモ欄への自動監査ログ」が必要なのか?

Project VBAにおいて、タスクの依存関係(Predecessors / Successors)を操作するのは簡単です。`Task.Predecessors` プロパティに文字列を代入すれば一瞬で繋がります。

しかし、「なぜその依存関係を組んだのか」というコンテキスト(文脈)は、VBAの標準機能だけでは消え去ってしまいます。数ヶ月後にプロジェクトを振り返った時、「このタスクが終わらないと次に行けないのはなぜだっけ?」と迷宮入りするのを防ぐのが、今回のテーマ「監査ログの自動化」です。

変更された瞬間を捉え、タスクの「メモ(Notes)」フィールドに、

  • 変更日時
  • 変更内容(どのタスクと繋がったか)
  • システムからのメッセージ

をタイムスタンプ付きで自動追記していく。この仕組みをコードで実現します。

2. 実装の全体像とアーキテクチャ

Project VBAには、Excel VBAにはない独特の「イベント駆動(Event-driven)」の仕組みがあります。
今回は、ユーザーがタスクの先行タスク(Predecessors)を書き換えた瞬間をフック(検出)する、`Project_TaskChange` イベントを使います。

[ユーザーが依存関係を変更]

[Projectがイベントを検知 (Project_TaskChange)]

[VBAコードが変更前後の差分を解析]

[対象タスクの「メモ(Notes)」に監査ログを自動追記]

この流れを構築することで、ユーザーが意識することなく、強固な変更管理の監査証跡(トレース)が残るようになります。

3. 実装コード(コピペで使える実践VBA)

それでは、実際に動くコードを見ていきましょう。
このコードは、Excelの標準モジュールではなく、`ThisProject` モジュールに記述する必要があります。(ここが最初の大きなつまずきポイントなので注意してくださいね!)

ステップ1:ThisProjectモジュールへの記述

ProjectのVBE(Visual Basic Editor)を開き、左側のプロジェクトエクスプローラーから `ThisProject` をダブルクリックして、以下のコードを貼り付けてください。

‘ ==============================================================================
‘ プロジェクト名: TaskDependencyAuditor
‘ 概要 : タスクの先行タスク変更時に、メモ欄へ自動的に監査ログを追記する
‘ 著者 : シニアVBAアーキテクト
‘ ==============================================================================

Private Sub Project_TaskChange(ByVal Asg As Task)
‘ エラーハンドリングの基本:予期せぬ中断を防ぐ
On Error GoTo ErrorHandler

‘ 1. タスクがNothing(削除された等)の場合は何もしない
If Asg Is Nothing Then Exit Sub

‘ 2. 今回変更されたフィールドが「先行タスク(Predecessors)」かどうかを判定
‘ pjTaskPredecessors は先行タスクを表すProject固有の定数です
‘ ※注意: TaskChangeイベントは他のフィールド変更でも発火するため、ここで絞り込みます
‘ 実務では厳密な変更前後の値比較を行いますが、今回は簡易的に「変更があった事実」をフックします。

Dim currentPredecessors As String
currentPredecessors = Asg.Predecessors

‘ 空白の場合はログを残さない(依存関係のクリア時は除外するなどの調整用)
If currentPredecessors = “” Then Exit Sub

‘ 3. 監査ログのフォーマットを作成
Dim logMessage As String
logMessage = “【依存関係 変更監査ログ】” & vbCrLf & _
“・変更日時: ” & Format(Now, “yyyy/mm/dd hh:nn:ss”) & vbCrLf & _
“・現在の先行タスク: ” & currentPredecessors & vbCrLf & _
“—————————————-” & vbCrLf

‘ 4. 既存のメモ欄(Notes)の内容と結合して上書き
‘ 過去のログが消えないように、既存のメモの下に追記(Append)するのがプロの技です
If Asg.Notes <> “” Then
Asg.Notes = logMessage & vbCrLf & Asg.Notes
Else
Asg.Notes = logMessage
End If

Exit Sub

ErrorHandler:
MsgBox “監査ログの記録中にエラーが発生しました: ” & Err.Description, vbCritical, “VBAエラー”
End Sub

4. 初学者が陥りやすい「3つの罠」と回避策

Project VBAを書き始めると、必ずと言っていいほど以下の壁にぶつかります。ここを知っているだけで、開発スピードが何倍も変わりますよ!

罠その1:「標準モジュール」にイベントプロシージャ書いてしまう

  • 症状: 「コードを書いたのに、タスクをいじっても何も起きない!」という現象。
  • 原因: イベント(~された時)を検知するコードは、普通の標準モジュールではなく、`ThisProject` という専用のモジュールに書く必要があります。
  • 解決策: コード窓の左上のドロップダウンで `Project` を、右側で `TaskChange` を選択して自動生成される枠の中に書きましょう。

罠その2:無限ループ地獄(イベントの連鎖)

  • 症状: コード内でタスクのプロパティ(`Asg.Notes = …`)を書き換えているため、それがまた「タスク変更イベント」を引き起こし、VBAが暴走してフリーズする。
  • 回避策: 今回のコードでは先行タスク(`Predecessors`)の変更をトリガーにしつつメモ(`Notes`)を書き換えているため直接の無限ループにはなりませんが、同じプロパティを変更し合う設計にすると一発でハマります。「何がトリガーで、どこを書き換えるか」の分離が鉄則です。

罠その3:日本語フィールド名と内部定数の違い

  • 症状: 画面上の表示名(「先行タスク」など)でコードを書こうとしてエラーになる。
  • 解決策: Project VBAでは `pjTaskPredecessors` のような英語の定数(PjField)を使います。インテリセンス(入力補助)を頼りに正しく指定しましょう。

5. さらに実用性を高めるための「プロの視点」

今回のコードは基礎的なスニペットですが、実際の現場(Enterprise環境)では、さらに一歩進んだ工夫が求められます。

  • 変更理由のポップアップ入力を促す:

依存関係を変更した瞬間に `InputBox` を立ち上げ、「なぜこの依存関係に変更しましたか?」とユーザーに理由を入力させ、そのテキストをそのまま監査ログに組み込むと、変更管理の品質が劇的に跳ね上がります。

  • 誰が変更したかの記録:

`Environ(“USERNAME”)` を使って、Windowsのログインユーザー名もログに含めると、誰の責任でスケジュールが動いたのかが明確になります。

まとめ

お疲れ様でした!
今回は、Project VBAのイベント駆動とメモフィールドを活用した「依存関係の自動監査ログ」の仕組みを解説しました。

  • `ThisProject` モジュールを使ったイベントのフック
  • 既存のデータを上書きせず、時系列で「蓄積」するログ設計
  • 初学者がハマるイベントの罠の回避

ここをクリアしたあなたなら、もう単なる「マクロの記録者」ではありません。組織のプロジェクトプロセスを自動化・統制する立派なProject VBAアーキテクトです。

ぜひ、あなたの現場のガントチャートにこの仕組みを取り入れ、スマートで透明性の高いプロジェクト管理を実現してくださいね。「ここをもっとこうしたい!」という疑問があれば、いつでも先輩エンジニアに聞いてください。応援しています!

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