和風スパゲティのレシピ

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

改ページを挿入・解除・位置取得する-PageBreak

印刷時の改ページを挿入・解除したり、位置を取得する方法を解説します。

WorksheetオブジェクトのH/VPageBreaksプロパティを使う方法と、
RangeオブジェクトのPageBreakプロパティを使う2つの方法があります。

改ページを挿入する

基本コード

例えば改ページを21行目と20行目の間に挿入する場合は、
以下のいずれかのコードを実行します。

Worksheets("○○").Rows(21).PageBreak = xlPageBreakManual
Worksheets("○○").HPageBreaks.Add Worksheets("○○").Rows(21)


改ページの設定はRangeオブジェクトのPageBreakプロパティを使う方法と、
WorksheetオブジェクトのHPageBreaksプロパティを使う二つの方法があります。

どちらを使用しても結果は同じになりますので、
その時取得しているオブジェクトで呼びやすい方で実行すればOKです。


改ページの挿入をワークシート上で実行する場合と同様、
改ページの下のセルで実行する必要がある点にご注意ください。
(21行目と20行目の間に入れたければ21行目で実行します)


改ページを挿入する基本コードは上記の通りですが、
以下のコードでも同じ処理を実行することができます。

' Trueを代入しても同じ処理
Worksheets("○○").Rows(21).PageBreak = True

' A列のセルを渡しても同じ処理
Worksheets("○○").Range("A21").PageBreak = xlPageBreakManual
Worksheets("○○").HPageBreaks.Add Worksheets("○○").Range("A21")

' HPageBreaksの方は「H方向」しか設定できないため21行目ならどのセルでも同じ処理
Worksheets("○○").HPageBreaks.Add Worksheets("○○").Range("C21")

これらの書き方は少々トリッキーなので注意して使ってください。



同様にJ列とK列の間に挿入する場合は以下のコードを実行します。

Worksheets("○○").Columns("K").PageBreak = xlPageBreakManual
Worksheets("○○").Columns(11).PageBreak = xlPageBreakManual
Worksheets("○○").VPageBreaks.Add Worksheets("○○").Columns("K")
Worksheets("○○").VPageBreaks.Add Worksheets("○○").Columns(11)

仕様や注意点は行の改ページを設定するときと同様です。


なお、行が「H」PageBreaks列が「V」PageBreaksです。

「ページを上下に分ける」と捉えると行をVerticalと考えてしまうかもしれませんが、
「ページを水平方向に切る」という意味合いになっており行はHorizonを使用します。

「アプリケーション定義またはオブジェクト定義のエラーです」が発生した場合は、
VとHを取り違えてないかをまずは確認してください。


最後に、RangeオブジェクトのPageBreakプロパティを使う場合は、
単独セルを渡すと行列の改ページを両方同時に挿入できます。

Worksheets("○○").Rows(21).PageBreak = xlPageBreakManual
Worksheets("○○").Columns("K").PageBreak = xlPageBreakManual
' ⇕ 同じ処理
Worksheets("○○").Range("K21").PageBreak = xlPageBreakManual

こちらは滅多に行わない処理と思いますので、
どちらかと言えばこうならないように注意しておくべきポイントと思います。

意図しない改ページの挿入があった場合は、
この設定をしてしまっていないかを確認してください。

「PageBreak プロパティを設定できません」エラー

上記のコードを実行時、正しいコードを書けていたとしても、稀に

実行時エラー ‘1004’: Range クラスの PageBreak プロパティを設定できません。

エラーが発生することがあります。


これは印刷プレビューの描画が間に合わないことが原因で、
特に「シートを改ページプレビューで表示」していると発生しやすいようです。

このエラーを回避するには、

DoEvents
Worksheets("○○").Rows(21).PageBreak = xlPageBreakManual

と、改ページ挿入の直前に「DoEvents」メソッドを実行して、
実行直前にOSの描画を待ってあげることで解消することが多いです。


それでもエラーが解消しない場合は、

以下のコードで「改ページプレビューをやめてから実行」するか、

