【入門編】Word VBAで『文書プロパティ』を読み書きする:カスタムプロパティを用いた版管理の自動化 – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの深淵へようこそ。世界最高峰の自動化アーキテクトである私と一緒に、今日からあなたを「マクロの記録」から完全に卒業させましょう。

私たちが普段何気なく使っているMicrosoft Word。実は、その背後には圧倒的に洗練されたオブジェクトモデルが広がっています。そして、現場のシステム開発やドキュメント管理において、最も見落とされがちでありながら、業務効率を劇的に変える隠し武器が今回テーマにする「カスタム文書プロパティ(CustomDocumentProperties)」です。

「ファイルの版管理や更新者を、手動ではなくプログラムで完全に自動化したい」
「外部の管理システムとWordをシームレスに連携させたい」

そんな現場の切実な願いを、たった数行の美しいVBAコードで解決する方法を授けましょう。ここをクリアすれば、あなたのWord VBAの基本はバッチリです。一緒に本質をマスターしていきましょう!

1. Word VBAの「心臓部」:オブジェクトモデルの階層構造を知る

まず、Word VBAの基本中の基本、オブジェクトの「階層構造(親子関係)」を頭に叩き込みましょう。WordのVBAは、ロシアの民芸品「マトリョーシカ」のように、大きなオブジェクトの中に小さなオブジェクトがすっぽり入っています。

[ Application ] (Wordアプリケーション全体)
└─ [ Document ] (開いている個別の文書)
├─ [ Content / Range ] (文書の中身・テキスト範囲)
└─ [ CustomDocumentProperties ] (文書に紐づくカスタム情報)

私たちがこれから扱う `CustomDocumentProperties` は、「Document(文書)」という親が背負っている『見えないポケット』のようなものです。このポケットには、文書のタイトルや作成者といったデフォルトの情報だけでなく、私たちが自由に定義した「カスタム情報(版数、承認ステータス、管理IDなど)」を詰め込むことができます。

このポケットの素晴らしいところは、「Word文書ファイル(.docx)そのものにデータがくっついて移動する」という点です。テキストの途中にメタデータを書き込む必要がなく、ファイル単位でスッキリと管理できるため、外部システム(ExcelやPowerShell、基幹系システムなど)との連携において最強の武器になります。

2. 実践:カスタムプロパティを読み書きする極意

それでは、実際にコードを書いていきましょう。
今回は、文書の「版数(Revision)」と「承認状態(Status)」をカスタムプロパティとして管理し、自動で更新・読み込みを行う実用的なマクロを作成します。

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

Option Explicit

‘ ==============================================================================
‘ 手順1: カスタムプロパティに「版数」と「ステータス」を書き込むプロシージャ
‘ ==============================================================================
Sub SetDocumentVersionInfo()
Dim doc As Document
Set doc = ActiveDocument ‘ 現在アクティブな文書を対象にする

On Error GoTo ErrorHandler ‘ エラーハンドリングの布石

‘ 【知見】カスタムプロパティは、既に存在するかどうかでアプローチが変わるため、
‘ サブルーチン化するか、エラーをトラップするのが実務ではスマートです。

‘ 1. 版数(Version)プロパティの設定
Call SetOrAddCustomProperty(doc, “DocVersion”, msoPropertyTypeString, “1.0.0”)

‘ 2. ステータス(Status)プロパティの設定
Call SetOrAddCustomProperty(doc, “ApprovalStatus”, msoPropertyTypeString, “Draft(草稿)”)

MsgBox “文書プロパティの更新が完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ ==============================================================================
‘ 補助ルーチン: プロパティの存在有無を吸収し、安全に書き込むプロシージャ
‘ ==============================================================================
Private Sub SetOrAddCustomProperty(targetDoc As Document, propName As String, propType As MsoDocProperties, propValue As String)
Dim prop As DocumentProperty
Dim isExist As Boolean

isExist = False

‘ 既存のカスタムプロパティを総当りでチェック
For Each prop In targetDoc.CustomDocumentProperties
If prop.Name = propName Then
isExist = True
Exit For
End If
Next prop

