2015年8月3日月曜日

印刷時に特定のセルを"非表示"にする

【印刷時に特定のセルを"非表示"にする】 印刷時のイベント制御には以下のイベントを使います。
  1. 印刷前:ThisWorkbookモジュールの「Workbook_BeforePrint」
  2. 印刷後:Application.OnTime

(上記、詳しくは www.officelabo.net/vbaskill/vba20.html を参照のこと)

これらを使って、特定のセルの内容を帳票に出力されないようにします。例えば外部に出しちゃいけない数値とか、ブック/シート利用者への注意事項とかそういうアレです。

----以下---------------------------------------------


//(1)ThisWorkbookモジュール////
1  Private Sub Workbook_BeforePrint(Cancel As Boolean)
2   Sheets("hoge").Range("A1:B2").Select
3   Selection.Font.Color = RGB(255, 255, 255)
4
5   Application.OnTime Now(), "Macro1"
6  End Sub


//(2)標準モジュール////
1  Sub Macro1
2   Sheets("hoge").Range("A1:B2").Select
3   Selection.Font.Color = RGB(0, 0, 0)
4  End Sub

-----------------------------------------------------

(1)について、セルを非表示にしようとすると行を隠す(Rows(x).Hideプロパティ)しかないので、文字色を白にすると言う若干姑息な手段。でも実行結果が同じなら問題なしってことで。
 ちなみに2-3行目はSelection.Font指定でないとうまく実行できなかったので。
 CollorIndex指定でも良いのですが、わからなかったのでRGB指定してます。
(2)については、印刷後に文字色を黒に戻す処理。(1)のApplication.OnTimeがプロシージャ名で指定する仕様のようなので別系統で標準モジュールに記述します。

****

実に簡単なコードかつこれだけあれば十分ですが、万が一エラーがあったときに印刷できないと仕事が滞る場合もあるのでOn Error処理でエラーナンバーを表示してからResume  Nextとか入れておくと間違いないでしょうね。
また文字色は固定で無いこともあるかも知れません。そんな場合は(1)の時点で元の文字色を取得し(2)で戻す方が良いでしょう。ただPublic変数とか使って面倒なのでやりませんでした(ホジ

自分の場合、対象セルの内容を出力したい場合もあるので(SubTotal関数とか埋め込んである)
メイン処理を別プロシージャに書いておき、(1)で処理するかしないか問い合わせてから必要があれば呼び出すようにしました。ついでに、処理対象のシートでなければそもそも処理しないようにIF節を追加してます。

----以下---------------------------------------------


//(1)ThisWorkbookモジュール////
1  Private Sub Workbook_BeforePrint(Cancel As Boolean)
2
3   Dim ret As Integer
4 
5   If ActiveSheet.Name = "hoge" Then
6    ret = MsgBox("テキストを非表示にして印刷しますか?", vbYesNo, "文字列の操作")
7      Select Case ret
8          Case vbYes
9     Call TextHide
10     Application.OnTime Now(), "Macro1"
11         Case vbNo
12          Exit Sub
13     End Select
14  End If
15
16 End Sub

//(2)標準モジュール////(略)

//(3)標準モジュール////
1  Sub TextHide()
2   Sheets("hoge").Range("A1:B2").Select
3   Selection.Font.Color = RGB(255, 255, 255)
4  End Sub

-----------------------------------------------------

こんな感じ。

ポイントはApplication.OnTimeです。
あ、あとOffice2010以降?("リボン"の付いたバージョン)は[Ctrl]+[P]するとマクロ走る前に印刷プレビューされてビビりますが、実行するとちゃんと走りますのでよほど視覚的誘導に問題が無ければ大丈夫です。な筈。

0 件のコメント:

コメントを投稿