【入門編】【中級者向け】ヘッダー・フッター内の文字列も漏らさず検索・置換するループ処理 – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」というフェーズを抜け出し、いざ自分でコードを書こうとしたとき、多くの人が最初にぶN壁があります。

それが、「本文は置換できたのに、ヘッダーやフッターの文字がそのまま残ってしまった…!」という現象です。

実は、Wordのドキュメント構造は、私たちが普段見ているキャンバス(メインストーリー)と、裏舞台である「ヘッダー・フッター」「セクション」が別々のオブジェクトとして管理されています。そのため、普通の置換処理だけでは、裏舞台に隠れた文字列に届かないのです。

今回は、セクションやヘッダー・フッターの構造を完全に網羅し、文書全体の文字列を「漏れなく」一網打尽にするためのテクニックを、優しく丁寧にお伝えします。
ここをクリアすれば、Word VBAのオブジェクト操作の核心がグッと掴めますよ!

1. なぜ、ヘッダー・フッターの置換は一筋縄ではいかないのか?

Wordの文書(`Document`)は、一枚の紙のように見えて、実は「セクション(Section)」という単位の集まりでできています。

そして、各セクションには、それぞれ独立した「ヘッダー(Header)」と「フッター(Footer)」が存在します。さらに言うと、1つのセクションの中にも、

  • 「先頭ページのみ」のヘッダー
  • 「偶数ページ」のヘッダー
  • 「奇数ページ(または標準)」のヘッダー

という最大3つの顔(`WdHeaderFooterIndex`)を持っています。

つまり、文書全体を完全に置換したいのであれば、「メイン本文の旅」を終えたあと、「すべてのセクションの扉を開け、その中にあるすべてのヘッダー・フッターの裏舞台をくまなく捜索する旅」をプログラムにさせなければならないのです。

2. 【実践】文書全体をもれなく置換する完全版マクロ

それでは、実際のコードを見てみましょう。
開発の現場でそのままコピペして、自分のファイルですぐにテストできるように、実用的なエラー対策と処理完了のメッセージも組み込んであります。

Sub ReplaceAllIncludingHeadersFooters()
Dim rngStory As Range
Dim sec As Section
Dim hf As HeaderFooter

‘ 検索・置換するキーワードの設定
Dim targetStr As String
Dim replaceStr As String

targetStr = “2023年度” ‘ 探したい文字列
targetStr = “2024年度” ‘ 置き換えたい文字列

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お約束のテクニック!)
Application.ScreenUpdating = False

‘ —————————————————-
‘ 1. メインストーリー(本文)の置換
‘ —————————————————-
For Each rngStory In ActiveDocument.StoryRanges
‘ StoryRangesには本文、脚注、コメントなど様々な種類が含まれるため
‘ ループを回して個別にFindオブジェクトを適用します
Do
With rngStory.Find
.Text = targetStr
.Replacement.Text = replaceStr
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
‘ 一括置換を実行
.Execute Replace:=wdReplaceAll
End With

‘ 連結されたストーリー(続きのテキストボックスなど)が存在する場合に備える
Set rngStory = rngStory.NextStoryRange
Loop Until rngStory Is Nothing
Next rngStory

‘ —————————————————-
‘ 2. すべてのセクションのヘッダー・フッターを走査
‘ —————————————————-
For Each sec In ActiveDocument.Sections

‘ — ヘッダーの処理 (3種類のパターンをすべて網羅) —
For Each hf In sec.Headers
If hf.Exists Then ‘ ヘッダーが有効に存在する場合のみ実行
Call ExecuteFindReplace(hf.Range, targetStr, replaceStr)
End If
Next hf

‘ — フッターの処理 (3種類のパターンをすべて網羅) —
For Each hf In sec.Footers
If hf.Exists Then ‘ フッターが有効に存在する場合のみ実行
Call ExecuteFindReplace(hf.Range, targetStr, replaceStr)
End If
Next hf

Next sec

‘ 画面描画の再開
Application.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “本文およびすべてのヘッダー・フッターの置換が完了しました!”, vbInformation, “処理成功”

End Sub

‘ —————————————————————–
‘ 共通の置換処理を実行するヘルパープロシージャ
‘ —————————————————————–
Private Sub ExecuteFindReplace(ByVal targetRange As Range, ByVal findText As String, ByVal repText As String)
With targetRange.Find
.Text = findText
.Replacement.Text = repText
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.Execute Replace:=wdReplaceAll
End With
End Sub

3. コードのポイントを優しく解説!

初心者の方でも「なるほど!」と腑に落ちるように、重要なポイントを3つに絞って解説します。

① `ActiveDocument.StoryRanges` で本文を網羅する

Wordの「本文」は、実は1つの巨大なテキストボックスのようなものです。文書が途中で切れていたり(セクション区切りによる段落の分断など)、複数のストーリーに分かれている場合があるため、`For Each rngStory In ActiveDocument.StoryRanges` と `Do … Loop` を使って、その文書にあるすべてのテキストエリアをもれなく拾い上げています。

② セクションの中にある「ヘッダー・フッターのコレクション」を回す

文書にセクションが3つあれば、ヘッダーもフッターもそれぞれのセクションに属しています。
`For Each sec In ActiveDocument.Sections` でセクションを1つずつ取り出し、その中にある `sec.Headers` と `sec.Footers` をさらにループで回すことで、取りこぼしを完全に防ぎます。

③ `hf.Exists` という安全装置

ここが実務でめちゃくちゃ重要なポイントです。
Wordでは、セクションごとに「前ページと同じヘッダーを使う(リンクの設定)」という状態があります。リンクが切れていない場合や、そもそもヘッダーが使われていない状態で `.Range` にアクセスすると、VBAがエラーを起こして止まってしまいます。
そのため、`If hf.Exists Then` という「そこにお部屋(ヘッダー)が存在するか確認してから入る」という安全装置を必ず挟むのがプロの技です。

4. 陥りやすいエラーと対処法

Q. 「オブジェクト変数または With ブロック変数が見つかりません」と怒られます

A. コードの中にある `targetStr` や `replaceStr` の定義、あるいはプロシージャの呼び出し部分(`Call ExecuteFindReplace`)のスペルミスを確認してください。また、`Private Sub` として定義したヘルパープロシージャが、同じ標準モジュール内に正しく配置されているかもチェックポイントです。

Q. 実行したのに、一部のヘッダーの文字が変わりません

A. そのセクションのヘッダーで、「前とおなじヘッダー(Link to Previous)」が有効になっている場合、大元のセクションのヘッダーが優先されます。基本的には今回のコードですべて網羅できますが、特殊な表組みの中や、図形(テキストボックス)の中に文字が入っている場合は、さらに別のストーリーレンジ(`wdTextFrameStory`など)を考慮する必要があります。まずは基本のヘッダー・フッター制覇から始めてみてくださいね。

まとめ

今回は、Word VBAにおける「ヘッダー・フッター・セクション」の概念を紐解き、文書全体を完璧に置換するロジックを解説しました。

  • メインの本文だけでなく、`StoryRanges` を走査する
  • セクションごとの `Headers` / `Footers` をループで回す
  • `hf.Exists` でエラーを華麗にガードする

この3つさえ押さえておけば、どんなに複雑な複数ページの報告書や契約書であっても、一瞬で文字を書き換える強力な自動化ツールが作れるようになります。

「マクロの記録」の向こう側へ行く第一歩として、ぜひご自身の環境で試してみてください。あなたの事務作業が、もっとスマートで楽しいものになりますように!

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