' アクティブシート(ウィンドウ)を 標準 モードに設定
Worksheets("○○").Activate
ActiveWindow.View = xlNormalView

以下のコードで「実行前に○秒待機」を入れて調整してみてください。

Application.Wait Now() + TimeValue("00:00:01")
DoEvents
Worksheets("○○").Rows(21).PageBreak = xlPageBreakManual

 

○行ごとに改ページを挿入する

○行ごとに改ページを挿入するサンプルコードがこちらです。

※ 後述する「一括解除」のコードも実行しています。

Sub データを30行ごとに改ページする()
    
    ' 一旦すべての手動改ページを解除してから実行
    Worksheets("○○").ResetAllPageBreaks
    
    ' 5行目からスタートするデータに30行ごとに改ページを挿入する
    Dim 最終行 As Long
    最終行 = Worksheets("○○").UsedRange.Rows.Count + Worksheets("○○").UsedRange.Row - 1
    Dim R As Long
    For R = 5 + 30 To 最終行 Step 30
    
        Worksheets("○○").Rows(R).PageBreak = xlPageBreakManual
    
    Next
    
End Sub

○行ごとに実行するような処理は、
ForステートメントのStep数を指定することで実装できます。

For R = 35 と書いてももちろんいいのですが、
For R = 5 + 30 とした方がStepと見比べて理解することができ、
○行ごとを変更する際にもどこを変更すればいいか一目瞭然になるのでおすすめです。

データの区切り(小計行など)ごとに改ページを挿入する

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

こういった表で各行の条件を判定して改ページを挿入する場合は、
本ページの「挿入」と「位置取得」を組み合わせて実行することになります。


実際のコードは下記のページに記載しましたので、
本ページと合わせてご参考ください。
www.limecode.jp

改ページを解除する

続いて改ページを解除する方法を解説します。

すべての改ページを一括で解除する方法と、
個別に改ページを解除する方法の2つがあります。

特定のシートのすべての改ページを一括で解除する

すべての改ページを一括で解除するには、
WorksheetオブジェクトのResetAllPageBreaksメソッドを実行します。

Worksheets("○○").ResetAllPageBreaks

このコードで指定したシートの手動改ページをすべて解除することができます。

特定の行の改ページを解除する

ある行に設定された改ページを解除するには、
以下のコードを実行します。

' 21行目の改ページ(20行と21行の間の改ページ)を解除するコード
Worksheets("○○").Rows(21).PageBreak = xlPageBreakNone

挿入時のコードで「xlPageBreakManual」としていた部分を、
「xlPageBreakNone」に書き換えたコードが改ページの解除コードになります。


また挿入時と同様、Falseを代入しても同じく改ページを解除することができます。

Worksheets("○○").Rows(21).PageBreak = False

 
挿入時に「True」と書くのは「自動/手動」どちらの改ページか紛らわしいのですが、
解除のコードは「False」で書いてしまっていいように思います。

特定の列の改ページを解除する

同様に列の改ページを解除するコードがこちらになります。

Worksheets("○○").Columns(21).PageBreak = xlPageBreakNone
Worksheets("○○").Columns(21).PageBreak = False

○番目の改ページを解除する

処理によっては「○番目の改ページ」を解除した方が早い場合もあります。

「HPageBreaks」オブジェクトは改ページを番号で指定できるため、
こちらを利用すると○番目の改ページを解除できます。

解除するにはHPageBreakオブジェクトのDeleteメソッドを実行します。

' 3番目の手動改ページを解除
Worksheets("○○").HPageBreaks(3).Delete

 

一点注意ですが、この「○番目」というのは手動改ページ内での付番です。

自動改ページが混じっている場合は、実際のページ数と一致しませんので、
この点に注意して実行してください。


行ではなく列に設定された改ページの解除は、以下のコードを実行して下さい。

' 3番目の手動改ページを解除
Worksheets("○○").VPageBreaks(3).Delete

 

奇数番目の改ページを解除する

上記を利用して、奇数番目の改ページを解除するコードがこちらです。

