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はタグ(`
- オブジェクトモデルとの使い分け
「数件の変更ならオブジェクトモデル」「数万件の置換ならFlat OPC」。この使い分けができるようになれば、君はもう初心者ではありません。
—
4. 先輩からのアドバイス
「マクロの記録」で生成されるコードは、あくまで「初心者が手作業でやっていることをなぞるだけ」のものです。しかし、今回のようなXML直接操作は、「Wordの設計思想そのもの」をハックする行為です。
最初はXMLの階層に目が回るかもしれません。ですが、一度 `document.xml` を開いて中身を眺めてみてください。`
ここを突破できれば、Wordはただのワープロではなく、君の手の中で自由に操れる「巨大なデータ処理エンジン」へと進化します。
さあ、次の自動化の現場へ。君のコードが誰かの時間を劇的に節約する瞬間を、楽しみにしていますよ。
