こんにちは!バックオフィスの自動化や、地獄のような大量ドキュメントのメンテナンスに日々頭を悩ませていませんか?
「Excelのリストにある最新の管理情報(タイトル、作成者、バージョンなど)を、100個あるWordファイルのプロパティに一括で反映させたい……。まさか、1つずつファイルを開いて『ファイル > 情報』ってポチポチ手作業で入力する気ですか?」
もしそんな絶望的な作業をしようとしているなら、ちょっと待ってください。
今回は、Excelを司令塔(データベース)にし、背後でADO(ActiveX Data Objects)とWordのオブジェクトモデルを高速連携させて、一瞬で文書プロパティを書き換えるプロフェッショナルな手法を伝授します。
ここをクリアすれば、単なる「マクロの記録の貼り付け係」から、業務システムをデザインするエンジニアへと確実にステップアップできますよ。さあ、一緒にWord VBAの奥深い世界へ飛び込みましょう!
—
1. なぜ「ADO × Wordオブジェクト」なのか?
今回のテーマのキモは、「Excelを開いたまま、Wordのファイルを起動せずに(あるいはバックグラウンドで最小限の負荷で)プロパティを書き換える」という点です。
Excelのデータを扱うとき、VBA初学者はよく `For行 = 2 To 100` のようにセルを上から順にペタペタ舐めるコードを書きがちです。しかし、数千行のデータや複雑な結合を扱う現場では、ADO(SQL)を使ってExcelファイル自体を「データベース」として高速に読み込みます。
そして、Wordのプロパティ操作には、以下の2つを使い分けます。
1. BuiltInDocumentProperties(組み込みプロパティ): タイトル、作成者、会社名など
2. CustomDocumentProperties(カスタムプロパティ): 独自に追加した「管理番号」「承認ステータス」など
これらをExcel側のデータと綺麗にマッピングさせることが、今回のアーキテクチャの全貌です。
—
2. 準備:Excel側のデータ構造と前提条件
Excel(例えば `MasterData.xlsm`)のシートに、以下のようなテーブル(テーブル名:`Tbl_WordList`)が用意されていると仮定します。
| FilePath (ファイルのフルパス) | DocTitle (タイトル) | Author (作成者) | DocVersion (カスタム: バージョン) |
| :— | :— | :— | :— |
| C:\Docs\A社仕様書.docx | A社向けシステム仕様書 | 山田 太郎 | 1.0.2 |
| C:\Docs\B社見積書.docx | B社システムお見積り | 鈴木 花子 | 2.0.0 |
※Word文書のファイル名やパスが正確であることが絶対条件です。
—
3. 実装コード:一括更新エンジン
Excel側の標準モジュールに、以下のコードを記述してください。
世界最高峰の現場でも通用するよう、エラーハンドリング(万が一ファイルが破損していたり、誰かが開いていてロックされていても止まらない仕組み)を組み込んでいます。
Option Explicit
‘ ==============================================================================
‘ 処理名 : ExcelからWord文書プロパティを一括更新するメインプロシージャ
‘ 概要 : ADOでExcelテーブルを取得し、各Word文書の組み込み/カスタムプロパティを更新
‘ ==============================================================================
Public Sub UpdateWordPropertiesFromExcel()
Dim cn As Object
Dim rs As Object
Dim strConn As String
Dim strSQL As String
Dim wdApp As Object
Dim wdDoc As Object
Dim filePath As String
Dim docTitle As String
Dim docAuthor As String
Dim docVersion As String
Dim updatedCount As Long
Dim errorCount As Long
‘ 画面描画や警告を停止して高速化&安定化を図る
Application.ScreenUpdating = False
Application.DisplayAlerts = False
‘ 1. ADOを使った高速データ読み込みの準備
‘ ※自分自身のワークブックをデータソースとして接続します
strConn = “Provider=Microsoft.ACE.OLEDB.12.0;” & _
“Data Source=” & ThisWorkbook.FullName & “;” & _
“Extended Properties=’Excel 12.0 Macro;HDR=Yes;IMEX=1’;”
Set cn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)
On Error GoTo ConnectionError
cn.Open strConn
‘ テーブルデータを取得するSQL
strSQL = “SELECT [FilePath], [DocTitle], [Author], [DocVersion] FROM [Tbl_WordList]”
rs.Open strSQL, cn, 1, 1 ‘ adOpenKeyset, adLockReadOnly
On Error GoTo 0
‘ 2. Wordアプリケーションをバックグラウンドで起動
‘ (New Word.Application よりも CreateObject の方が参照設定不要で安全です)
Set wdApp = CreateObject(“Word.Application”)
wdApp.Visible = False ‘ 画面は非表示で爆速処理
updatedCount = 0
errorCount = 0
‘ 3. レコードセットをループしてWord文書を次々と書き換える
Do While Not rs.EOF
filePath = Nvl(rs.Fields(“FilePath”).Value, “”)
docTitle = Nvl(rs.Fields(“DocTitle”).Value, “”)
docAuthor = Nvl(rs.Fields(“Author”).Value, “”)
docVersion = Nvl(rs.Fields(“DocVersion”).Value, “”)
‘ ファイルが存在する場合のみ処理
If filePath <> “” And Dir(filePath) <> “” Then
On Error GoTo DocError ‘ 個別ファイルの破損やアクセス権エラー対策
‘ 文書をオープン
Set wdDoc = wdApp.Documents.Open(FileName:=filePath, ReadOnly:=False, Visible:=False)
‘ — A. 組み込みプロパティの更新 —
wdDoc.BuiltInDocumentProperties(“Title”) = docTitle
wdDoc.BuiltInDocumentProperties(“Author”) = docAuthor
‘ — B. カスタムプロパティの更新(存在チェック付き関数を使用) —
Call SetCustomProperty(wdDoc, “DocVersion”, docVersion)
‘ 保存して閉じる
wdDoc.Save
wdDoc.Close SaveChanges:=True
updatedCount = updatedCount + 1
GoTo NextRecord
DocError:
‘ エラーが発生したファイルはスキップしてカウント
errorCount = errorCount + 1
If Not wdDoc Is Nothing Then
wdDoc.Close SaveChanges:=False
End If
Resume NextRecord
Else
‘ ファイルが存在しない場合
errorCount = errorCount + 1
End If
NextRecord:
On Error GoTo 0
rs.MoveNext
Loop
‘ 4. 後片付け
rs.Close
cn.Close
wdApp.Quit
Application.ScreenUpdating = True
Application.DisplayAlerts = True
‘ 完了メッセージ
MsgBox “処理が完了しました!” & vbCrLf & _
“【成功】 ” & updatedCount & ” 件” & vbCrLf & _
“【失敗・スキップ】 ” & errorCount & ” 件”, vbInformation, “一括更新完了”
Exit Sub
ConnectionError:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox “データベースへの接続に失敗しました。” & vbCrLf & Err.Description, vbCritical
End Sub
‘ ==============================================================================
‘ 補助関数: Null値を空文字に変換する安全装置
‘ ==============================================================================
Private Function Nvl(ByVal varValue As Variant, ByVal defaultValue As String) As String
If IsNull(varValue) Then
Nvl = defaultValue
Else
Nvl = CStr(varValue)
End If
End Function
‘ ==============================================================================
‘ 補助関数: カスタムプロパティを安全に設定する(無ければ新規作成、有れば上書き)
‘ ==============================================================================
Private Sub SetCustomProperty(ByVal doc As Object, ByVal propName As String, ByVal propValue As String)
Dim prop As Object
Dim propExists As Boolean
propExists = False
‘ 既存のカスタムプロパティを走査
For Each prop In doc.CustomDocumentProperties
If prop.Name = propName Then
prop.Value = propValue
propExists = True
Exit For
End If
Next prop
‘ 存在しない場合は新規追加 (msoPropertyTypeString = 4)
If Not propExists Then
doc.CustomDocumentProperties.Add _
Name:=propName, _
LinkToContent:=False, _
Type:=4, _
Value:=propValue
End If
End Sub
—
4. チーフアーキテクトが教える、陥りがちな「3つの罠」と回避策
このコードを実務に投入する際、初心者が必ずハマる「罠」があります。先回りしてクリアしておきましょう。
罠①:カスタムプロパティの初回追加エラー
Word文書に「最初からそのカスタムプロパティが存在しない」状態で `.Value = “値”` と書くと、容赦なく「実行時エラー」でマクロがクラッシュします。
⇒ 対策として、今回のコードでは `SetCustomProperty` サブルーチンを別途用意し、「存在していれば代入、していなければ `Add` メソッドで新規作成」という安全なロジック(イディオム)を組み込んでいます。これを覚えておくだけで、バグの9割を防げます。
罠②:ファイルが「読み取り専用」や「別ユーザー使用中」
ネットワーク共有サーバー上にあるWordファイルを処理する場合、誰かが開いていると `Documents.Open` でエラーになります。
⇒ `On Error GoTo DocError` によるインラインのエラーハンドリングを実装し、1つのファイルがエラーでも全体の処理が止まらず、次のファイルへ進む(Resilientな設計)ようにしてあります。
罠③:参照設定のし忘れによるコンパイルエラー
通常、Wordを操作するためにはVBAの「ツール > 参照設定」から `Microsoft Word 16.0 Object Library` にチェックを入れる必要がありますが、他人にこのツールを配布する場合、Excelのバージョン違いで参照切れを起こします。
⇒ 今回のコードでは `CreateObject(“Word.Application”)` というレイトバインディング(遅延バインディング)を採用しているため、参照設定のチェックが不要であり、どんな環境のPCでもそのまま動きます。
—
5. ここをクリアすれば、Word VBAの基本はバッチリです!
お疲れ様でした!今回のコードの全体像を振り返ってみましょう。
1. ADO でExcelのテーブルをスマートにメモリ上に読み込む。
2. `CreateObject` でWordを裏側で起動し、PCのメモリと画面を保護する。
3. `BuiltInDocumentProperties` と `CustomDocumentProperties` を適切にオブジェクトとして操作する。
4. エラーハンドリングを仕込んで、現実世界の「汚いデータや排他制御」に耐えうる頑健なシステムを作る。
これらをマスターしたあなたは、もはや単なるVBAユーザーではありません。現場の業務プロセスをハックし、コストを劇的に削減する「自動化エンジニア」そのものです。
ぜひ、あなたの手元のファイルで試して、その爆速の処理スピードと快感を味わってみてください。「ここをもっとこうしたい!」というカスタマイズの要望があれば、いつでもエンジニア仲間として相談に乗りますよ。次のオートメーションの世界へ進みましょう!
