【入門編】【型安全なメタデータ管理】”Presentation.CustomDocumentProperties”のデータ型(日付・数値・真偽値)を厳密にハンドリングするカスタムプロパティ操作ライブラリ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!パワポ職人として日々の資料作成や自動化に奮闘している皆さん、順調ですか?

「マクロの記録」を使ってボタン一つで図形が動くようになった!……感動の瞬間ですよね。でも、いざ実務で本格的なツールを作ろうとしたとき、こんな壁にぶつかったことはありませんか?

  • 「このプレゼン、どのデータベースの案件IDと紐づいていたんだっけ?」
  • 「担当者名や進捗ステータスをファイルの中に直接持たせたいけれど、スライドの表紙に文字として書いておくのはダサいし、消されそう……」
  • 「ファイルのプロパティに値を保存したはいいものの、取り出すときに文字化けしたり、型が一致しなくてエラーで止まったりする!」

分かります。PowerPointのファイル自体に「隠しデータ(メタデータ)」を持たせる機能として `CustomDocumentProperties` が用意されているのですが、こいつがなかなかの曲者(くせもの)なんです。適当にコードを書くと、日付が文字列に化けたり、存在しないキーを叩いて容赦なくVBAがクラッシュしたりします。

今回は、そんな地雷を踏み抜かないための「型安全なカスタムプロパティ操作ライブラリ」の作り方を、優しく、そしてプロの知見をたっぷり交えて解説していきます。

ここをクリアすれば、あなたも単なる「マクロ記録の卒業生」から「ワンランク上の自動化エンジニア」への仲間入りです。一緒にバッチリ押さえていきましょう!

1. なぜ `CustomDocumentProperties` なのか?

スライドの中にテキストボックスを作って、「案件ID: 12345」と書いて隠しておく……。自動化の初期段階ではよくある手法ですが、これはメンテナンス地獄への片道切符です。誰かがうっかりそのテキストボックスを削除したり、フォントを変えたりしただけで、プログラムは一巻の終わりを迎えます。

PowerPointには、プレゼンテーションファイルそのものにデータを埋め込む「組み込み/カスタム ドキュメント プロパティ」という仕組みが用意されています。

  • スライドの見た目に影響しない(ユーザーが間違えて消すリスクがゼロ)
  • ファイルと一緒に移動する(メールで送っても、サーバーに保存してもデータが消えない)
  • 外部プログラムやExcel、Access、データベースと連携しやすい

まさに、社内システムとPowerPointを繋ぐ「秘密の架け橋」と言えます。

2. 伝統芸能「型エラー」の恐怖と、その正体

さて、この `CustomDocumentProperties` ですが、大きな弱点があります。それは「標準のままだと、型(データ型)の管理がガバガバ」という点です。

例えば、数値を保存したつもりでも、内部で勝手に文字列として扱われてしまったり、日付を入れたはずがVariant型になって後続の計算でエラーが出たりします。特にVBA初学者が一番ハマるのが、「すでに存在しているキーに、違う型のデータを上書きしようとしたときの致命的なクラッシュ」です。

これを防ぐためには、データの読み書きをラップ(包み込む)する専用のクラスや関数、つまり「型安全なラッパーライブラリ」を作る必要があります。

3. 実装:型安全なプロパティ操作ライブラリ

それでは、実際のコードを見ていきましょう。
今回は、標準モジュールにコピペするだけで、「文字列」「数値」「日付」「真偽値」を安全に管理できる汎用ライブラリを用意しました。

以下のコードを、あなたのPowerPointVBAの標準モジュール(例: `Module1`)にそのまま貼り付けてください。

Option Explicit

‘ =====================================================================
‘ 【超実用】PowerPoint型安全カスタムプロパティ操作ライブラリ

‘ 概要: データの型(String/Long/Double/Date/Boolean)を厳密に判定・変換し、
‘ CustomDocumentPropertiesの型不一致エラーを完全防御します。
‘ =====================================================================

‘ — 1. 値の書き込み(セッター) —
Public Sub SetCustomProperty(ByVal pres As Presentation, ByVal propName As String, ByVal val As Variant)
Dim props As Office.DocumentProperties
Set props = pres.CustomDocumentProperties

‘ 既存のプロパティが存在するかチェックし、存在する場合は一度削除する
‘ (※PowerPointの仕様上、同じ名前で異なる型を上書きするとエラーになるため)
On Error Resume Next
props(propName).Delete
On Error GoTo 0

‘ 渡された変数の「型(VarType)」に応じて、適切な型でプロパティを追加する
Select Case VarType(val)
Case vbString
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeString, Value:=CStr(val)

Case vbInteger, vbLong, vbByte
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeNumber, Value:=CLng(val)

Case vbCurrency, vbSingle, vbDouble, vbDecimal
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeNumber, Value:=CDbl(val)

Case vbDate
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeDate, Value:=CDate(val)

Case vbBoolean
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeBoolean, Value:=CBool(val)

Case Else
‘ 想定外の型(オブジェクトや配列など)が渡された場合はエラーで弾く
Err.Raise 10001, “SetCustomProperty”, “サポートされていないデータ型です: ” & TypeName(val)
End Select
End Sub

‘ — 2. 値の読み込み(ゲッター:文字列) —
Public Function GetCustomPropertyString(ByVal pres As Presentation, ByVal propName As String, Optional ByVal defaultValue As String = “”) As String
Dim val As Variant
val = GetRawProperty(pres, propName)

If IsEmpty(val) Then
GetCustomPropertyString = defaultValue
Else
GetCustomPropertyString = CStr(val)
End If
End Function

