【入門編】【中級者向け】表のヘッダー行を各ページに自動で繰り返す設定のVBA制御 – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手でドキュメントを意のままに操りたい」と願うあなたへ、今日はとても実用的で、現場で必ず直面するテーマをお届けします。

テーマは「長い表のヘッダー行を、各ページに自動で繰り返す設定のVBA制御」です。

数百行にも及ぶ巨大な表をWordで作ったとき、2ページ目以降に「あれ?この列の数値は何だっけ?」と手が止まってしまった経験はありませんか?
手動であれば、表のプロパティから「行」タブを開き、「各ページの先頭にタイトル行を表示する」にチェックを入れれば解決します。しかし、これをVBAの動的な表生成のプロセスに組み込み、一瞬で美しく仕上げるのがプロの仕事です。

ここをクリアすれば、Word VBAのオブジェクト構造の本質がグッと見えてきますよ。さあ、一緒にマスターしていきましょう!

—

1. なぜ「ヘッダーの繰り返し」をVBAで制御する必要があるのか?

私たちがVBAで表(Table)を扱うとき、多くの場合「データ量に応じて行が動的に増える」仕組みを作ります。
例えば、データベースやExcelから数千件のレコードを読み込んでWordの表に流し込むようなケースです。

もし、この動的に生成された表に対してヘッダーの繰り返し設定を忘れるとどうなるでしょう?
生成された数ページにわたるドキュメントを、人間が一つひとつ手動で設定し直す……。そんな不毛な残業は、今日で終わりです。コードの実行と同時に、何ページの表になろうとも、すべてのページの先頭にヘッダーがピシッと継承される。 この状態をコードで完結させるのが、今回のゴールです。

—

2. Word VBAにおける「ヘッダー繰り返し」の正体

Wordのオブジェクトモデルにおいて、行(Row)は非常に強力なプロパティを持っています。
手動で設定するあのチェックボックスは、VBAの世界では`HeadingFormat`というプロパティ(ブール値:True / False)に直結しています。

  • `Row.HeadingFormat = True`:その行を「ヘッダー(見出し)行」としてマークし、ページが分かれた際にも自動的に先頭に再掲させる。

これだけ聞くと「なんだ、簡単じゃないか」と思われるかもしれません。しかし、ここにWord VBA特有の「罠」が潜んでいます。

⚠️ 中級者が必ずハマる「行インデックス」の罠

「1行目をヘッダーにすればいいんだな、`Table.Rows(1).HeadingFormat = True`だ!」
そう書いて実行すると、予期せぬエラーや、なぜか上手くいかない現象に直面します。

Wordの表では、「すでにセルが結合されている行」や「表の構造が複雑な場合」、単純なインデックス指定だけでは意図した行を正確に捉えられないことがあります。また、マルチページにまたがる表を安全に制御するためには、「どの範囲の行をヘッダーにするか」を明確に指定してあげる必要があるのです。

—

3. 【実践】動的表生成 + ヘッダー自動繰り返しの全コード

それでは、実際に動く実用的なコードを見てみましょう。
このコードは、新規文書を作成し、3行のヘッダー(例:階層構造を持つ見出し)を持つ表を動的に生成し、それらを確実に「各ページで繰り返し表示する」設定を行うプロシージャです。

Sub CreateTableWithRepeatingHeader()
Dim doc As Document
Dim tbl As Table
Dim targetRow As Row
Dim i As Long

‘ 1. 新規ドキュメントを作成
Set doc = Documents.Add

‘ 2. 5行(うち上部2行をヘッダーとする)× 4列の表を文書の先頭に作成
‘ ※実際の業務では、ここにループ処理で動的に行を追加していきます
Set tbl = doc.Tables.Add(Range:=doc.Range(0, 0), NumRows:=10, NumColumns:=4)

‘ 表のデザイン(見やすさのためにグリッドを適用)
tbl.Style = “テーブル (グリッド)”

‘ 3. 【核心】1行目と2行目を「各ページで繰り返すヘッダー行」に指定する
‘ —————————————————————–
‘ ポイント:HeadingFormatは行(Rowオブジェクト)単位で設定します。
‘ 複数行をヘッダーにする場合は、それぞれにTrueを指定します。
‘ —————————————————————–
For i = 1 To 2
Set targetRow = tbl.Rows(i)

