和風スパゲティのレシピ

日本語でコーディングするExcelVBA

データの区切りごとに改ページを挿入する

小計行や商品種別の切り替わる行など、
データの区切りごとに改ページを挿入する方法を解説します。


※ 登場する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行程度おきに設置されており、
すべての小計に改ページを挿入するわけにいかない場合もあります。

ちょうど1P程度になるようデータ区切りに改ページを挿入


その場合は、自動改行が設置されている行を検索し、
その直前にある小計行で改ページの挿入
を実行します。


この処理を行うコードがこちらになります。

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

先ほどの「条件を満たす行ごとに改ページを挿入する」コードを改修し、

  1. 条件を満たす行を発見したら改ページ候補として変数に記憶
  2. 自動改ページを発見したら最後に見つけた改ページ候補に改ページを挿入

というロジックにしています。


こういった「ちょうどよい位置で改ページ」をしたいときは、
自動改ページを基準に改ページを設置すると綺麗に設定できます。

このような処理が必要な場面に遭遇したら、
上記のコードをカスタマイズして使用してください。