‘ — 3. 値の読み込み(ゲッター:数値/Long) —
Public Function GetCustomPropertyLong(ByVal pres As Presentation, ByVal propName As String, Optional ByVal defaultValue As Long = 0) As Long
Dim val As Variant
val = GetRawProperty(pres, propName)

If IsEmpty(val) Or Not IsNumeric(val) Then
GetCustomPropertyLong = defaultValue
Else
GetCustomPropertyLong = CLng(val)
End If
End Function

‘ — 4. 値の読み込み(ゲッター:日付) —
Public Function GetCustomPropertyDate(ByVal pres As Presentation, ByVal propName As String, Optional ByVal defaultValue As Date = 0) As Date
Dim val As Variant
val = GetRawProperty(pres, propName)

If IsEmpty(val) Or Not IsDate(val) Then
GetCustomPropertyDate = defaultValue
Else
GetCustomPropertyDate = CDate(val)
End If
End Function

‘ — 5. 値の読み込み(ゲッター:真偽値) —
Public Function GetCustomPropertyBoolean(ByVal pres As Presentation, ByVal propName As String, Optional ByVal defaultValue As Boolean = False) As Boolean
Dim val As Variant
val = GetRawProperty(pres, propName)

If IsEmpty(val) Then
GetCustomPropertyBoolean = defaultValue
Else
GetCustomPropertyBoolean = CBool(val)
End If
End Function

‘ — 内部ヘルパー: 安全に生データを取り出す —
Private Function GetRawProperty(ByVal pres As Presentation, ByVal propName As String) As Variant
Dim props As Office.DocumentProperties
Set props = pres.CustomDocumentProperties

On Error Resume Next
GetRawProperty = props(propName).Value
If Err.Number <> 0 Then
GetRawProperty = Empty ‘ 存在しない場合はEmptyを返す
End If
On Error GoTo 0
End Function

4. このコードの「知見が詰まったポイント」

初心者を脱却するためのエンジニアリング的なこだわりを、少しだけ解説させてください。

1. 「上書き時の削除(Delte)」の罠を回避
PowerPointの仕様上、すでに存在するカスタムプロパティに対して異なる型で値を再代入しようとすると、容赦なく実行時エラーが発生します。そのため、セッター(`SetCustomProperty`)の中では、一度 `On Error Resume Next` で既存の同名プロパティを削除してから、新しく作り直すという安全策(イミュータブルなアプローチ)をとっています。
2. `VarType` による厳密な型ルーティング
VBAの `Variant` は何でも受け入れてくれる反面、意図しない型変換を引き起こします。`Select Case VarType(val)` を使うことで、渡された値が「整数なのか、実数なのか、日付なのか」を正確に判別し、適切な `msoPropertyType…` を指定してOffice側に教え込んでいます。
3. デフォルト値(Optional)の優しさ
プロパティがまだファイルに保存されていない(初回実行時など)に値を取り出そうとすると、エラーや予期せぬ空値になります。ゲッター側で `Optional ByVal defaultValue` を用意しておくことで、「もしデータがなければ、代わりにこのデフォルト値を返す」という安全な設計(ディフェンシブプログラミング)を実現しています。

5. 実際に使ってみよう(動作確認用マクロ)

上記のライブラリを記述したら、以下のテスト用マクロを実行して動作を確かめてみてください。

Public Sub TestCustomProperties()
Dim targetPres As Presentation
Set targetPres = ActivePresentation ‘ 現在開いているプレゼンテーションを対象にする

‘ 1. 各種データを安全に書き込む
Call SetCustomProperty(targetPres, “ProjectID”, 98765) T ‘ 数値
Call SetCustomProperty(targetPres, “ProjectName”, “次世代AIシステム開発”) ‘ 文字列
Call SetCustomProperty(targetPres, “Deadline”, #12/31/2026#) ‘ 日付
Call SetCustomProperty(targetPres, “IsApproved”, True) ‘ 真偽値

‘ 2. 安全に読み出してイミディエイトウィンドウに表示する
Debug.Print “— 読み込み結果 —”
Debug.Print “案件ID: ” & GetCustomPropertyLong(targetPres, “ProjectID”)
Debug.Print “案件名: ” & GetCustomPropertyString(targetPres, “ProjectName”)
Debug.Print “期限: ” & GetCustomPropertyDate(targetPres, “Deadline”)
Debug.Print “承認済: ” & GetCustomPropertyBoolean(targetPres, “IsApproved”)

MsgBox “メタデータの書き込みと読み込みに成功しました!イミディエイトウィンドウを確認してください。”, vbInformation
End Sub

実行後、VBAエディタの下部にある「イミディエイトウィンドウ」(Ctrl + G)を開いてみてください。綺麗にデータが型を保ったまま出力されているはずです。

まとめ

今回は、PowerPoint VBAにおけるメタデータ管理の決定版として、型安全なカスタムプロパティ操作ライブラリをご紹介しました。

  • 見た目のテキストに頼らず、ファイルプロパティ(`CustomDocumentProperties`)を活用する
  • 型の不一致や上書きエラーを防ぐために、ラッパー関数でラップする
  • デフォルト値を設定して、未定義エラーから身を守る

ここをクリアすれば、あなたの作るPowerPointマクロは、単なる「おもちゃの自動化」から、実務の現場で耐えうる「堅牢な業務システム」へと大きく進化します。

ぜひ、日々の資料作成や社内ツールの開発に役立ててくださいね。「ここをもっとこうしたい!」という疑問があれば、いつでも先輩エンジニアに聞いてください。応援しています!

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