‘ 存在する場合は値を上書き、存在しない場合は新規追加
If isExist = True Then
targetDoc.CustomDocumentProperties(propName).Value = propValue
Else
targetDoc.CustomDocumentProperties.Add _
Name:=propName, _
LinkToContent:=False, _
Type:=propType, _
Value:=propValue
End If
End Sub

‘ ==============================================================================
‘ 手順2: カスタムプロパティを読み取って画面に表示するプロシージャ
‘ ==============================================================================
Sub ReadDocumentVersionInfo()
Dim doc As Document
Set doc = ActiveDocument

Dim ver As String
Dim status As String

On Error GoTo ReadError

‘ プロパティから値を取得(存在しない場合のエラーを防ぐため、事前に有無を確認するかErrを捕捉)
ver = doc.CustomDocumentProperties(“DocVersion”).Value
status = doc.CustomDocumentProperties(“ApprovalStatus”).Value

MsgBox “【現在の文書プロパティ】” & vbCrLf & _
“・版数: ” & ver & vbCrLf & _
“・状態: ” & status, vbInformation, “プロパティ読み取り”
Exit Sub

ReadError:
MsgBox “必要なカスタムプロパティが見つかりません。先に書き込みを実行してください。”, vbExclamation
End Sub

3. 初学者が必ずハマる「3つの罠」と回避策

プログラミングの学習において、エラーは最高の教師です。しかし、事前に知っていれば無駄な残業を防げる「Word VBA特有の罠」がいくつかあります。

罠その1:「存在しないプロパティ」を呼び出して即死する

`doc.CustomDocumentProperties(“PropName”).Value` というコードは、もしその名前のプロパティが一度も作られていない場合、容赦なく実行時エラー(実行時エラー ‘5’: プロシージャの呼び出しまたは引数が不正です)を引き起こして先へ進めなくなります。

  • 回避策: 先ほどのサンプルコードのように、ループで存在確認を行うか、エラーハンドリング(`On Error Resume Next` や `On Error GoTo`)を必ず実装しましょう。

罠その2:データ型(Type)のミスマッチ

カスタムプロパティには、文字列(`msoPropertyTypeString`)、数値(`msoPropertyTypeNumber`)、日付(`msoPropertyTypeDate`)、真偽値(`msoPropertyTypeBoolean`)を指定できます。
一度「文字列」として作成したプロパティに対して、後から無理やり「数値」を代入しようとすると、型の不一致エラーになります。

  • 回避策: 版数などは一見すると数値に見えますが、`”1.0.1″` のようにピリオドを含めるケースが多いため、実務では一律で文字列(String)として扱うのが最も安全でトラブルが少ないアプローチです。

罠その3:「マクロ有効文書(.docm)」での保存忘れ

せっかく書いたVBAコードや設定したプロパティも、ファイルを通常の `.docx` として保存すると、セキュリティの仕様でVBAコードが綺麗さっぱり消去されます。

  • 回避策: 必ずファイルを保存する際は、ファイル形式を Word マクロ有効文書(`.docm`) に指定してください。

4. チーフアーキテクトからの実務アドバイス

この「カスタムプロパティによる版管理」をマスターすると、何が嬉しいのか?
それは、Wordを開かなくても、外部のプログラム(VBAやPowerShell、Pythonなど)からファイルのメタデータを一瞬で読み書きできるようになるという点です。

例えば、社内の共有サーバーにある数百個のWordファイルから、「現在の版数が ‘1.0.0’ のままになっている未更新のファイル」をリストアップするような管理スクリプトも、この基盤があれば数分で構築できます。

手作業による「書き忘れ」「バージョンの記載ミス」というヒューマンエラーを、コードの力で完全に駆逐する。これこそが、私たちが目指すべきプロフェッショナルの姿です。

ここをクリアしたあなたなら、もうWord VBAの基礎はバッチリです。自信を持って、次の自動化の扉を開いてください。それでは、また次の現場でお会いしましょう!

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