n行毎の改ページ設定 「実行時エラー1004 RangeクラスのPageBreakプロパティを設定できません」の原因(Excel VBA)

【本日のミッション】

Excel VBAにて印刷タイトルが設定してある表に、n行毎の改ページを設定せよ。

また、それが「実行時エラー ‘1004’: Range クラスの PageBreak プロパティを設定できません。」が出ないようにせよ。

ミッションの概要

下記のような表とグラフのデータがあります。

  1. グラフとデータのある部分を全て印刷範囲にする。
  2. 1行目を印刷タイトル行に設定し(青枠部)、3つのグラフ(データ部36行)毎(赤枠部)に改ページを設定する。
  3. データ件数が少ない場合はいいのですが、Loop処理が多くなる場合、「実行時エラー ‘1004’: Range クラスの PageBreak プロパティを設定できません。」で止まる場合があります。エラーで止まらない対策をしておきます。

ミッション完了後のプレビューです。
全ページに、1行目がタイトル行に設定され、グラフ3つで1ページになります。

プロシージャ

Sub 改ページ()
    '【変数】
    'ワークシート関連
    Dim ws As Worksheet
    
    '行列関連
    Dim e_row As Long       '最終行
    Dim e_col As Long       '最終列
    Dim t_row As Long       '改ページ対象行
    Dim r_ct As Long        'タイトル行を除く1ページの行数
    
    'その他
    Dim page_no As Long     'ページ番号
    
    Application.ScreenUpdating = False
    
    '■変数セット
    Set ws = ActiveSheet
    e_row = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row   '最終行
    e_col = 11      '最終列
    r_ct = 36       'タイトル行を除く1ページの行数
    page_no = 1     'ページ番号

    '■現在の改ページ解除
    ws.ResetAllPageBreaks

   '■改ページプレビュー 
    ActiveWindow.View = xlPageBreakPreview 
    
    '■印刷設定
    With ws.PageSetup
        .PrintArea = ws.Range(ws.Range("A1"), ws.Cells(e_row, e_col)).Address   '印刷範囲
        .PrintTitleRows = "$1:$1"       'タイトル行
    End With
    
    '■最終行まで改ページ設定
    t_row = page_no * r_ct + 2  '改ページ対象行
    Do While t_row <= e_row
        DoEvents         ’エラー予防
        ws.Rows(t_row).PageBreak = xlPageBreakManual    '改ページ挿入
        page_no = page_no + 1       'ページ番号+1
        t_row = page_no * r_ct + 2  '改ページ対象行
    Loop

    Application.ScreenUpdating = True
    
End Sub

印刷設定

With ws.PageSetup
    .PrintArea = ws.Range(ws.Range("A1"), ws.Cells(e_row, e_col)).Address   '印刷範囲
    .PrintTitleRows = "$1:$1"       'タイトル行
End With

【印刷範囲の設定】

ワークシートオブジェクト.PageSetup.PrintArea = セル範囲.address(A1形式 文字列)

【タイトル行の設定】

ワークシートオブジェクト.PageSetup.PrintTitleRows = 行範囲(A1形式 文字列)

改ページ設定

【改ページ解除】
ワークシートオブジェクトの全ての改ページを解除します。

ワークシートオブジェクト.ResetAllPageBreaks

【改ページプレビュー】
改ページプレビューにします。

ActiveWindow.View = xlPageBreakPreview

【改ページ設定】
指定したRangeオブジェクトの上に水平、左に垂直の改ページを設定します。
改ページが設定できないセル・行・列を指定した場合、エラーになります。

改ページを設定するRangeオブジェクト.PageBreak = xlPageBreakManual

今回は、t_row行の上に改ページが設定されます。

t_row = page_no * r_ct + 2  '改ページ対象行
Do While t_row <= e_row
    DoEvents         ’エラー予防
    ws.Rows(t_row).PageBreak = xlPageBreakManual    '改ページ挿入
    page_no = page_no + 1       'ページ番号+1
    t_row = page_no * r_ct + 2  '改ページ対象行
Loop

印刷タイトル行:1行目(青枠行)
印刷タイトル行を除く1ページの印刷行数 r_ct :36行(橙部縦)
印刷列数 e_col:11列(橙部横)
改ページを設定する行 t_row:page_no * r_ct + 2(緑枠行)

1行目を印刷タイトル行にしているため、2行目以降のデータ行を36行毎に、最終行まで改ページを挿入するコードにしています。

「実行時エラー ‘1004’: Range クラスの PageBreak プロパティを設定できません。」の原因・回避方法 DoEvents関数

今回のように少ないデータの場合は問題ないのですが、Loopを何度も繰り返す大きなデータの場合、

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

というエラーが出る場合があります。

改ページプレビューの描画のタイミングに問題があるようです。

これを回避するのが「DoEvents関数」です。

大きなデータのループ処理を実行する時、処理が完了するまでの間OS制御が不可能になります。DoEvents関数は、一時的にOS制御を可能にしてくれます。

このDoEvents関数を改ページ処理の前に入れると、実行時エラー ‘1004’ が回避されます。

DoEvents 
ws.Rows(t_row).PageBreak = xlPageBreakManual '改ページ挿入

また、改ページプレビューにする処理を最後に持ってくるのも回避策になります。

■スポンサーリンク

■ランキングに参加しています。
↓このブログを気に入っていただけましたら、ポチッとお願いします。

Microsoft Officeランキング