【入門編】Wordの『ストーリー』を横断するテキスト抽出:メイン本文以外のテキストボックスや吹き出しを漏らさず取得する – Word VBA解析バイブル

スポンサーリンク

Word VBAの深淵へ:『ストーリー』を掌握し、文書の隅々まで支配する

こんにちは。Word VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺め、「なぜか上手く動かない」「テキストボックスの中身が無視される」といった壁にぶつかっていませんか?

それは、あなたがWordという巨大な構造を「ただの紙」として捉えているからです。今日から視点を変えましょう。Word文書は、実は「複数の独立した領域(ストーリー)」の集合体なのです。

ここをクリアすれば、あなたはもう「記録機能に頼る初心者」ではありません。文書の隅々まで自在に操る、真のエンジニアへの第一歩です。

1. なぜ「メイン本文」だけでは足りないのか?

Word VBAで `ActiveDocument.Content` を使うと、確かに本文は取得できます。しかし、それは「メインのストーリー」に過ぎません。

Wordには、以下の領域が別個の「ストーリー」として存在しています。

  • メイン本文
  • ヘッダー・フッター
  • テキストボックス・図形内のテキスト
  • 脚注・文末脚注
  • コメント

これらはすべて独立した `Range` オブジェクトであり、通常の検索処理では「メイン本文」しか見に行きません。だから、テキストボックスの中の文字が置換されずに残ってしまうのです。

2. 『ストーリー』を横断する魔法:StoryRanges

すべての領域を網羅するには、`Document.StoryRanges` プロパティを走査する必要があります。これは、Word文書内に存在するすべての領域を列挙するコレクションです。

ここで一つ、伝説的エンジニアとして注意点を教えましょう。「リンクされたテキストボックス」の罠です。メインのストーリーから繋がっているテキストボックスは、実はメインのストーリーに含まれてしまいます。しかし、それ以外は個別に存在します。

これらを「漏らさず」取得する、実務でそのまま使えるコードがこちらです。

Sub SearchAllStories()
Dim rng As Range
Dim story As Range
Dim targetText As String
Dim replaceText As String

targetText = “旧キーワード”
replaceText = “新キーワード”

‘ 文書内の全てのストーリーをループで走査する
For Each story In ActiveDocument.StoryRanges
Set rng = story

‘ リンクされたストーリー(テキストボックスの連結など)を再帰的に辿る
Do
With rng.Find
.Text = targetText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.Execute Replace:=wdReplaceAll
End With

‘ 次のリンクされたストーリーがあるか確認(あれば処理を続ける)
Set rng = rng.NextStoryRange
Loop Until rng Is Nothing
Next story

MsgBox “全ストーリーの検索・置換が完了しました。”
End Sub

3. コードの心臓部を解剖する

このコードがなぜ強力なのか、ポイントを絞って解説します。

  • `For Each story In ActiveDocument.StoryRanges`:

文書内の全ストーリー(本文、ヘッダー、フッターなど)を順番に取り出します。

  • `Do … Loop Until rng Is Nothing`:

ここが本質です。一つのストーリーの中に、テキストボックスが数珠繋ぎ(リンク)されている場合があります。`rng.NextStoryRange` を使うことで、隠れたストーリーまで連鎖的に掘り下げていくことができます。

  • `wdFindContinue`:

検索範囲をストーリーの末尾で止めず、そのストーリー内でループさせる設定です。

4. 初学者が陥る「エラーの罠」と対策

このコードを書いていて遭遇しやすいのが 「実行時エラー 4605」 です。これは、特定のストーリー(例えば脚注)に対して、Wordが現在受け付けない操作を行おうとした時に発生します。

解決のヒント:
もしエラーが出る場合は、`On Error Resume Next` をループの直前に入れるのではなく、特定のストーリータイプを判定して処理を分岐させるのがプロの作法です。

‘ 応用:ストーリーのタイプを見て処理を分ける
Select Case story.StoryType
Case wdMainTextStory, wdHeaderStory, wdEvenPagesFooterStory
‘ 検索処理を実行する
Case Else
‘ その他のストーリーは必要に応じてスキップする
End Select

最後に:あなたはもう「Wordの支配者」です

「メイン本文だけ」という呪縛から解き放たれると、Word VBAの景色は一変します。文書内のあらゆるテキストは、あなたのプログラムの手のひらの上で自在に踊るデータに変わるのです。

この `StoryRanges` をマスターしたあなたは、もはや定型作業に追われることはありません。次は、この置換ロジックを応用して、特定の書式設定やスタイルを動的に変更するスクリプトに挑戦してみてください。

何か分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、私は全力でサポートしますよ。

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