【入門編】【中級者向け】表の行数がページを跨ぐ際の改ページ位置をVBAで制御する – Word VBA解析バイブル

スポンサーリンク

こんにちは。業務自動化の深淵へようこそ。
私は長年、数えきれないほどのドキュメント生成エンジンを設計してきましたが、多くのエンジニアが最初に行き詰まるのが「Wordの表(Table)」の制御です。

Excelのセルは「箱」ですが、Wordの表は「流れ(フロー)」の一部です。特に、表がページを跨ぐ際の挙動を制御できるようになると、あなたのVBAスキルは「記録マクロのつぎはぎ」から「プロフェッショナルな動的生成」へと昇華します。

今日は、中級者への登竜門である「表の改ページ位置の完全制御」について、その本質を紐解いていきましょう。ここをクリアすれば、Word VBAの基本はバッチリですよ。

—

なぜWordの表はレイアウトが崩れるのか?

Wordは「文字が溢れたら次の行へ、行が溢れたら次のページへ」という流動的な性質を持っています。表も例外ではありません。

デフォルトの状態では、Wordは「1つの行の途中で改ページする」ことすら許容してしまいます。これが「1行のテキストがページを跨いで泣き別れになる」原因です。

これを防ぎ、意図したタイミングで改ページを挿入するには、以下の3つの武器を使いこなす必要があります。

1. `AllowBreakAcrossPages` プロパティ: 行の途中で改ページを許すかどうか。
2. `HeadingFormat` プロパティ: 次のページにもタイトル行を表示するかどうか。
3. `ParagraphFormat.PageBreakBefore`: その行の直前で強制的にページを変える。

—

実践:表の改ページを制御するプロフェッショナル・ロジック

では、実際にコードを見てみましょう。
今回のコードは、「データを流し込みながら、特定の行数ごとに、あるいはページ末尾で美しく改ページを制御する」ロジックです。

Sub MasterTablePagination()
Dim doc As Document
Set doc = ActiveDocument

‘ 1. 表の作成(50行3列のサンプル)
Dim tbl As Table
Set tbl = doc.Tables.Add(Range:=doc.Range(0, 0), NumRows:=50, NumColumns:=3)

‘ パフォーマンス向上のため画面更新を停止
Application.ScreenUpdating = False

‘ 表の基本設定
With tbl
.Borders.Enable = True
.Rows.AllowBreakAcrossPages = False ‘ 【重要】行の途中での改ページを禁止

‘ 1行目をヘッダーとして設定
.Rows(1).HeadingFormat = True
.Cell(1, 1).Range.Text = “ID”
.Cell(1, 2).Range.Text = “項目名”
.Cell(1, 3).Range.Text = “備考”
.Rows(1).Shading.BackgroundPatternColor = wdColorGray10
End With

‘ 2. データの流し込みと改ページ制御
Dim i As Long
Dim currentPage As Integer
Dim lastPage As Integer

‘ 最初のページ番号を取得
lastPage = tbl.Rows(1).Range.Information(wdActiveEndPageNumber)

For i = 2 To tbl.Rows.Count
‘ データの流し込み(デモ用)
tbl.Cell(i, 1).Range.Text = i – 1
tbl.Cell(i, 2).Range.Text = “自動生成データ_” & i

‘ 【ここが核心】現在の行が何ページ目にあるかを確認
currentPage = tbl.Rows(i).Range.Information(wdActiveEndPageNumber)

‘ もしページが変わっていたら、その行に特定の処理を行う
If currentPage > lastPage Then
‘ 例えば、ページが変わる直前の行に「次ページへ続く」と入れたり、
‘ 特定の行で強制的に改ページしたい場合はここで制御します。

‘ 今回は「10行ごとに強制改ページ」するロジックを例示します
If (i – 1) Mod 10 = 0 Then
‘ 行の最初の段落に対して「その前で改ページ」を指示する
tbl.Rows(i).Range.ParagraphFormat.PageBreakBefore = True
End If

lastPage = currentPage
End If
Next i

Application.ScreenUpdating = True
MsgBox “表の生成とレイアウト調整が完了しました。”
End Sub

—

深淵なる解説:コードの急所

1. `Rows.AllowBreakAcrossPages = False`

これが「表使い」の第一歩です。これを `False` に設定しないと、セルの途中でページが切れてしまい、非常に見栄えの悪い書類になります。「1つの行(Row)は、常に同じページ内に収める」。これが鉄則です。

2. `HeadingFormat = True`

複数ページにまたがる表で、2ページ目以降にも自動的に「見出し」を表示させる魔法のプロパティです。これを忘れると、読者は2ページ目以降、どの列が何の値か分からなくなります。

3. `Information(wdActiveEndPageNumber)`

Word VBAにおいて、オブジェクトが「今、何ページ目にいるか」を知るための唯一にして最強の手段です。ただし、このプロパティにアクセスするたびにWordはレイアウト計算を行うため、多用すると動作が重くなります。今回のように「ページが変わった瞬間」を検知するトリガーとして使うのが最もスマートです。

4. `PageBreakBefore = True`

「ここに改ページを挿入する」のではなく、「この行(段落)は必ず新しいページの先頭から始める」という制約を与えるプロパティです。Word VBAで表の中に `wdPageBreak` を無理やり挿入すると、表が分裂してしまい管理が困難になります。このプロパティを使うことで、「表としての連続性を保ったまま、見た目だけ改ページさせる」ことが可能になります。

—

陥りやすいエラーと回避策

  • 無限ループの罠: 改ページを挿入したことでページ数が変わり、再び `Information` プロパティが反応して…というループに陥ることがあります。位置の判定は必ず「上から下へ」一方向で行いましょう。
  • セルの結合(Merge)との相性: セルを縦に結合している場合、`Rows(i)` でのアクセスがエラーになることがあります。動的な表生成では、「結合はすべてのデータ流し込みと改ページ制御が終わった最後に行う」のが定石です。

終わりに

Word VBAは、Excel VBAに比べて「見えないルール(レイアウトエンジン)」との戦いが多い領域です。しかし、今回紹介した `PageBreakBefore` や `Information` プロパティをマスターすれば、まるで魔法のように美しい書類を自動で量産できるようになります。

「マクロの記録」では絶対に辿り着けない、この「構造的な制御」。
ぜひあなたの現場のコードに取り入れてみてください。次は、セルの結合を動的に制御するテクニックでお会いしましょう。

一歩ずつ、確実に。Word VBAをあなたの最強の武器にしていきましょう!

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