小計行や商品種別の切り替わる行など、
データの区切りごとに改ページを挿入する方法を解説します。
※ 登場するPageBreakなどの改ページに関する基本コードについての解説は、
こちらのページをご覧ください。
準備中
○行ごとに改ページを挿入する
まずはじめに基本的な処理として、
指定行数ごとに改ページを挿入するコードがこちらです。
Sub 指定行数ごとに改ページを挿入する() Dim 印刷シート As Worksheet Set 印刷シート = ThisWorkbook.Worksheets("○○") ' 一旦すべての手動改ページを解除してから実行 印刷シート.ResetAllPageBreaks ' 例:5行目からスタートするデータに30行ごとに改ページを挿入する Dim 改ページ行数 As Long: 改ページ行数 = 30 Dim 最終行 As Long 最終行 = 印刷シート.UsedRange.Rows.Count + 印刷シート.UsedRange.Row - 1 Dim R As Long For R = 5 + 改ページ行数 To 最終行 Step 改ページ行数 印刷シート.Rows(R).PageBreak = xlPageBreakManual Next End Sub
データの区切りが規則正しく登場するシートの場合は、
このコードで改ページの挿入をおこなうことができます。
小計行などの区切りごとに改ページを挿入する
続いてシートレイアウトやセル値を判定し、
データ区切りごとに改ページを挿入するコードを紹介します。
例えば「データの小計行ごとに改ページを挿入する」コードがこちらです。
Sub 小計行ごとに改ページを挿入する() Dim ws印刷シート As Worksheet Set ws印刷シート = ThisWorkbook.Worksheets("○○") ' 一旦すべての手動改ページを解除してから実行 ws印刷シート.ResetAllPageBreaks Dim 最終行 As Long 最終行 = ws印刷シート.UsedRange.Rows.Count + ws印刷シート.UsedRange.Row - 1 Dim R As Long For R = 5 To 最終行 ' 小計行を判定して改ページを挿入(例:E列の右2文字が「小計」) If Right(ws印刷シート.Cells(R - 1, "E"), 2) = "小計" Then ws印刷シート.Rows(R).PageBreak = xlPageBreakManual End If Next End Sub
このコードで「小計行」ごとに改ページを挿入できます。
注意点として、途中の判定分が「R - 1」になっていることに注目してください。
PageBreakメソッドはExcelの改ページ挿入機能と同様、
実行したセル(行)の上側に改ページを挿入します。
小計行の下側に改ページを入れる場合は、
判定した行の「ひとつ前の行」で実行する必要があることに注意しましょう。
自動改行をデータの区切り位置に移動する
先ほどのデータは小計までの行数が大きかったため、
すべての小計に改ページを挿入しても問題がないデータでした。
対して、例えば小計が10行程度おきに設置されており、
すべての小計に改ページを挿入するわけにいかない場合もあります。
その場合は、自動改行が設置されている行を検索し、
その直前にある小計行で改ページの挿入を実行します。
この処理を行うコードがこちらになります。
Sub 中途半端な自動改ページを直前にある小計行へ移動する() Dim ws印刷シート As Worksheet Set ws印刷シート = ThisWorkbook.Worksheets("販売データ") ' 一旦すべての手動改ページを解除してから実行 ws印刷シート.ResetAllPageBreaks ' データの全行をループ Dim 最終行 As Long 最終行 = ws印刷シート.UsedRange.Rows.Count + ws印刷シート.UsedRange.Row - 1 Dim R_直前の改ページ候補 As Long: R_直前の改ページ候補 = 0 Dim R As Long For R = 5 To 最終行 ' 小計行を判定して改ページの候補として記憶 If Right(ws印刷シート.Cells(R - 1, "D"), 2) = "集計" Then R_直前の改ページ候補 = R End If ' 自動で改ページされた行を検知したらその直前にあった改ページ候補で改ページ If ws印刷シート.Rows(R).PageBreak = xlPageBreakAutomatic Then If R <> R_直前の改ページ候補 Then ' ※ タイミングがちょうどいい場合は挿入しない ws印刷シート.Cells(R_直前の改ページ候補, 1).PageBreak = xlPageBreakManual ' ※ 自動改ページはこの挿入で再設定されるので実際は「移動」する必要はない。 End If End If Next ' データの全行をループ End Sub
先ほどの「条件を満たす行ごとに改ページを挿入する」コードを改修し、
- 条件を満たす行を発見したら改ページ候補として変数に記憶
- 自動改ページを発見したら最後に見つけた改ページ候補に改ページを挿入
というロジックにしています。
こういった「ちょうどよい位置で改ページ」をしたいときは、
自動改ページを基準に改ページを設置すると綺麗に設定できます。
このような処理が必要な場面に遭遇したら、
上記のコードをカスタマイズして使用してください。