【入門編】Word文書のプロパティをVBAで操る:カスタムドキュメントプロパティを用いた文書管理の自動化 – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と途方に暮れていませんか?大丈夫です。今日のテーマをマスターすれば、あなたは単なる「操作の自動化」から卒業し、文書のライフサイクルをシステムとして管理する「アーキテクト」への第一歩を踏み出すことになります。

今回は、Word文書の裏側に隠されたメタデータ(付加情報)である「カスタムドキュメントプロパティ」をVBAで自在に操る方法を解説します。

ここをクリアすれば、Word VBAの本質がぐっと見えてきますよ。さあ、一緒に扉を開けましょう!

1. なぜ「カスタムドキュメントプロパティ」なのか?

実務でこんな悩みを抱えたことはありませんか?

  • 「この企画書、今のバージョンいくつだっけ?」
  • 「誰が最終承認したんだっけ?」
  • 「表紙にある承認日を、本文中の色々な場所にも連動させたい」

本文中に直接「第2版」「2023/10/1」などとベタ打ちしていると、修正漏れやバージョンの混乱(野良ドキュメントの発生)が必ず起きます。

ここで登場するのが、文書の「プロパティ(属性)」です。Wordには、ファイル名やページ数といった標準のプロパティのほかに、ユーザーが自由に定義できる「カスタムドキュメントプロパティ(CustomDocumentProperties)」という強力な領域が用意されています。

これを使うと、「文書のデータ(本文)」と「文書の管理情報(メタデータ)」を完全に分離でき、VBAで一元管理できるようになります。

2. Wordオブジェクトモデルの階層構造をイメージしよう

VBAでこれらを操作する前に、Wordのオブジェクトがどう並んでいるか、頭の中に地図を描いておきましょう。

Application (Word アプリケーション)
┗ ActiveDocument (今開いている文書)
┗ CustomDocumentProperties (カスタムプロパティのコレクション)
┗ Item (個別のプロパティ:版数、承認日など)

非常にシンプルですね。「今開いている文書の、カスタムプロパティ部屋にアクセスして、特定の名前の引き出しを開け閉めする」というイメージです。

3. 実践!カスタムプロパティを読み書きするコード

百聞は一見にしかず。実際にカスタムドキュメントプロパティを設定・取得するマクロを見てみましょう。

以下のコードを、WordのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてみてください。

Sub ManageDocumentMetadata()
Dim doc As Document
Dim props As Office.CustomDocumentProperties
Dim propName As String

‘ 対象は「今アクティブな文書」
Set doc = ActiveDocument
Set props = doc.CustomDocumentProperties

propName = “DocumentVersion”

‘ 1. すでにプロパティが存在するかチェックし、なければ新規作成する
On Error Resume Next
Dim testVal As String
testVal = props(propName).Value

If Err.Number <> 0 Then
‘ 存在しない場合は新規追加 (msoPropertyTypeString は文字列型を指定)
props.Add Name:=propName, LinkToContent:=False, Type:=msoPropertyTypeString, Value:=”1.0″
MsgBox “カスタムプロパティ「” & propName & “」を新規作成し、初期値「1.0」を設定しました。”, vbInformation
Err.Clear
Else
‘ すでに存在する場合は値を更新(例としてバージョンをインクリメントする風に)
MsgBox “現在のバージョンは ” & props(propName).Value & ” です。”, vbInformation
End If
On Error GoTo 0

End Sub

💡 コードのここがポイント!

  • `ActiveDocument.CustomDocumentProperties`: これがカスタムプロパティ全体を管理するコンテナ(入れ物)です。
  • `On Error Resume Next` の罠と回避: 実は、存在しないプロパティ名を指定して取得しようとすると、Word VBAは容赦なく実行時エラーを吐いて止まります。そのため、あえてエラーを無視させて「存在するかどうか」を判定するテクニックは、実務で非常によく使われます。

4. 陥りやすい罠:エラーを防ぐスマートな判定法

先ほどの `On Error` を使った方法は手軽ですが、少し泥臭いですよね。プログラミングに慣れてきたら、「コレクションの中に指定した名前があるかループで探す」というスマートな方法も覚えておきましょう。

Function ExistsCustomProperty(doc As Document, targetName As String) As Boolean
Dim p As Office.CustomDocumentProperty
ExistsCustomProperty = False

For Each p In doc.CustomDocumentProperties
If p.Name = targetName Then
ExistsCustomProperty = True
Exit Function
End If
Next p
End Function

この関数を用意しておけば、「もし存在していれば値を変え、なければ追加する」という処理が非常にエレガントに書けるようになります。

5. 自動化の真骨頂:プロパティを本文に埋め込む(フィールドコードの活用)

ここからが感動ポイントです。VBAで設定したカスタムプロパティを、Wordの本文中にリアルタイムで反映(同期)させてみましょう。

Wordの「挿入」>「クイックパーツ」>「フィールド」から `DocProperty` というフィールドを使うと、カスタムプロパティの値を本文に自動表示させることができます。これをVBAから一瞬で挿入する魔法のコードがこちらです。

Sub InsertPropertyIntoBody()
Dim doc As Document
Set doc = ActiveDocument

‘ 1. プロパティが存在しなければ作成しておく
On Error Resume Next
doc.CustomDocumentProperties.Add Name:=”ApprovalDate”, LinkToContent:=False, Type:=msoPropertyTypeDate, Value:=Format(Date, “YYYY/MM/DD”)
On Error GoTo 0

‘ 2. カーソルの位置に、プロパティと連動するフィールドを挿入する
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldDocProperty, _
Text:=”ApprovalDate”, _
PreserveFormatting:=False

MsgBox “本文に「ApprovalDate」の値を埋め込みました!”, vbInformation
End Sub

このコードを実行すると、カーソル位置に今日の日付が埋め込まれます。
のちにVBAでプロパティ側の値を書き換え、Word画面で `F9` キー(フィールドの更新) を押すだけで、文書内の表示が自動的に書き換わります。
※保存時や印刷時に全フィールドを自動更新する設定にしておけば、更新漏れは完全にゼロになります!

まとめ:あなたの文書管理を次のステージへ

今回は、Word VBAにおける「カスタムドキュメントプロパティ」の概念と、実用的なコードをご紹介しました。

  • 本文(Data)とメタデータ(Metadata)を分離する
  • 存在チェックのイディオム(エラー処理またはループ)を理解する
  • フィールドコードと連携させて本文に自動反映させる

ここをクリアできれば、単なるマクロの自動記録ユーザーから、堅牢なWordソリューションを設計できる「エンジニア」へとステップアップできています。

文書のバージョン管理、承認ワークフローの自動化など、応用範囲は無限大です。ぜひ、あなたの日常業務の自動化に役立ててくださいね。それでは、次の極限の知見でお会いしましょう!

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