Word VBAの「見えない壁」を突破せよ:StoryRangesでドキュメント全体を支配する置換術
こんにちは。現場で「マクロの記録」から一歩踏み出し、Wordの深淵に触れようとしているあなたへ。
Wordの置換機能、便利ですよね。でも、いざVBAで`Selection.Find.Execute`を書いてみると、「あれ、テキストボックスの中身が置換されていないぞ?」という事態に直面したことはありませんか?
実は、Wordのドキュメントは単なる一枚の紙ではありません。本文(MainTextStory)、ヘッダー、フッター、脚注、そして厄介なテキストボックス……これらはそれぞれ独立した「物語(Story)」として管理されています。
今日は、Wordの全領域を漏れなく制御するための、プロフェッショナルな巡回術を伝授します。
—
1. なぜ「本文」だけでは足りないのか?
Wordのドキュメント構造は「StoryRanges」というコレクションで管理されています。
私たちが普段見ている「本文」は、数あるStoryの一つに過ぎません。
- wdMainTextStory: メインの本文
- wdCommentsStory: コメント
- wdFootnotesStory: 脚注
- wdTextFrameStory: テキストボックス内の文字列
- wdEvenPagesHeaderStory: 偶数ページのヘッダー
これらを個別に指定して検索をかけるのは現実的ではありません。そこで、「ドキュメント内のすべてのStoryを巡回する」という設計思想が必要になるのです。
—
2. 鋼鉄の置換アルゴリズム:全Story巡回コード
以下は、ドキュメント内のあらゆる場所をくまなく検索・置換する、堅牢なコードのテンプレートです。
Sub MasterReplaceAll()
Dim rng As Range
Dim shp As Shape
‘ 全Storyを巡回する
For Each rng In ActiveDocument.StoryRanges
‘ 検索と置換の設定
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = “検索したい文字列”
.Replacement.Text = “置換後の文字列”
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.Execute Replace:=wdReplaceAll
End With
‘ 【重要】リンクされたテキストボックスの処理
‘ StoryRangesだけでは届かないテキストボックスの深淵へ
If rng.StoryType = wdTextFrameStory Then
Do While Not (rng.NextStoryRange Is Nothing)
Set rng = rng.NextStoryRange
‘ ここで再帰的に処理を実行
Loop
End If
Next rng
MsgBox “ドキュメント全体の置換が完了しました。”
End Sub
—
3. このコードが「伝説」である理由
① `wdFindContinue` の意味
`Wrap`プロパティを `wdFindContinue` に設定することで、検索がStoryの終わりに達したときに、最初から再開させることができます。これを怠ると、途中から検索が止まってしまうという「よくあるバグ」に苦しむことになります。
② なぜ「再帰的な巡回」が必要なのか
実は、`StoryRanges`をループするだけでは、「連結されたテキストボックス(ストーリーが繋がっているもの)」のすべてを拾いきれないことがあります。`NextStoryRange`プロパティを使って、連結されたテキストフレームを根こそぎ辿るのが、真のエンジニアの作法です。
—
4. 現場で陥りやすい「落とし穴」
- エラーの温床「ヘッダー・フッター」:
稀に、特定のセクションにしか存在しないヘッダーなどが原因で、検索対象がNullになることがあります。`On Error Resume Next`を適材適所で使うか、オブジェクトが空でないか(`If Not rng Is Nothing Then`)を常に確認する癖をつけましょう。
- 重いドキュメントでのパフォーマンス:
数千ページのドキュメントで`ReplaceAll`を何度も繰り返すと、Wordは悲鳴を上げます。検索前に `Application.ScreenUpdating = False` を宣言し、描画を止めることで処理速度が劇的に向上します。
—
最後に:自動化の先にあるもの
この「StoryRangesを巡回する」という技術は、単なる置換だけにとどまりません。フォントの一括変更、特定のキーワードのハイライト、個人情報の自動削除など、あらゆる業務自動化の「骨格」になります。
ここをマスターすれば、もうWordの仕様に振り回されることはありません。あなたの手元には、ドキュメントのすべてを操る「権限」が与えられたのです。
もし途中でつまずいたら、いつでも戻ってきてください。このコードは、あなたの「自動化の武器庫」の最前線で、何度でも役に立つはずです。
さあ、次はどんな面倒な作業を自動化しましょうか?あなたの挑戦を応援しています。
