【テクニカル・上級編】【実務中級】Presentation.CustomDocumentPropertiesを使って、プレゼンファイル自体に「マクロの実行ログ(実行日時、実行者、処理内容)」を隠しデータとして自動蓄積する監査システム – PowerPoint VBA解析バイブル

スポンサーリンク

【PowerPoint VBA】プレゼンに「記憶」を刻む:CustomDocumentPropertiesを用いた監査ログ実装の深淵

PowerPointというキャンバスは、往々にして「情報のゴミ箱」と化す。誰が、いつ、何をしたのか。その履歴が失われたプレゼンファイルは、管理不能な負債である。

今回は、プレゼンファイル自体にメタデータを埋め込み、透過的に監査ログを蓄積するアーキテクチャを解説する。これは単なるマクロではない。ファイルというコンテナに「自己言及的な歴史」を持たせる、エンジニアリングの所作である。

1. 概念:なぜ `CustomDocumentProperties` なのか

多くのエンジニアがログを外部テキストやデータベースに逃がそうとする。しかし、共有サーバーやクラウドストレージを介する場合、ファイルとログが分離されると即座に整合性が破綻する。

`Presentation.CustomDocumentProperties` を活用せよ。これはOffice Open XML (OOXML) の構造内に保存されるため、ファイル単体で運搬可能であり、かつ一般的なユーザーには視認されにくい。この「不可視の履歴」こそが、真の監査システムを構築する鍵だ。

2. 実装:ログ蓄積アーキテクチャ

単に文字列を追加するだけでは、メモリリークとパフォーマンス低下を招く。プロパティの存在確認、存在しない場合の初期化、そしてログの追記。この一連のライフサイクルを安全に回すためのコードが以下だ。

Option Explicit

‘ 監査ログを埋め込むためのエントリーポイント
Public Sub AppendAuditLog(ByVal actionDetail As String)
Dim pptPres As Presentation
Dim customProps As DocumentProperties
Dim logProp As DocumentProperty
Dim currentLog As String

Set pptPres = ActivePresentation
Set customProps = pptPres.CustomDocumentProperties

‘ ログ用プロパティ名
Const PROP_NAME As String = “AuditHistory”

‘ プロパティの存在確認と取得
On Error Resume Next
Set logProp = customProps.Item(PROP_NAME)
If Err.Number <> 0 Then
‘ 初回実行:プロパティが存在しない場合は新規作成
Set logProp = customProps.Add(Name:=PROP_NAME, LinkToContent:=False, _
Type:=msoPropertyTypeString, Value:=””)
End If
On Error GoTo 0

‘ 実行日時と環境情報の取得(Win32 APIを介したユーザー名取得を推奨)
currentLog = logProp.Value
currentLog = currentLog & Format(Now, “yyyy-mm-dd hh:nn:ss”) & ” | ” & _
Environ(“USERNAME”) & ” | ” & actionDetail & vbCrLf

‘ メモリ最適化:古いプロパティ値を更新し、オブジェクトを解放
logProp.Value = currentLog

‘ 明示的解放
Set logProp = Nothing
Set customProps = Nothing
Set pptPres = Nothing
End Sub

3. シニアエンジニアが意識すべき「深淵」

Windows API によるアイデンティティの確定

`Environ(“USERNAME”)` は極めて脆弱だ。ユーザーが環境変数を偽装することは容易である。真の監査システムを求めるなら、Windows API `GetUserNameEx` を使用し、Active Directoryのログオン情報を直接叩くべきだ。

‘ 抜粋:より堅牢なユーザー名取得
Private Declare PtrSafe Function GetUserNameEx Lib “secur32.dll” Alias “GetUserNameExA” _
(ByVal NameFormat As Long, ByVal lpNameBuffer As String, ByRef nSize As Long) As Long

パフォーマンスとメモリ管理

`CustomDocumentProperties` への書き込みは、実質的にOOXMLファイルの `docProps/custom.xml` の更新を伴う。頻繁な書き込みはI/Oボトルネックを生むため、ログはメモリ上のバッファに保持し、`PresentationBeforeSave` イベントなどのタイミングで一括フラッシュする設計が望ましい。

4. アーキテクトからの提言:ガバナンスの維持

このシステムを導入する際、最も障壁となるのは「マクロ無効化」というレガシーな防壁である。
もしこれが社内標準ツールであれば、以下の手法を検討せよ:

1. VBAプロジェクトのデジタル署名: 信頼できる発行元として証明書を配布し、マクロの実行環境を強制する。
2. イベントハンドラの活用: `Application.PresentationBeforeSave` にこのロジックを組み込むことで、ユーザーの意識を介さずとも「保存のたびに誰が触ったか」が記録される強制監査環境が完成する。

結論:コードは「事実」を語るべきである

VBAはレガシーと言われ続けている。しかし、その環境でいかに堅牢な追跡機構を構築できるかは、設計者の知性と執念次第だ。ファイルを開いた瞬間、そのファイルが自らの歴史を語り出す。そんなシステムこそが、混沌とした企業内のドキュメント管理を救う唯一の道である。

次は、このログ領域を読み取り、Power BIで可視化する自動化パイプラインの話をしよう。準備はいいか。

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