Word VBAの「ヘッダー・フッター」を完全に掌握する:LinkToPreviousの真実
こんにちは。Word VBAの世界へようこそ。
「マクロの記録」ボタンを押して生成された、冗長で意味不明なコードに頭を抱えたことはありませんか?
Wordのオブジェクトモデルは、Excelと違って「流れ(ストーリー)」の中に存在します。特に「セクション」と「ヘッダー・フッター」の関係は、多くの初学者が躓く魔の領域です。なぜなら、これらは目に見えるテキストだけでなく、「前セクションとの連鎖」という目に見えない結びつき(リンク)で制御されているからです。
今日は、この「LinkToPrevious」という呪縛を解き、ヘッダーを自在に操るための極意を伝授します。
—
1. なぜ「ヘッダー」は思い通りにならないのか?
Wordのヘッダーは、デフォルトで「前と同じヘッダー」という設定(`LinkToPrevious = True`)になっています。
これが何を意味するかというと、「セクション2のヘッダーを書き換えたら、セクション1のヘッダーまで書き換わった!」という現象です。
これに気づかずにマクロを組むと、文書全体が崩壊します。この「連鎖」を断ち切るのが、プロのエンジニアが最初に行う儀式です。
—
2. 現場で使える「ヘッダー独立化」の極意
ヘッダーを操作する際、最も重要なのは「どのセクションの、どのヘッダーを操作しているか」を明確に指定することです。以下のコードは、全セクションのリンクを解除し、個別のタイトルを挿入する実戦的なテンプレートです。
Sub BreakHeaderLinksAndApply()
Dim doc As Document
Dim sec As Section
Set doc = ActiveDocument
‘ 文書内の全セクションをループ処理
For Each sec In doc.Sections
‘ ヘッダーの編集モードに入る(メインヘッダーを対象とする)
With sec.Headers(wdHeaderFooterPrimary)
‘ 【重要】ここで前セクションとの連鎖を断ち切る
.LinkToPrevious = False
‘ 内容をクリアして新しい情報を書き込む
.Range.Text = “セクション ” & sec.Index & ” の専用ヘッダー”
.Range.ParagraphFormat.Alignment = wdAlignParagraphRight
End With
Next sec
MsgBox “全セクションのヘッダーを独立させました。”, vbInformation
End Sub
このコードの「設計思想」
- `wdHeaderFooterPrimary`: Wordには「奇数ページ」「偶数ページ」「先頭ページ」という概念がありますが、まずは基本である「プライマリ(通常)」を確実に指定します。
- `.LinkToPrevious = False`: これが伝説の呪文です。これを実行した瞬間、そのセクションは独立した個体として振る舞い始めます。
- `.Range`オブジェクトの活用: `Selection`を使わないのがプロの流儀です。`Selection`は画面上のカーソルを動かすため非常に低速でエラーも起きやすいですが、`.Range`はメモリ上で直接操作するため、圧倒的に高速で安定しています。
—
3. 初学者が陥りやすい「3つの罠」
現場でよく見る「動かない理由」を整理しました。これさえ知っていれば、あなたはもう初心者ではありません。
1. セクション区切りが存在しない: そもそもセクションが1つしかない場合、`LinkToPrevious`は無効です。まずは「レイアウト」タブからセクション区切りを挿入してください。
2. 表示モードの壁: VBAでヘッダーをいじっても、画面が「本文編集モード」のままだと変更が反映されないように見えることがあります。基本的にはコード内で制御できますが、デバッグ時は「ヘッダー領域」をダブルクリックして中身を確認する癖をつけましょう。
3. 「先頭ページ別設定」の存在: ページ設定で「先頭ページのみ別指定」にチェックが入っていると、`wdHeaderFooterPrimary`ではなく`wdHeaderFooterFirstPage`を操作する必要があります。例外処理を忘れないように。
—
4. プロへの第一歩:オブジェクトを「指定」する
マクロの記録が吐き出す `Selection.HeaderFooter…` という記述は、今すぐ捨てましょう。
代わりに、「どのドキュメントの、どのセクションの、どのヘッダーか」を明示的に変数に格納してください。
‘ プロの書き方:オブジェクトを明示する
Dim myHeader As HeaderFooter
Set myHeader = ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary)
myHeader.LinkToPrevious = False
myHeader.Range.Text = “高品質なドキュメント”
このように「名指し」でオブジェクトを操作することで、コードの可読性は劇的に向上し、意図しない場所が書き換わる事故もゼロになります。
—
最後に:自動化は「設計」が9割
Word VBAは、単なる「作業の代行」ではありません。文書の構造(オブジェクトモデル)を理解し、その流れを制御する「設計」の作業です。
今日学んだ `LinkToPrevious = False` という一行は、あなたのWord自動化の可能性を大きく広げるはずです。ぜひ、ご自身の業務で試してみてください。
「ここをクリアすれば、Word VBAの基本はバッチリですよ」。
また次の難問でお会いしましょう。あなたの開発が、より洗練されたものになることを願っています。
