【ExcelVBA】BeforePrintイベントはあるけどAfterPrintイベントはない【知恵袋】

Yahoo!知恵袋の質問から。

質問

印刷時に以下の方法でアクティブセルの行を色付きにした色を印刷されないようにする方法はありますか?
元々選択したセルがある行を見やすくするために設定したのですが、
印刷すると行を見やすくした色まで印刷されてしまいます。
これを印刷されないようにする方法はありますか?

印刷範囲外のセルを選んでから印刷するというのは除外します。

「現在の設定」
次の条件付き書式で定めています。
=CELL(“ROW”)=ROW()

さらに次のマクロのコードを動かしています
Application.ScreenUpdating = true

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13269570988

追加で説明があり、「他の部分に色付けていて、それは色付きのまま印刷したいのでした」とも。

回答

ではBeforePrintイベントで条件付書式設定をクリアして、
OnTimeで印刷後に条件付き書式をもとに戻す設定をしたらどうですか?

↓ThisWorkbookモジュールに記述します。
Option Explicit

Private Sub Workbook_BeforePrint(Cancel As Boolean)
ThisWorkbook.Worksheets(1).Cells.FormatConditions.Delete
Application.ScreenUpdating = True
Application.OnTime Now(), “ThisWorkbook.AfterInsatsu”
End Sub

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13269570988

回答欄は文字数制限があるので、2回に分けて回答しています。

Private Sub AfterInsatsu()
Dim Rng As Range
Dim Frm As Object

With ThisWorkbook.Worksheets(1)
Set Rng = .Range(“A2:I10”)
Set Frm = Rng.FormatConditions.Add(Type:=xlExpression, Formula1:=”=CELL(“”ROW””)=ROW()”)
Frm.Interior.Color = RGB(198, 224, 180)
End With
Application.ScreenUpdating = True
End Sub

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13269570988

見やすいように、コードエディタでも同じものを掲示しておきます。

Option Explicit

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    ThisWorkbook.Worksheets(1).Cells.FormatConditions.Delete
    Application.ScreenUpdating = True
    Application.OnTime Now(), "ThisWorkbook.AfterInsatsu"
End Sub

Private Sub AfterInsatsu()
    Dim Rng As Range
    Dim Frm As Object

    With ThisWorkbook.Worksheets(1)
        Set Rng = .Range("A2:I10")
        Set Frm = Rng.FormatConditions.Add(Type:=xlExpression, Formula1:="=CELL(""ROW"")=ROW()")
        Frm.Interior.Color = RGB(198, 224, 180)
    End With
    Application.ScreenUpdating = True
End Sub

解説

次のようなExcelがあったとします。

選択行が色付けされるシート

アクティブなセルがA10です。すると、行番号10の行が色付けされます。

これは、条件付き書式とシートイベントで実現してあります。

条件付き書式
Sheet1モジュールのWorksheetイベント

選択ているセルを変えると、その行が色付けされます。

B5を選択すると行番号5の行が色付けされる

このシートを印刷すると、選択されている行の色付けも一緒に印刷されてしまいます。

印刷プレビュー。選択された行の色付けもいっしょに印刷される

相談者はこの行選択の色付けはとりたいというご質問でした。

すでにイベントを使っていらっしゃるので、ならBeforePrintイベントを使えば解決です。

ちなみにVBAにはAfterPrintイベントはありません。

BeforePrintイベントの中にOnTimeを使って、疑似的にAfterPrintイベントを作成します。

OnTimeメソッドというのは、指定した時刻にプロシージャを実行します。非同期ですが、呼び出し元のプロシージャが終わっていないときは、終わるまで待ちます(この辺、LatestTimeというパラメータで制御できる)。

指定時刻をNow()としていますので、現在実行しているプロシージャ(BeforePrint)が終わったら、指定したプロシージャ(AfterInsatsu)を実行します。

AfterPrint代わりによく使われるテクニックです。

条件付き書式をクリアにするのはFormatConditionsオブジェクトをDeleteします。

FormatConditionsはCellsオブジェクトやRangeオブジェクトにありますので、セル範囲を指定すればよいです。

AfterInsatuでは削除した条件付き書式を再度設定しています。

印刷したもの

無事印刷したものからは、選択行の色付けがなくなっていました。