【本日のミッション】
Excel VBAにて印刷タイトルが設定してある表に、n行毎の改ページを設定せよ。
また、それが「実行時エラー ‘1004’: Range クラスの PageBreak プロパティを設定できません。」が出ないようにせよ。
目次
ミッションの概要
下記のような表とグラフのデータがあります。
- グラフとデータのある部分を全て印刷範囲にする。
- 1行目を印刷タイトル行に設定し(青枠部)、3つのグラフ(データ部36行)毎(赤枠部)に改ページを設定する。
- データ件数が少ない場合はいいのですが、Loop処理が多くなる場合、「実行時エラー ‘1004’: Range クラスの PageBreak プロパティを設定できません。」で止まる場合があります。エラーで止まらない対策をしておきます。
ミッション完了後のプレビューです。
全ページに、1行目がタイトル行に設定され、グラフ3つで1ページになります。
プロシージャ
Sub 改ページ() '【変数】 'ワークシート関連 ワークシートとして薄暗い '行列関連 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 '■変数セット 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 '■印刷設定 ws付き。PageSetup .PrintArea = ws.Range(ws.Range( "A1")、ws.Cells(e_row、e_col))。Address '印刷 範囲.PrintTitleRows = "$ 1:$ 1" 'メッセージ行 で終わる '■最終行まで改ページ設定 t_row = page_no * r_ct + 2 '改ページ対象行 t_row <= e_rowの間に行う DoEvents ’エラー予防 ws.Rows(t_row).PageBreak = xlPageBreakManual '改ページ挿入 page_no = page_no + 1 'ページ番号+1 t_row = page_no * r_ct + 2 '改ページ対象行 ループ Application.ScreenUpdating = True エンドサブ
印刷設定
ws付き。PageSetup .PrintArea = ws.Range(ws.Range( "A1")、ws.Cells(e_row、e_col))。Address '印刷 範囲.PrintTitleRows = "$ 1:$ 1" 'メッセージ行 で終わる
【印刷範囲の設定】
ワークシートオブジェクト.PageSetup.PrintArea = セル範囲.address(A1形式 文字列)
【タイトル行の設定】
ワークシートオブジェクト.PageSetup.PrintTitleRows = 行範囲(A1形式 文字列)
改ページ設定
【改ページ解除】
ワークシートオブジェクトの全ての改ページを解除します。
ワークシートオブジェクト.ResetAllPageBreaks
【改ページプレビュー】
改ページプレビューにします。
ActiveWindow.View = xlPageBreakPreview
【改ページ設定】
指定したRangeオブジェクトの上に水平、左に垂直の改ページを設定します。
改ページが設定できないセル・行・列を指定した場合、エラーになります。
改ページを設定するRangeオブジェクト.PageBreak = xlPageBreakManual
今回は、t_row行の上に改ページが設定されます。
t_row = page_no * r_ct + 2 '改ページ対象行 t_row <= e_rowの間に行う DoEvents ’エラー予防 ws.Rows(t_row).PageBreak = xlPageBreakManual '改ページ挿入 page_no = page_no + 1 'ページ番号+1 t_row = page_no * r_ct + 2 '改ページ対象行 ループ
印刷タイトル行: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 '改ページ挿入
また、改ページプレビューにする処理を最後に持ってくるのも回避策になります。
参照
系列が1つのグラフを自動大量連続作成(Excel VBA)
「実行時エラー 1004」を出さずに、ワークシート内のグラフを「グラフ 元」以外全て削除(Excel VBA)
グラフの参照先を変えると勝手にグラフの色が変わる現象を解決せよ
系列が複数あるグラフを自動大量連続作成(Excel VBA)
n行毎の改ページ設定 「実行時エラー1004 RangeクラスのPageBreakプロパティを設定できません」の原因(Excel VBA)
参照データ数が異なる・参照先が変動する月別グラフを自動大量連続作成(Excel VBA)
複数系列・参照データ数が異なる・参照先が変動する月別グラフを自動大量連続作成(Excel VBA)
大量の画像やグラフ等のオブジェクトで画面表示が遅いのを解決(Excel)
エクセル シートに画像が存在するかどうか(有無)を調べる方法(Excel VBA)
エクセルシート上 全てのオブジェクト(画像・図形・グラフ等)を選択し、削除する(Excel VBA)
エクセルシート上のオブジェクト(図形・画像・グラフ等)の件数を数える方法(Excel VBA)
エクセル シートにグラフが存在するかどうか(有無)を調べる方法(Excel VBA)
エクセル シートに図形が存在するかどうか(有無)を調べる方法(Excel VBA)
エクセル 選択しているセル範囲に写真が存在しているか(有無)を確認(Excel VBA)
エクセル 選択しているセル範囲にグラフが存在しているか(有無)を確認(Excel VBA)
エクセル 選択しているセル範囲に図形が存在しているか(有無)を確認(Excel VBA)
エクセル 選択セル範囲の写真を削除する(Excel VBA)
エクセル 選択セル範囲のグラフを削除する(Excel VBA)
エクセル 選択セル範囲の図形を削除する(Excel VBA)
Excel VBAでワードを起動して文字を入力操作(Excel VBA)
Excel VBAでワードを起動してエクセルの表をワードに貼付け(Excel VBA)
Excel VBAでワードを起動して エクセルのエクセルの表を図としてワードに貼付け(Excel VBA)
Word コピー貼付けした図が白い枠だけ?図が表示されない現象を解決
Excel VBAでワードを起動して グラフをワードに図として貼付け(Excel VBA)