【入門編】【中級者向け】「StoryRanges」を再帰的に巡回し、本文以外の図形やテキストボックス内を置換する – Word VBA解析バイブル

スポンサーリンク

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の仕様に振り回されることはありません。あなたの手元には、ドキュメントのすべてを操る「権限」が与えられたのです。

もし途中でつまずいたら、いつでも戻ってきてください。このコードは、あなたの「自動化の武器庫」の最前線で、何度でも役に立つはずです。

さあ、次はどんな面倒な作業を自動化しましょうか?あなたの挑戦を応援しています。

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