‘ ヘッダー行としての属性を付与
targetRow.HeadingFormat = True

‘ ついでに、ページを跨ぐ際にヘッダー行の途中で改行されないようにする設定
targetRow.AllowBreakAcrossPages = False
Next i

‘ 4. サンプルとしてヘッダー行に文字を流し込む
tbl.Cell(1, 1).Range.Text = “大分類”
tbl.Cell(1, 2).Range.Text = “中分類”
tbl.Cell(1, 3).Range.Text = “詳細項目”
tbl.Cell(1, 4).Range.Text = “ステータス”

‘ 5. データ行にダミーデータを流し込む(ページを跨ぐシミュレーション)
For i = 3 To 10
tbl.Cell(i, 1).Range.Text = “カテゴリA”
tbl.Cell(i, 2).Range.Text = “サブカテゴリ” & (i – 2)
tbl.Cell(i, 3).Range.Text = “詳細な説明テキストがここに入ります…”
tbl.Cell(i, 4).Range.Text = “未完了”
Next i

‘ 完了メッセージ
MsgBox “表の生成とヘッダーの繰り返し設定が完了しました!”, vbInformation, “処理成功”

‘ オブジェクトの解放
Set targetRow = Nothing
Set tbl = Nothing
Set doc = Nothing
End Sub

—

4. コードの解説とエンジニアとしての知見

上記のコードで、特に注目してほしいポイントを解説します。

① 複数行のヘッダーにも完全対応

実務の帳票や報告書では、「1行目:大見出し、2行目:小見出し」といったように、ヘッダーが2行以上あるケースがよくあります。
今回のコードでは `For i = 1 To 2` というループを回すことで、複数行にわたるヘッダーに対しても一括で `HeadingFormat = True` を適用しています。このアプローチを知っていれば、どんな複雑なレイアウトの表でも怖くありません。

② `AllowBreakAcrossPages = False` の重要性

地味ですが非常に強力なのが、`targetRow.AllowBreakAcrossPages = False` という設定です。
これは、「ヘッダー行の途中でページが分断される(=中途半端なところで次のページに送られる)のを禁止する」プロパティです。これを設定しておくことで、ヘッダーの見た目の美しさとレイアウトの崩れを完全に防止できます。プロならではの細かい配慮ですね。

—

5. ありがちなエラーと回避のためのチェックリスト

現場でこのコードや応用コードを実装する際、次のような壁にぶつかることがあります。事前に知っておけば慌てず対処できます。

  • エラー「インデックスが範囲外です」が出る
  • 原因: 指定した行番号(例: `tbl.Rows(3)` など)が、実際に生成された表の総行数を超えている場合。
  • 対策: `NumRows` の数や、動的に追加した行の総数(`tbl.Rows.Count`)を事前に `Debug.Print` などで確認する癖をつけましょう。
  • 「設定したはずなのに、2ページ目以降にヘッダーが出ない……」
  • 原因: そもそも表が1ページ内に収まっていて、ページを跨いでいないケース(笑)。あるいは、文書の表示モードが「Webレイアウト」になっている場合。
  • 対策: Wordの表示を「印刷レイアウト」に切り替えて確認してください。また、ダミーデータを増やして強制的にページを跨がせて動作テストを行いましょう。
  • もう一つの原因: 結合セル(Merge)が含まれる表で、1行目のセル結合が特殊な状態になっていると、Wordの仕様上うまく機能しないことがあります。可能な限り、表の最上部(ヘッダー部分)のセル結合は単純な構造に保つのが鉄則です。

—

おわりに

今回は、Wordの表における「ヘッダー行の自動繰り返し設定」をVBAで制御する方法を解説しました。

「たった1行のプロパティ設定(`HeadingFormat = True`)」ではありますが、これを動的な表生成のロジックに組み込めるかどうかが、マクロの記録に頼る初級者と、現場をシステムで自動化する中級者以上の大きな分かれ道です。

ここをクリアしたあなたなら、膨大なページ数のレポートや請求書、仕様書作成の自動化も、もう怖くないはずです。ぜひご自身の開発環境で試してみてくださいね。

それでは、快適なWord VBAライフを!

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