| 
    
     |  | こんにちは いつも参考にさせていただいています。
 
 複数のシートの表を1枚のシートにまとめて印刷する という作業をVBAで行っています。
 作業するファイルごとに表の行数は違っており(同一ファイルのシートの表の行数は同じ)、任意の行数から成る表を1枚のシートに横2×縦(可変個数)貼り付けています。
 これを印刷のときには、表4つ分ずつ印刷したいと思っています。
 
 ↓イメージ
 
 □□
 □□
 --改ページ
 □□
 □□
 --改ページ
 □□
 
 改ページを先に入れて、その後印刷設定(横1×縦指定ページ)を入れると点線の改ページ(自動)が出てきて、うまく印刷できないため、何か方法はないかとネットで調べたところ、
 
 改ページしたい行数insatugyoとシートの最終行を元に縦のページ数pを算定して、横1×縦pページで印刷するよう指定し(ここで改ページが自動で挿入されるようです)、その後、自動で入った改ページと印刷したい枚数に必要な改ページ数との過不足を調整します。必要数改ページが入ったら改ページの位置を指定の位置に移動させます。
 
 という処理方法を見つけましたので、そのコードを元に下記のとおり記載しました。
 
 
 実行したところ、(5)の改行の位置設定の箇所でエラーとなります。
 
 例えば90行ごとに5ページ印刷する場合、(5)に処理が進んだ状態では、4つの改行が挿入されていますが、
 1ループ目の
 sh_B1.HPageBreaks(4)..Location = sh_B1.Range("A361")
 を過ぎた後、
 印刷設定の横1×縦5ページがいずれも「自動」に変更になり、改ページの数が上記で入れた改ページの1つのみになるため、次のループでsh_B1.HPageBreaks(3)が存在しなくなり、エラーとなります。
 ※なお、今テストで作っているシートでは、改ページの過不足は発生していないため(1)からすぐ(5)に処理がうつっている状況です。
 
 
 エラーの出ない方法もしくは、別の方法で、希望の行数ごとに1枚に収めて印刷
 する方法がありますでしょうか。
 考え方のヒントでもけっこうですので、ご教示くださると幸いです。
 
 
 よろしくお願いいたします。
 
 ===================================================================
 With sh_B1
 lRow = .Range("B" & Rows.Count).End(xlUp).Row '最終行を求める
 p = lRow \ insatugyo + 1 '印刷ページ数を求める
 End With
 
 sh_B1.ResetAllPageBreaks '改ページリセット
 With sh_B1.PageSetup
 .Zoom = False
 .FitToPagesWide = 1 '横1ページに収める
 .FitToPagesTall = p '縦を指定のページ数に収める
 End With
 
 ActiveWindow.View = xlPageBreakPreview '改ページプレビュー
 
 '印刷したいエリアごとに名前をつける Area1、Area2、・・・
 With sh_B1
 For i = 1 To p
 Dim k As Integer 'エリア開始行を格納する変数
 k = (i - 1) * insatugyo + 1
 .Range("A" & k & ":M" & i * 2 * (chk + 1)).Name = "Area" & i
 Next i
 End With
 
 Dim n As Integer
 n = sh_B1.HPageBreaks.Count '……(1)'HPageBreaksの数を変数 n に代入。
 If n > p - 1 Then
 For i = n To p Step -1  '……(2)'印刷したいページ以上ある場合。以降の改ページを印刷範囲外に追い出す。
 sh_B1.HPageBreaks(i).DragOff Direction:=xlDown, _
 RegionIndex:=1
 Next
 ElseIf n < p - 1 Then
 For i = 1 To n      '……(3)'ページ数が足りない場合
 Set sh_B1.HPageBreaks(i).Location = _
 sh_B1.Range("A" & Range("Area" & i).Row + Range("Area" & i).Rows.Count)
 Next
 For i = n + 1 To p - 1   '……(4)'不足改行分を追加
 sh_B1.HPageBreaks.Add _
 sh_B1.Range("A" & Range("Area" & i).Row + Range("Area" & i).Rows.Count)
 Next
 End If
 
 For i = p - 1 To 1 Step -1 '……(5)'改行の位置を設定
 sh_B1.Activate
 Set sh_B1.HPageBreaks(i).Location = _
 sh_B1.Range("A" & Range("Area" & i).Row + Range("Area" & i).Rows.Count)
 Next
 
 |  |