Word VBAの深淵へ:『ストーリー』を掌握し、文書すべてを一括置換する最適解
こんにちは。Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんとなく動くコード」を生成したことがあるなら、あなたはすでに第一歩を踏み出しています。しかし、そのコードが「なぜか本文しか置換してくれない」という壁にぶつかったことはありませんか?
実は、Wordというアプリケーションは、我々が目にする「ページ」という概念とは裏腹に、内部ではテキストをバラバラの部屋(ストーリー)に分けて管理しています。
今日は、ヘッダー、フッター、本文、そしてテキストボックスまでも漏らさず一括置換する、プロの作法を伝授しましょう。
—
1. Wordの「ストーリー」とは何か?
Wordの文書は、単なる一枚の紙ではありません。以下の「部屋」に分かれています。
- メインテキスト: 本文
- ヘッダー・フッター: ページの上部・下部
- テキストボックス: 独立して浮いている領域
- 脚注・文末脚注: 文書の末尾にある補足情報
これらはそれぞれ`StoryRanges`というコレクションの中に存在します。「本文だけ置換する」というコードは、実は「メインの部屋しか見ていない」状態なのです。 これでは、大切なヘッダーの修正漏れが発生してしまいます。
—
2. すべての部屋を巡回する「最適解」コード
ここからが本題です。すべてのストーリーを駆け巡り、置換を行うための堅牢なコードがこちらです。
Sub GlobalReplace()
Dim rngStory As Range
Dim strFind As String
Dim strReplace As String
‘ 検索文字列と置換文字列を定義
strFind = “旧名称”
strReplace = “新名称”
‘ 文書内のすべてのストーリー(部屋)をループ処理する
For Each rngStory In ActiveDocument.StoryRanges
‘ リンクされたストーリー(ヘッダー同士など)を辿るための再帰的処理
Do
With rngStory.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = strFind
.Replacement.Text = strReplace
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.Execute Replace:=wdReplaceAll
End With
‘ 次のストーリーへ(リンクされている場合)
Set rngStory = rngStory.NextStoryRange
Loop Until rngStory Is Nothing
Next rngStory
MsgBox “すべての領域の置換が完了しました!”, vbInformation
End Sub
—
3. コードの心臓部を紐解く
なぜこのコードが最強なのか、ポイントを解説します。
① `For Each rngStory In ActiveDocument.StoryRanges`
これが「全ストーリーを網羅する」ための扉です。`ActiveDocument`が持つすべての領域を順番に呼び出します。
② `Do … Loop Until rngStory Is Nothing`
ここが一番の盲点です。Wordは、ヘッダーの奇数ページ・偶数ページのように、「リンクされた別のストーリー」を持つことがあります。`NextStoryRange`を使うことで、その裏側に隠れた断片的なテキストまで余すことなく辿り尽くすことができます。
③ `With rngStory.Find`
Rangeオブジェクトに対して直接`Find`を実行しています。マクロの記録で生成される`Selection`(選択範囲)を使わないのがポイントです。`Selection`は画面上でカーソルを動かすため非常に遅いですが、`Range`を使えばメモリ内で高速に処理が完結します。これがプロの速度です。
—
4. 陥りやすい罠:エラーを避けるために
このコードを運用する際、一つだけ注意点があります。
「保護された文書」や「複雑なテーブル配置」によっては、`NextStoryRange`が予期せぬ挙動をすることが稀にあります。
もしエラーが出る場合は、`On Error Resume Next`をループの直前に入れることで、スキップして処理を継続させるという「現場の知恵」を使うこともあります。しかし、まずは上記の基本コードをしっかりと理解し、自分の環境で動かすことから始めてみてください。
—
最後に:VBAを「使いこなす」ということ
「マクロの記録」は便利なツールですが、それはあくまで「Wordがどう動いているか」を教えてくれる参考書に過ぎません。
今回のように、`StoryRanges`というオブジェクトモデルの深層に触れることで、あなたの業務自動化スキルは劇的に向上します。「画面で見えているものがすべてではない」という視点。この感覚を持てたあなたなら、どんな複雑な文書修正も、一瞬で終わらせることができるはずです。
さあ、次はどの作業を自動化しましょうか?
あなたのエンジニアライフが、より創造的で快適なものになることを願っています。
