【入門編】【上級者向け】XML形式(Flat OPC)を直接操作して、Wordの段落書式を高速に書き換える – Word VBA解析バイブル

スポンサーリンク

Word VBAの限界を超えろ:Flat OPCで実現する「数秒で数万箇所の書式変更」術

こんにちは。現場の最前線でコードと格闘している皆さん、お疲れ様です。

Word VBAで「数万行ある文書の特定の段落のフォントを全部変えたい」と思ったことはありませんか? 普通に書くと、`For Each paragraph In ActiveDocument.Paragraphs` でループを回しますよね。でも、文書が長くなればなるほど、画面がパチパチと点滅し、処理が終わるまでコーヒーを淹れて戻ってきてもまだ終わっていない……そんな経験があるはずです。

なぜ遅いのか? それは、VBAがWordの「オブジェクトモデル」という非常に重い通訳を介して、一箇所ずつGUI(描画エンジン)に命令を出しているからです。

今日は、その「通訳」を飛び越え、Wordの心臓部であるXMLを直接叩く「Flat OPC(XML形式)」という禁断のテクニックを伝授します。これを知れば、君の自動化スキルは間違いなく「伝説級」へ近づきます。

1. なぜ「オブジェクトモデル」は遅いのか?

Word VBAで `Selection.Font.Name = “MS ゴシック”` と書くと、Wordは裏で「画面の更新」「スタイルの再計算」「レイアウトの再描画」という膨大なコストを支払います。これを1万回繰り返せば、PCが悲鳴を上げるのは当然です。

今回紹介する「Flat OPC」とは、Word文書(.docx)を単なる「巨大なXMLテキストファイル」として扱う手法です。文字列の置換(Replace)だけですべての書式を一瞬で書き換えるため、オブジェクトモデルを通す必要が一切ありません。

2. 手順:Word文書を「XML」として操る

Wordには「Word 2003 XML形式」という名前で保存できる機能がありますが、現代の.docxも内部はXMLの集合体です。これを「Flat OPC」としてテキストファイル化し、正規表現などで置換してからWordで再読み込みさせます。

実装コード:Flat OPC置換エンジンの雛形

‘ ※このコードは標準モジュールに貼り付けてください
‘ 事前にMicrosoft XML, v6.0を参照設定に追加することを推奨します

Sub HighSpeedFormatChange()
Dim doc As Document
Dim xmlPath As String
Dim content As String

‘ 現在開いている文書をXMLとして一時保存
xmlPath = Environ(“TEMP”) & “\temp_doc.xml”
ActiveDocument.SaveAs2 FileName:=xmlPath, FileFormat:=wdFormatXML

‘ テキストとしてXMLファイルを読み込む
content = ReadFile(xmlPath)

‘ ここが極意!正規表現でXMLのフォント定義を直接置換する
を一括で置換
content = Replace(content, “w:ascii=””Times New Roman”””, “w:ascii=””MS ゴシック”””)

‘ 修正後のXMLを上書き保存
SaveFile xmlPath, content

‘ Wordで再読み込み(ここはオブジェクトモデルを使うが、一瞬で完了する)
Documents.Open xmlPath
End Sub

‘ ファイル読み込み用のヘルパー関数
Function ReadFile(path As String) As String
Dim fso As Object, ts As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.OpenTextFile(path, 1)
ReadFile = ts.ReadAll
ts.Close
End Function

‘ ファイル書き込み用のヘルパー関数
Sub SaveFile(path As String, content As String)
Dim fso As Object, ts As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.CreateTextFile(path, True)
ts.Write content
ts.Close
End Sub

3. 解説:ここをクリアすれば「プロ」の領域

このコードがやっているのは、「Wordという巨大なアプリを動かさずに、文書の中身をテキストエディタで書き換える」という行為です。

  • なぜ高速なのか?

WordのGUI描画機能を完全にバイパスしているからです。数万行の置換も、メモリ上での文字列処理だけで終わります。

  • 陥りやすい罠:XML構造の破壊

XMLはタグ(``など)で構成されています。`Replace`で置換する際、タグの構造を壊してしまうと、Wordで開いた瞬間に「ファイルが破損しています」と怒られます。「特定の属性名だけを正確に置換する」というルールを厳守してください。

  • オブジェクトモデルとの使い分け

「数件の変更ならオブジェクトモデル」「数万件の置換ならFlat OPC」。この使い分けができるようになれば、君はもう初心者ではありません。

4. 先輩からのアドバイス

「マクロの記録」で生成されるコードは、あくまで「初心者が手作業でやっていることをなぞるだけ」のものです。しかし、今回のようなXML直接操作は、「Wordの設計思想そのもの」をハックする行為です。

最初はXMLの階層に目が回るかもしれません。ですが、一度 `document.xml` を開いて中身を眺めてみてください。``が段落、``が文字列の塊であると理解できた瞬間、君の目の前にあるWord文書は「文書」ではなく「構造化されたデータ」として見えるはずです。

ここを突破できれば、Wordはただのワープロではなく、君の手の中で自由に操れる「巨大なデータ処理エンジン」へと進化します。

さあ、次の自動化の現場へ。君のコードが誰かの時間を劇的に節約する瞬間を、楽しみにしていますよ。

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