VBAで改ページを自動挿入するには、HPageBreaks.Add(横方向)またはVPageBreaks.Add(縦方向)を使います。「50行ごと」のような行数指定も、「部門が変わるたびに」のような条件指定も、どちらもFor文と組み合わせるだけで実現できます。
この記事では、次の内容を順番に解説します。
- 改ページの挿入・削除に使うメソッドの基本
- 一定行ごとに改ページを入れるコード
- 値が変わるタイミングで改ページを入れるコード
- 縦方向(列)の改ページを入れる方法
- 改ページをすべてクリアする方法
- よくある質問(改ページが消えない・印刷プレビューに反映されない等)
改ページの挿入・削除に使うメソッドを理解するには?
VBAで改ページを操作するには、主に次の2つを使います。
| 操作 | コード | 説明 |
|---|---|---|
| 横の改ページを挿入 | HPageBreaks.Add Before:=Rows(行番号) | 指定行の上に横の区切りを入れる |
| 縦の改ページを挿入 | VPageBreaks.Add Before:=Columns(列番号) | 指定列の左に縦の区切りを入れる |
| すべてクリア | ActiveSheet.ResetAllPageBreaks | 手動・自動含めてすべて削除 |
改ページを追加する前に必ず ResetAllPageBreaks でリセットする習慣をつけると、二重挿入や意図しない位置への挿入を防げます。
一定行ごとに改ページを入れるには?
「50行ごとに1ページにしたい」といった場合は、Stepを使って一定間隔で改ページを挿入します。
Sub InsertPageBreaks()
Dim lastRow As Long
Dim i As Long
Dim step As Long
step = 50 ' 何行ごとに改ページするか
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 既存の改ページをすべてクリア
ActiveSheet.ResetAllPageBreaks
' step行ごとに改ページを挿入
For i = step + 1 To lastRow Step step
ActiveSheet.HPageBreaks.Add Before:=Rows(i)
Next i
MsgBox "改ページを設定しました。"
End Sub
このコードの流れは次の通りです。
step変数で区切り行数を指定(変更したい場合はここだけ修正)Cells(Rows.Count, 1).End(xlUp).RowでA列の最終行を取得ResetAllPageBreaksで一旦すべてリセット- 51行目、101行目、151行目…と
Stepで飛ばしながら改ページを挿入
変数 step の値を変えるだけで、「30行ごと」「100行ごと」にも簡単に対応できます。
値が変わるタイミングで改ページを入れるには?
「部門ごと」「月ごと」のように、特定の列の値が変わるタイミングでページを切り替えたい場合は、前行との値比較を使います。
Sub InsertBreakByValue()
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
ActiveSheet.ResetAllPageBreaks
' A列の値が変わるタイミングで改ページを挿入(2行目以降)
For i = 2 To lastRow
If Cells(i, 1).Value <> Cells(i - 1, 1).Value Then
ActiveSheet.HPageBreaks.Add Before:=Rows(i)
End If
Next i
MsgBox "改ページを設定しました。"
End Sub
たとえば、A列に「営業部」「総務部」「経理部」とグループが入っている場合、部門が切り替わる行に自動で改ページが入ります。これにより、部門ごとに1ページ分の印刷資料を簡単に用意できます。
比較する列を変える場合は Cells(i, 1) の 1 の部分を変更してください(B列なら 2)。
縦方向(列)の改ページを入れるには?
列方向で区切りたい場合は VPageBreaks を使います。横幅の広い表を複数ページに分けて印刷したいときに便利です。
Sub InsertVPageBreak()
' E列(5列目)の左に縦の改ページを入れる
ActiveSheet.VPageBreaks.Add Before:=Columns(5)
MsgBox "縦の改ページを設定しました。"
End Sub
横の改ページ(行)と縦の改ページ(列)を組み合わせると、大きな表を複数のページにきれいに分割できます。
改ページをすべてクリアするには?
改ページをリセットしたいときは、ResetAllPageBreaks を使います。手動で入れた改ページも含めてすべて削除されます。
Sub ClearPageBreaks()
ActiveSheet.ResetAllPageBreaks
MsgBox "改ページをすべてクリアしました。"
End Sub
改ページの挿入マクロを実行する前にこれを呼び出す構成にしておくと、何度実行しても意図した位置だけに改ページが入るようになります。
まとめ
- 横の改ページには
HPageBreaks.Add Before:=Rows(行番号)を使う - 縦の改ページには
VPageBreaks.Add Before:=Columns(列番号)を使う - 実行前に
ResetAllPageBreaksでリセットする習慣をつける - 一定行ごとなら
Step、値が変わるタイミングなら 前行との比較 で対応 - 繰り返し印刷する定型資料ほど、自動化の効果が大きい
よくある質問
ResetAllPageBreaksを実行したのに改ページが残る場合は?
印刷範囲(PrintArea)が設定されている場合、その境界が改ページのように見えることがあります。ActiveSheet.PageSetup.PrintArea = "" で印刷範囲をクリアしてから再確認してください。
改ページが印刷プレビューに反映されない場合は?
改ページは印刷プレビューを一度開いてから挿入されるケースがあります。マクロの実行前後に印刷プレビューを開くか、ActiveSheet.PrintPreview をコードに含めることで強制的に反映させることができます。
HPageBreaksの数を確認する方法は?
MsgBox ActiveSheet.HPageBreaks.Count で現在設定されている横の改ページの数を確認できます。想定より多い場合は ResetAllPageBreaks でクリアして再設定してください。
特定の改ページだけを削除するには?
ActiveSheet.HPageBreaks(1).Delete のようにインデックスを指定して削除できます。ただし、複数の改ページがある場合は削除後にインデックスがずれるため、後ろから順に削除するか ResetAllPageBreaks で全削除してから再設定する方法が確実です。
改ページの挿入は行数が多いと遅くなる?
改ページの挿入自体は軽い処理ですが、ループ内で画面更新が走ると遅くなることがあります。Application.ScreenUpdating = False をコードの冒頭に入れて、最後に True に戻すと処理が速くなります。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



