【入門編】【中級者向け】プロジェクトの「保存」イベントをフックして、変更履歴をCSVログとして外部出力する監査機能 – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「足跡」を刻む:VBAで実現する自動監査ログシステム

こんにちは。現場で泥臭い自動化と格闘し続けている皆さんに、少しだけ「プロの視点」を共有したいと思います。

MS Projectの運用において、最も恐ろしいのは「誰が、いつ、何を保存したのか分からない」という状態です。特に複数人で共有するプロジェクトファイルでは、意図しない変更が紛れ込むリスクが常にあります。

今回は、Projectの「保存」イベントをフックして、自動的に変更履歴を外部CSVに書き出す「監査ログシステム」を構築します。これを実装すれば、あなたのプロジェクト管理は一段上の「統制」を手に入れることができます。

1. なぜ「イベント駆動」なのか?

「マクロの記録」から脱却した皆さんにまず知ってほしいのが、イベントプロシージャの重要性です。
通常のVBAは、ボタンを押したときに動きます。しかし、今回の仕組みは「保存ボタンが押された瞬間に、システムが勝手に割り込む」というもの。

Project VBAには `Project_BeforeSave` という強力なイベントが用意されています。これを使えば、ユーザーが保存を意識することなく、確実にログを残すことができます。

2. 実装の舞台:ThisProjectモジュール

Project VBAのコードは、標準モジュールではなく `ThisProject` モジュールに書くのが鉄則です。プロジェクト固有のイベントを受け取る「窓口」はここしかないからです。

監査ログ実装コード

以下のコードを、ProjectのVBAエディタ(Alt + F11)で `ThisProject` モジュール内に記述してください。

‘ プロジェクトの保存イベントを監視するメインルーチン
Private Sub Project_BeforeSave(ByVal pj As Project)
Dim filePath As String
Dim fileNum As Integer
Dim logMessage As String

‘ ログファイルの出力先パス(適宜環境に合わせて変更してください)
filePath = “C:\ProjectLogs\AuditLog.csv”

‘ ファイル番号を取得(競合を防ぐための作法)
fileNum = FreeFile

‘ 記録内容の生成(日付、ユーザー名、プロジェクト名)
logMessage = Now & “,” & Environ(“USERNAME”) & “,” & pj.Name & “,Saved”

‘ 追記モード(Append)でファイルを開く
Open filePath For Append As #fileNum
Print #fileNum, logMessage
Close #fileNum

‘ ユーザーへのフィードバック(必要に応じて削除してください)
Debug.Print “監査ログを出力しました: ” & logMessage
End Sub

3. このコードが持つ「プロの作法」

この短いコードには、実務でトラブルを防ぐための工夫が詰まっています。

  • FreeFileの活用: 固定の番号(例:#1)を使わず `FreeFile` を使うことで、他のアドイン等とファイルハンドルの競合を起こさないようにしています。
  • Appendモード: `Open … For Output` にすると上書きされてしまいます。ログは過去の記録が重要ですので、必ず `Append`(追記)を使います。
  • Environ関数: `Environ(“USERNAME”)` を使うことで、Windowsにログインしているユーザー名を自動取得します。これにより「誰が保存したか」を特定できます。

4. 陥りやすい「罠」と対策

初心者がやりがちな失敗を、あらかじめ潰しておきましょう。

罠1:フォルダが存在しない

`C:\ProjectLogs\` というフォルダが事前に作られていないと、`Open` ステートメントで実行時エラーが発生します。
対策: コード内で `Dir` 関数を使ってフォルダの存在を確認し、なければ `MkDir` で作成する処理を追加するのが安全です。

罠2:権限の問題

会社の共有サーバー等に保存する場合、書き込み権限がないとエラーになります。エラーハンドリング(`On Error Resume Next` 等)を適切に入れ、ログが書けなくても「保存自体は失敗しない」ように設計するのがコツです。

5. 次なるステップへ

このシステムを導入すると、単なるログ以上のことが可能になります。
例えば、`pj.BuiltinDocumentProperties(“Last Author”)` をログに含めれば、より詳細な追跡が可能です。

「プログラムは書くことよりも、書いた後にどう管理されるか」

これが、大規模プロジェクトを完遂させるアーキテクトの視点です。まずはこの小さなコードを自分のプロジェクトに組み込んで、その効果を肌で感じてみてください。

「保存」という当たり前の操作に、情報の信頼性を付与する。これこそが、VBAによる業務自動化の醍醐味です。また次のステップでお会いしましょう!

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