Sub 奇数番目の改ページを解除する()
    
    ' 最後の奇数番目改ページを取得
    Dim 解除する最初の改行番号 As Long
    解除する最初の改行番号 = Worksheets("○○").HPageBreaks.Count
    If WorksheetFunction.IsEven(解除する最初の改行番号) Then
        解除する最初の改行番号 = 解除する最初の改行番号 - 1
    End If
        
    ' 後ろから順に1つおきに改ページを解除
    Dim 改ページ番号 As Long
    For 改ページ番号 = 解除する最初の改行番号 To 1 Step -2
    
        Worksheets("○○").HPageBreaks(改ページ番号).Delete
    
    Next
    
End Sub

削除・解除系のコードはそれによって番号が変わってしまう恐れがあるので、
上記の通り後ろ側から実行していくのがセオリーです。
 

改ページの設定を調べる

最後に改ページの情報を取得する方法を解説します。

指定の行(列)に改ページがあるか調べる方法と、
改ページのリストを取得する方法の二つがあります。

指定行に改ページがあるか調べる

ある行に改ページがあるか調べるときは、PageBreakプロパティの値を判定します。

' 指定行に手動改ページが設定されているか判定
If Worksheets("○○").Rows(21).PageBreak = xlPageBreakManual Then

' 指定行に自動改ページが設定されているか判定
If Worksheets("○○").Rows(21).PageBreak = xlPageBreakAutomatic Then

' 指定行に自動・手動の改ページが設定されていないことを判定
If Worksheets("○○").Rows(21).PageBreak = xlPageBreakNone Then

改ページの設定では使用しなかった「xlPageBreakAutomatic」という値で、
自動改ページがあるかどうかを調べることもできます。

※ 自動改ページなので、この値を代入して改ページを設定することはできません。

列の改ページを調べたい場合は、
Rowsに変えてColumnsプロパティを使用してください。


PageBreakプロパティの値を判定する際に気を付けなければいけないのが、
設定時と違い、単独セルに対しては判定ができない点です。


改ページを設定する場合はRows(21)でもRange("A21")でも同じ動きでしたが、

If Worksheets("○○").Range("A21").PageBreak = xlPageBreakManual Then

こちらのコードは

実行時エラー ‘1004’: Range クラスの PageBreak プロパティを取得できません。

となります。

改ページの判定を行う場合は必ずRows/Columnsプロパティを使用してください。

改ページのリストを取得する

改ページがどの行に設定されているかを調べたい場合は、
H(V)PageBreaksプロパティで改ページのリストを取得する方法もあります。

H(V)PageBreaksプロパティを調べるコードがこちらです。

Dim 改ページ番号 As Long
For 改ページ番号 = 1 To Worksheets("○○").HPageBreaks.Count

    Debug.Print Worksheets("○○").HPageBreaks(改ページ番号).Location.Address
        ' $A$23、$A$35、$A$55、… とセルアドレスが返ります
    Debug.Print Worksheets("○○").HPageBreaks(改ページ番号).Location.Row
        ' 23、35、55、… と行番号が返ります

Next

H(V)PageBreaks(改ページ番号)で取得した改ページは、
その「Location」プロパティで設置セル(Range)を取得できます。

後はAddressやRowで位置情報を取得して使用してください。


なお、H(V)PageBreaks(改ページ番号)で指定した改ページは、
PageBeakオブジェクトとして取得できます。

よって、上記のコードは以下のように書いても動きます。

Dim 改ページ As PageBreak
For Each 改ページ In Worksheets("○○").HPageBreaks

    Debug.Print 改ページ.Location.Address
    Debug.Print 改ページ.Location.Row

Next

 
コレクションに対するFor Each文の基本的なコードですね。


こちらの方がスッキリかける場合も多いですが、
改ページの場合は「何番目の改ページか?」も大事だったりします。

その場合はFor EachではなくただのFor文で回す必要がありますので、
状況に応じて使い分けてください。



以上で改ページ(PageBreak)に関する解説を終わります。

大量の改ページを設定・解除する作業を手でやるのはかなり大変ですので、
そういった業務に遭遇したら、VBAを活用してみてください。