【ExcelVBA】BeforePrintイベントはあるけどAfterPrintイベントはない【知恵袋】
Yahoo!知恵袋の質問から。
質問
印刷時に以下の方法でアクティブセルの行を色付きにした色を印刷されないようにする方法はありますか?
元々選択したセルがある行を見やすくするために設定したのですが、
印刷すると行を見やすくした色まで印刷されてしまいます。
これを印刷されないようにする方法はありますか?印刷範囲外のセルを選んでから印刷するというのは除外します。
「現在の設定」
次の条件付き書式で定めています。
=CELL(“ROW”)=ROW()さらに次のマクロのコードを動かしています
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13269570988
Application.ScreenUpdating = true
追加で説明があり、「他の部分に色付けていて、それは色付きのまま印刷したいのでした」とも。
回答
ではBeforePrintイベントで条件付書式設定をクリアして、
OnTimeで印刷後に条件付き書式をもとに戻す設定をしたらどうですか?↓ThisWorkbookモジュールに記述します。
Option ExplicitPrivate Sub Workbook_BeforePrint(Cancel As Boolean)
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13269570988
ThisWorkbook.Worksheets(1).Cells.FormatConditions.Delete
Application.ScreenUpdating = True
Application.OnTime Now(), “ThisWorkbook.AfterInsatsu”
End Sub
回答欄は文字数制限があるので、2回に分けて回答しています。
Private Sub AfterInsatsu()
Dim Rng As Range
Dim Frm As ObjectWith ThisWorkbook.Worksheets(1)
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13269570988
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
見やすいように、コードエディタでも同じものを掲示しておきます。
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の行が色付けされます。
これは、条件付き書式とシートイベントで実現してあります。
選択ているセルを変えると、その行が色付けされます。
このシートを印刷すると、選択されている行の色付けも一緒に印刷されてしまいます。
相談者はこの行選択の色付けはとりたいというご質問でした。
すでにイベントを使っていらっしゃるので、ならBeforePrintイベントを使えば解決です。
ちなみにVBAにはAfterPrintイベントはありません。
BeforePrintイベントの中にOnTimeを使って、疑似的にAfterPrintイベントを作成します。
OnTimeメソッドというのは、指定した時刻にプロシージャを実行します。非同期ですが、呼び出し元のプロシージャが終わっていないときは、終わるまで待ちます(この辺、LatestTimeというパラメータで制御できる)。
指定時刻をNow()としていますので、現在実行しているプロシージャ(BeforePrint)が終わったら、指定したプロシージャ(AfterInsatsu)を実行します。
AfterPrint代わりによく使われるテクニックです。
条件付き書式をクリアにするのはFormatConditionsオブジェクトをDeleteします。
FormatConditionsはCellsオブジェクトやRangeオブジェクトにありますので、セル範囲を指定すればよいです。
AfterInsatuでは削除した条件付き書式を再度設定しています。
無事印刷したものからは、選択行の色付けがなくなっていました。
-
前の記事
【WordPress】データベースの情報を固定ページに表示するには【PHP】 2022.10.22
-
次の記事
【WordPress】ウィジェットの見出しのスタイルを変えるには【LIONBLOG】 2022.10.24