PowerPoint VBAを掌握せよ:カスタムプロパティを軸にした「承認ステータス連動型」自動アーカイブアーキテクチャ
現場の泥臭い自動化に命を捧げる諸君、ようこそ。
「VBAは時代遅れ」と嘯く連中には放っておけばいい。我々が対峙しているのは、レガシーという名の巨大な資産と、それを動かし続ける現場の業務フローだ。PowerPointのプロパティを単なる「メタデータ」と侮るなかれ。それは、ドキュメントのライフサイクルを制御する「脳」となり得る。
本稿では、プレゼンテーションのカスタムドキュメントプロパティをフックし、承認ステータスに基づいて自動でルーティングを行う、堅牢なワークフロー基盤の構築手法を伝授する。
—
1. なぜ「カスタムプロパティ」なのか?
ファイル名に「_承認済」と付けるような原始的な管理は、今すぐ捨て去るべきだ。ファイル名はOSのインデックスや検索エンジンの支配下にある。対して、`CustomDocumentProperties`は、ドキュメントの「属性」として、メタデータ層に強固に保持される。
これを活用することで、ファイル名を変更することなく、ステータスに応じた論理的な分離を実現できる。
2. 核心:ステータス読込・書込の実装
まずは、プロパティを制御する抽象化層を作成する。存在しないプロパティに対するエラーハンドリングは、堅牢なシステムを構築する上での基本中の基本だ。
‘ —————————————————————-
‘ 概要:カスタムドキュメントプロパティの安全な取得と設定
‘ —————————————————————-
Public Function GetCustomProp(ByVal ppt As Presentation, ByVal propName As String) As String
On Error Resume Next
GetCustomProp = ppt.CustomDocumentProperties(propName).Value
If Err.Number <> 0 Then GetCustomProp = “未設定”
On Error GoTo 0
End Function
Public Sub SetCustomProp(ByVal ppt As Presentation, ByVal propName As String, ByVal propValue As String)
Dim props As Office.DocumentProperties
Set props = ppt.CustomDocumentProperties
On Error Resume Next
props(propName).Value = propValue
If Err.Number <> 0 Then
‘ プロパティが存在しない場合は新規作成
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeString, Value:=propValue
End If
On Error GoTo 0
End Sub
3. 承認連動型自動アーカイブのメカニズム
ステータスが「承認済」に切り替わった瞬間、ファイルを別フォルダへ移動させる。ここで重要なのは、「保存と移動の分離」だ。単に`SaveAs`するだけでなく、元のファイルが残るリスクを排除する設計が求められる。
Public Sub ArchivePresentation()
Dim ppt As Presentation
Set ppt = ActivePresentation
‘ ステータス判定
If GetCustomProp(ppt, “ApprovalStatus”) <> “承認済” Then
MsgBox “承認済みではありません。”
Exit Sub
End If
‘ 保存先の定義
Dim savePath As String
savePath = “C:\Shares\Approved\” & ppt.Name
‘ メモリの最適化:保存後にオブジェクトを解放しつつ、プロセスを閉じるか判定
ppt.SaveCopyAs savePath
‘ 成功確認後に元のファイルを削除(必要に応じて)
‘ Kill ppt.FullName
‘ オブジェクトの明示的解放(VBAにおいては重要)
Set ppt = Nothing
MsgBox “アーカイブが完了しました。”
End Sub
4. 伝説的アーキテクトからの助言:パフォーマンスと保守
オブジェクトのライフサイクル管理
VBAはガベージコレクションが脆弱だ。特に`Application`や`Presentation`オブジェクトを多用する場合、`Set = Nothing`を怠ると、ExcelやPowerPointのバックグラウンドプロセスが残り続け、メモリリークの温床となる。常にスコープの終了時には明示的な破棄を徹底せよ。
Windows APIの活用(ファイルロック対策)
共有フォルダへの移動時、他者がファイルを開いているとエラーが発生する。この際、単なる`On Error`で逃げるのではなく、`kernel32`の`CreateFile` APIを呼び出し、`FILE_SHARE_READ`等を確認することで、先行してロック状態を検知する設計に昇華させよ。
レガシー環境との共存
このスクリプトを「リボン」から実行させるか、あるいは`DocumentBeforeSave`イベントにフックさせるかは諸君の設計次第だ。しかし、システム連携を考えるのであれば、「イベントドリブンではなく、あえて明示的なUI制御(ボタン押下)」を推奨する。自動保存は予期せぬ挙動を招く。人間が「確定」を押すプロセスを挟むことこそ、業務上の統制(ガバナンス)だ。
—
結びに代えて
自動化の極意は、コードの行数ではなく、「いかに現場の失敗を許容しない設計にするか」にある。
プロパティにステータスを埋め込み、それをメタデータとして扱うこの手法は、将来的にはAzureやSharePointのAPI連携へと容易に拡張できる。VBAは単なるマクロ言語ではない。それは、強固なエンタープライズシステムへ至るための、最も身近なプロトタイピング環境なのだ。
諸君、コードを磨け。そして現場を変えろ。それがエンジニアの矜持だ。
