こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアなら、一度はこう思うはずです。
「このプレゼン、誰がいつマクロを動かしたのか、ログを追いたい。でも、わざわざ外部のテキストファイルやデータベースを管理するのは面倒だ……」と。
外部に依存せず、プレゼンファイルの中に「見えない足跡」を刻み込む。これこそが、堅牢なシステムを作る第一歩です。今日は、PowerPointの心臓部である『CustomDocumentProperties』を使い、ドキュメント自体に履歴を刻印する手法を伝授しましょう。
—
1. なぜ「CustomDocumentProperties」なのか?
マクロの記録から脱却し、中級者へステップアップする鍵は「オブジェクトの寿命(ライフサイクル)」を理解することです。
通常、ログを外部に出すと「ファイルパスが変更された」「移動時にログが消えた」といったトラブルが起きます。しかし、`CustomDocumentProperties`はプレゼンテーションファイルそのものに付随する「メタデータ」です。ファイルがどこへ移動しようとも、誰にメールで送られようとも、履歴は決して消えません。まさに、「自己完結型監査システム」なのです。
—
2. 実装の設計図:ログ刻印ロジック
今回作成するのは、以下の処理を行うコードです。
1. 現在の日時とユーザー名を取得する。
2. ファイルに「History」というプロパティがあるか確認する。
3. あれば追記、なければ新規作成する。
究極の「履歴刻印」コード
このコードを標準モジュールに貼り付けてください。
Option Explicit
‘ プレゼンに処理履歴を刻むメインプロシージャ
Public Sub RecordExecutionLog()
Dim pptPres As Presentation
Dim customProps As DocumentProperties
Dim logPropName As String
Dim logEntry As String
Set pptPres = ActivePresentation
logPropName = “LastExecutionLog”
‘ 実行時の情報を生成
logEntry = “[” & Now & “] Executed by: ” & Environ(“USERNAME”)
‘ プロパティの集合体を取得
Set customProps = pptPres.CustomDocumentProperties
‘ 既存のログがあるか確認し、あれば改行して追記、なければ新規作成
On Error Resume Next ‘ プロパティが存在しないエラーを回避
Dim existingLog As String
existingLog = customProps(logPropName).Value
If Err.Number <> 0 Then
‘ 初回作成時
customProps.Add Name:=logPropName, LinkToContent:=False, _
Type:=msoPropertyTypeString, Value:=logEntry
Else
‘ 二回目以降は追記
customProps(logPropName).Value = existingLog & vbCrLf & logEntry
End If
On Error GoTo 0
MsgBox “ログを刻印しました。” & vbCrLf & logEntry, vbInformation
End Sub
—
3. コードの「魂」を読み解く:知っておくべき3つのポイント
① `Environ(“USERNAME”)` の魔法
`Environ`関数は、Windowsの環境変数にアクセスします。「誰が実行したか」をOSレベルで取得するため、ユーザーがいちいち名前を入力する必要はありません。これが自動化の鉄則です。
② `On Error Resume Next` の正しい使い方
プロパティが存在しないとき、`customProps(logPropName).Value` を参照するとエラー(実行時エラー 5)が飛びます。
「エラーが出たら無視して処理を継続する」という戦略をとることで、「存在しなければ作る、存在すれば書き換える」という柔軟な制御を実現しています。
③ なぜ「不可視」なのか
このデータは、[ファイル] > [情報] > [プロパティ] > [詳細プロパティ] > [ユーザー設定] タブに保存されます。一般ユーザーは存在に気づかないため、データの整合性が保たれやすく、非常にクリーンな管理が可能です。
—
4. 陥りやすい「罠」と対策
初心者がやりがちな失敗を先回りして教えます。
- 「ファイルが保存されていない」問題
`CustomDocumentProperties`は、ファイルを保存しないとディスクに書き込まれません。処理の最後に `ActivePresentation.Save` を入れるべきか検討してください。ただし、勝手に上書きするのはリスキーなので、運用ルールに合わせて判断を。
- ログが肥大化する
数千回実行されると、プロパティのサイズ制限(最大値はあるものの現実的にはほぼ問題なし)に引っかかる可能性があります。もしログが巨大化しそうなら、最新の10件だけを残すような「スライディングウィンドウ」アルゴリズムを導入しましょう。
—
最後に:エンジニアとしてのマインドセット
プログラミングの醍醐味は、ただ動くものを作ることではなく、「後からメンテナンスする誰か(あるいは未来の自分)」を助ける仕組みを作ることです。
今回学んだ「プレゼンファイル自体に履歴を刻む」という手法は、まさにその第一歩。これができるようになったあなたは、もう「マクロの記録」に頼るだけの初心者ではありません。
ここをクリアすれば、PowerPoint VBAは単なる「スライド作成ツール」から、「知的なドキュメント管理エンジン」へと姿を変えます。
さあ、あなたのプレゼンファイルに、最初の「足跡」を刻み込んでみてください。何かわからないことがあれば、いつでもまた聞きに来てくださいね。応援しています!
