エクセルのマクロに関してです。
1行毎に改ページにするマクロを設定しました。
マクロの内容は下記の通りです。
しかし、下記ですと、2つの問題があります。
【その1】
1行目と2行目はヘッダーにしているのに、1行毎に改ページだから1行目と2行目も2ページ分として印刷されてしまう。
【その2】
フィルターをかけているが、下記のマクロだと、フィルターで非表示にした行も印刷されてしまう。
何か良い方法はありますでしょうか。
また、フィルターで一部を非表示にするマクロも一緒にいれています。
何卒よろしくお願いいたします。
Private Sub Worksheet_Activate()
ActiveSheet.Range("$A$1:$A$200").AutoFilter Field:=1, Criteria1:="1"
With ActiveSheet
.ResetAllPageBreaks
For Each c In Range("A2:A500")
.HPageBreaks.Add Before:=c
Next
End With
End Sub
まず【その1】ですが、
1行目と2行目はヘッダーにしていることはこの2行は全ページの上部に印刷されることでしょうから、ここには改ページを設定しないこととすればよくて、
For Each c In Range("A2:A500")
↓
For Each c In Range("A4:A500")
と、対象行の範囲を変更すれば良いでしょう。
次に【その2】ですが、
これはやっかいな問題ですね。
フィルター機能とかで非表示としている中に改ページ制御が含まれていると、その数の分だけ、ページとしては印刷されてしまうものです。
(バグかどうかまではわかりませんが、昔に自分もなんだこれ!と、仕方なくあきらめたことを思い出しました。今でも、問題になってないのか、していないのか、Excel2016でも同じ状況のようです。)
で、考えたのですが、提案ですが、
1行ごとに改ページ設定する操作は、別途で後に行うことにするのです。
フィルター等で操作して印刷する段になってからマクロを起動し、表示されている行に対してだけ改ページ設定を行うのです。
そのためにマクロでは、行が表示状態なのか非表示状態なのかを判断して、非表示状態の行については改ページ設定を行わないようにします。
改造したマクロ例を以下に示しておきます。
Private Sub 行毎改ページ設定()
'フィルター等で行表示状態を変更した後に、印刷準備として実行する
' ActiveSheet.Range("$A$1:$A$200").AutoFilter Field:=1, Criteria1:="1"
' ↑(フィルター機能は別途で行う)
With ActiveSheet
.ResetAllPageBreaks
For Each c In Range("A4:A500")
If c.EntireRow.Hidden = True Then
'非表示の行なので何もしない
Else
'表示の行なので改ページ設定をする
.HPageBreaks.Add Before:=c
End If
Next
End With
End Sub
このマクロは標準モジュールに置いて、ワークシート上にボタンをマクロ起動用に設け、必要のときに起動操作したらよいでしょう。
(フィルターをかけるのは別途で、手動でも、あるいはWorksheet_Activateレベルのマクロでも構わないですが)