[Excel] VBAで改ページが思い通りに設定できない場合

ワークシートに改ページを設定する場合、以下のように指定することで、任意の位置で改ページさせることができます。

WorkSheets(1).HPageBreaks.Add Range("A10")
または
WorkSheets(1).Rows(10).PageBreak = xlPageBreakManual

上記例の場合、10行目から次のページ、つまり9行目と10行目の間で改ページします。

しかし、上記の指定をしても改ページが追加されず、なぜか何百行もあるシート全体が1ページになってしまい、頭を悩ませました。

また同じことで悩まないためにも、解決までの道のりをメモメモ。

改ページさせるための方法

シートに水平な改ページを追加するには、上でも書きましたが二通りの方法があります。

WorkSheets(1).HPageBreaks.Add Range("A10")
WorkSheets(1).Rows(10).PageBreak = xlPageBreakManual

どちらも、9行目と10行目の間で改ページする指定方法です。

同様に、垂直方向に改ページする場合は、以下のように指定します。

WorkSheets(1).VPageBreaks.Add Range("E10")
WorkSheets(1).Range("E10").PageBreak = xlPageBreakManual

どちらも、D列とE列の間に改ページを追加します。が、下の方法だと、9行目と10行目にも改ページが設定されてしまうので、垂直方向だけに改ページを設定したい場合は上の方法で。

しかし、上記のように改ページだけを指定しても、改ページが設定されない現象に悩まされました。

改ページのリセットをしてみる

改ページの設定を初期化していないからダメなんだろう、と思い、初期化処理の中で改ページのリセットを行ってみました。

WorkSheets(1).ResetAllPageBreaks

それでも改ページは、されません。

印刷エリアを設定してみる

印刷するエリアを指定していなかったからダメなんだろう、と思い、設定してみました。

WorkSheets(1).PrintArea = "A:G"

それでも改ページは、されません。

ページフィットを設定してみる

印刷の拡大縮小設定で、用紙の横方向にフィットさせる設定、縦方向にフィットさせる設定があるので、横方向に1ページフィット、縦方向は自動にしてみました。

WorkSheets(1).FitToPagesWide = 1 '横方向1ページにフィット
WorkSheets(1).FitToPagesTall = False '縦方向は自動

改ページされました!…が、意図してつけた改ページの場所では用紙に収まりきらないようで、Excel側で自動でつけてくれた点線の改ページが出てしまいました。これではダメ。

拡大縮小率を設定してみる

Excelのリボンでページレイアウトを見ていたところ、「拡大/縮小」が100%になっていることに気付きました。この拡大縮小率が自動になれば、もしかしたら意図した改ページ位置で揃うかも。

WorkSheets(1).PageSetup.Zoom = False

ここでは拡大縮小率を10~400で指定しますが、Falseにすることで設定しない(自動にする)ことができます。

意図した通りに改ページされ、勝手に余計な改ページも無くなりました!

さいごに

ということで、他の指定も含め、ページの初期化処理で以下のようにしたところ、意図した改ページが反映されるようになりました。

With WorkSheets(1)
    .Cells.Clear
    With .PageSetup
        .PrintArea = "A:G"
        .CenterHorizontally = True
        .CenterVertically = True
        .FitToPagesWide = 1
        .FitToPagesTall = False
        .Zoom = False
        .TopMargin = Application.CentimetersToPoints(1)
        .BottomMargin = Application.CentimetersToPoints(1)
        .LeftMargin = Application.CentimetersToPoints(3)
        .RightMargin = Application.CentimetersToPoints(2.5)
        .HeaderMargin = Application.CentimetersToPoints(1.3)
        .FooterMargin = Application.CentimetersToPoints(1.3)
    End With
    .ResetAllPageBreaks
    .HPageBreaks.Add Range("A101")
    .HPageBreaks.Add Range("A201")
End With

ちなみに、Zoom = False に設定した場合は、シートの拡大縮小率は FitToPagesWide と FitToPagesTall に依存するようになるため、3つワンセットで指定する、と考えていた方がいいのかも。

結構悩まされた事案でした。

初稿:2020年5月14日