プレゼンに「記憶」を宿せ:CustomDocumentPropertiesで実現する堅牢な監査ログシステム
業務自動化の現場において、最も避けたいのは「誰が、いつ、どのバージョンのデータで処理したか分からない」というブラックボックス化だ。
外部のテキストファイルやExcelにログを吐き出す手法は、ファイルパスの依存、共有権限の問題、あるいはファイル自体の移動によるリンク切れという「保守の地雷」を常に抱えている。
本稿では、PowerPointファイルそのものにメタデータとして履歴を刻み込む、極めてクリーンかつ堅牢なアーキテクチャを伝授する。
—
なぜ「外部ログ」ではなく「内部プロパティ」なのか
PowerPointの`CustomDocumentProperties`を利用する最大の利点は、「データとメタデータの完全な一体化」にある。
- ポータビリティ: ファイルをメールで送ろうが、クラウドに移動しようが、ログは不可分として追従する。
- 不可視性: ユーザーが誤ってログを消去するリスクが極めて低い。
- 低負荷: 外部ファイルへのI/O処理を排除できるため、ネットワークストレージ上での動作も安定する。
—
設計の勘所:ログ蓄積のベストプラクティス
単なる上書き保存では、履歴は「最新の1行」しか残らない。履歴を蓄積するには、既存の文字列を取得し、それに新規ログを連結して再格納する手法をとる。
実装上の注意点
1. プロパティの存在確認: 初回実行時にはプロパティが存在しないため、エラーハンドリングが必須となる。
2. 文字数制限: `CustomDocumentProperties`には格納可能な最大長(約255文字程度)という制約がある。膨大なログを溜め込む用途には向かない。あくまで「直近の重要操作履歴」を保持するためのものと割り切るべきだ。
3. パフォーマンス: 大規模なループ処理の中で頻繁に読み書きするとファイルI/Oのボトルネックになる。保存時、あるいは処理の完了直前に一度だけ書き込む設計が定石だ。
—
【実務コード】堅牢なログ記録モジュール
以下のコードは、エラーハンドリングを完備した、そのままプロダクション環境へ投入可能なモジュールだ。
‘ ———————————————————————-
‘ 処理名: WriteExecutionLog
‘ 概要 : プレゼンテーションに実行ログを追記する
‘ 引数 : strMessage – 記録したいアクション内容
‘ ———————————————————————-
Public Sub WriteExecutionLog(ByVal strMessage As String)
Dim pptPres As Presentation
Dim customProps As DocumentProperties
Dim propName As String
Dim logEntry As String
Set pptPres = ActivePresentation
Set customProps = pptPres.CustomDocumentProperties
propName = “LastExecutionLog”
‘ タイムスタンプ付きのログ文字列を生成
logEntry = “[” & Now & “] User: ” & Environ(“USERNAME”) & ” | ” & strMessage & vbCrLf
On Error Resume Next
‘ プロパティの存在チェック
Dim existingVal As String
existingVal = customProps(propName).Value
If Err.Number <> 0 Then
‘ 初回作成時
customProps.Add Name:=propName, LinkToContent:=False, _
Type:=msoPropertyString, Value:=logEntry
Else
‘ 追記更新(既存データと結合)
‘ 文字数制限を考慮し、古いログを適宜カットする等のロジックをここに加えるのがベター
customProps(propName).Value = logEntry & existingVal
End If
On Error GoTo 0
Debug.Print “ログを記録しました: ” & logEntry
End Sub
—
運用フェーズへの提言
このシステムを導入する際、開発者として意識すべきは「開発者以外への配慮」だ。
1. プロパティの可視化: ユーザーは「ファイル」→「情報」→「プロパティ」からこのデータを確認できる。ここに「操作履歴」という項目が見えるだけで、ユーザーのセキュリティ意識は向上する。
2. 限界を知る: もしログが数千件に及ぶような要件であれば、それはVBAの領域ではない。素直にSharePointリストやSQL Server等のデータベースへ移行するトリガーとしてこの設計を利用せよ。
3. 自動化のフック: `Application_PresentationBeforeSave` イベントと組み合わせれば、「保存するたびに自動的に署名を刻む」といった高機能な監査システムへと拡張が可能だ。
まとめ:エンジニアの美学
「動くもの」を作るのは初心者でもできる。しかし、「壊れず、汚さず、後から追跡可能な仕組み」を設計することこそが、プロフェッショナルな業務自動化エンジニアの仕事だ。
このコードをあなたのプレゼンテーションに組み込み、属人化という名の負債を少しずつ返済していってほしい。質問があればいつでも歓迎する。現場からは以上だ。
