こんにちは、Ryoです。
Excelで印刷を実行した際に文章や図形が指定範囲に収まっておらず、無駄に印刷枚数を増やしてしまうことが私は良くあります。その場合、印刷枚数が決まっている場合はBeforePrintイベントを使用して印刷直前に枚数をカウントし、処理実行可否を確認することで回避することも出来るかと思いますので、今回はその内容について書いていきます。
1.サンプル概要
サンプルとして適当にセルに文字を入力して印刷枚数が3枚になるようにしたSheetを準備しています。
そのSheetに対してBeforePrintイベントを使用して印刷直前に印刷枚数をカウントし、1枚以上の場合は印刷処理を中断するメッセージを表示するサンプルコードになります。
2.サンプルコード
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim Pcnt As Integer 'アクティブになっているSheetに対する処理 With ActiveSheet '特定のSheetに対して処理を行う場合は 'With Worksheets("Sheet1") 'このような形で指定する '印刷頁数をカウントする 'HPageBreaks.Count、VPageABreaks.Countそれぞれの値に '「1」をプラスし、乗算したものがページ数になる Pcnt = (.HPageBreaks.Count + 1) * (.VPageBreaks.Count + 1) 'サンプルでは印刷枚数が1枚以上かどうかをチェックし、 '超えている場合は印刷処理を中断させる If Pcnt > 1 Then MsgBox "印刷頁数が" & Pcnt & "枚になっています。" & vbLf _ & "処理を中断します", vbInformation '印刷処理のキャンセル Cancel = True End If End With End Sub
印刷する直前に処理を行うにはBeforePrintイベントを使用します。
構文:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
statements
End Sub
引数CancelにTrueを指定すると印刷処理をキャンセルすることができます。また、このBeforePrintイベントは「ブックモジュール」に記述します。
サンプルではアクティブシートに対する処理として記述していますが、例えば「Sheet1」に対する処理であればWorksheets(“Sheet1”)のように指定すればOKです。
次に印刷ページ数をカウントしますが、その処理にはHpageBreaksプロパティとVPageBreaksプロパティを使用します。
HPageBreaksプロパティは水平方向の改ページコレクション、VPageABreaksプロパティは垂直方向の改ページコレクションになります。このプロパティを使用して印刷されるページ数をカウントする場合は「それぞれの値を1プラスして乗算する」ことで算出できます。
With ActiveSheet
Pcnt = (.HPageBreaks.Count + 1) * (.VPageBreaks.Count + 1)
後はカウントした印刷枚数が1枚なら印刷、1枚を超えていればメッセージ表示と印刷処理の中断を行います。
If Pcnt > 1 Then
MsgBox “印刷頁数が” & Pcnt & “枚になっています。” & vbLf _
& “処理を中断します”, vbInformation
Cancel = True
End If
End With
このようにBeforePrintイベントはページ数を計算して、予定枚数よりも多い場合に確認メッセージを表示するなどの使い方ができます。
3.まとめ
今回のサンプルコードのようにブックモジュールに記載する場合は、アクティブシートを対象とするとBookの全Sheetに対して動作しますから場合によってはかなり煩わしいことになりますので、動作範囲は検討の上で決定すると良いと思います。
このようなポカヨケ的な動作も少しの記述で実行できますので、機会があればご検討くださいませ。
以上、VBAで印刷する直前に処理を実行する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo