【テクニカル・上級編】【中級者】プレゼンテーションの「カスタムプロパティ」に承認ステータスを埋め込み、ステータスに応じて保存先フォルダを自動で振り分けるワークフロー支援マクロ – PowerPoint VBA解析バイブル

スポンサーリンク

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は単なるマクロ言語ではない。それは、強固なエンタープライズシステムへ至るための、最も身近なプロトタイピング環境なのだ。

諸君、コードを磨け。そして現場を変えろ。それがエンジニアの矜持だ。

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