質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1463閲覧

VBA 印刷指定 (印刷範囲ではなく、コントロールや特定セルの制御)

King_of_Flies

総合スコア382

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/10/18 05:18

編集2017/10/18 06:47

お疲れ様です。

今回ワークシートの印刷で、
Range("A1:L50")を範囲選択しているのですが、
その範囲内に印刷されてほしくないセルが一か所と、
印刷されてほしくないActiveXコントロールのコンボボックスが存在します。

教えていただきたいこと。
①.特定セルのみ印刷しないという処理。
*印刷時のみ特定セルの文字色を白に変更、あるいは空文字で上書きし印刷終了時にセルに値を再挿入という実装で代用できるが、あまり好ましくないと考えてます。

②.Activexコントロールのコンボボックスを印刷させないようにする処理。

以上二点について解決策はありますでしょうか。

VBAを使用した印刷範囲の指定はわかるのですが、
印刷範囲に入ってしまっている上記二点の制御の仕方がわかりません。

そもそも不可能でしょうか?

よろしくお願いいたします。

追記1
①の件ですが、特定セルであって、特定行、特定列というわけではないので
行や列を非表示にする処理は向かないと考えています。

また、参考として下記URLを見たのですが、
回答のすべてがユーザのアクションを必要とする処理なので、気が向きません。

https://oshiete.goo.ne.jp/qa/831146.html

②は解決いたしました。
コントロールの書式設定でオブジェクトを印刷するのチェックを外すことで、
印刷制御ができました。

追記2
Workbook_BeforePrintイベントを使用すれば、ユーザアクションが不要なので、
追記1で参考としたURLのような処理の実装ができそうですが、
workbool_AfterPrintイベントが存在しないようで、
印刷後にセルデータを戻すときのアクションがどうするべきか教えてください。

イメージ説明
を設定して、
Module1にIsPrint()の実装をして、ってところまで理解しました。

この条件書式はworkSheetがどうなったら読み込まれるのかが分かりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1について何か画期的な方法がないか考えてみました。
画期的かどうかはわかりませんが、他に例がなかったので面白い試みかと思いますので紹介します。

まず標準モジュールに印刷中かどうかを表す変数(PrintFlagとしておきます)と状態を返す関数(IsPrintとしておきます)を作成します。

VBA

1Private PrintFlag ' このフラグはどこかで初期値(False)を入れておいてください 2Function IsPrint() 3 IsPrint = PrintFlag 4End Function

印刷したくないセルに条件付き書式を設定します。
条件は「=IsPrint()」
フォントの色を白にしましょう。
あとは以下のような感じで、印刷前後にフラグを制御するだけでOKです。
印刷後に画面が更新されない可能性があるので、描画更新を抑制しています。

VBA

1Sub test() 2 Application.ScreenUpdating = False 3 PrintFlag = True 4 Worksheets(1).PrintPreview 5 PrintFlag = False 6 Application.ScreenUpdating = True 7End Sub

投稿2017/10/18 06:06

編集2017/10/18 06:09
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2017/10/18 06:11

失礼しました。 職場の環境が悪く、なぜか書き込みが反映されませんでした。
King_of_Flies

2017/10/18 06:21

回答ありがとうございます。 回答のIsPrintの実装意図が読めませんでした。 IsPrintはVBAのイベントではないようなので、 このメソッドの呼び出し元が必要だと思うのですが、 そのメソッド呼び出し元が、セルに入力した条件付き書式のIsPrint()になるのでしょうか? とすると、Worksheets(1).PrintPreviewでそのIsPrint()を読み込むですか? すいません、このあたりの実行順序の解説をお願いしたいです。。。
ttyp03

2017/10/18 06:28

IsPrintは条件付き書式で指定します。 PrintPreviewをしたのは単に反映されるか確認しただけですので、PrintOutでも何でも良いです。 要はExcel内部で印刷時にも条件付き書式に従って書式が設定されるであろうと仮定して実装しています。 流れ的には、こうなります。 <画面描画時> PrintFlagはFalse状態 条件付き書式によりIsPrintが呼ばれる Falseが返るので条件には一致しない→フォント黒色のまま <印刷時> PrintFlagをTrueにする 印刷開始 条件付き書式によりIsPrintが呼ばれる Trueが返るので条件に一致→フォントは白色になる 印刷終了 PrintFlagをFalseにする
King_of_Flies

2017/10/18 06:30

なるほど。理解できない理由を理解しました。 そもそも条件付き書式の使い方がわかっていないのが原因だと思います。 少し調べてきますので待っていてください。
King_of_Flies

2017/10/18 06:49

質問の編集をしました。 条件付き書式はworksheetにアクションが加わるたびその書式に設定した数式を呼ぶのですか?
King_of_Flies

2017/10/18 06:54

*マクロ実行の度条件付き書式の数式が呼びこまれるのか、 sheetをアクティブにしたら呼びこまれるのか、 PrintPreviewをしたのは単に反映されるか確認しただけですので、PrintOutでも何でも良いです。 ←条件付き書式の数式が実行されるタイミングがわかりません。
ttyp03

2017/10/18 07:00

何が問題なのでしょう? うまく動かないでしょうか? タイミングはセルの書式を何かしらに反映するときだと思います。 なので、シート内のどこかの値が変わるだけでも呼ばれますし、印刷しようとしたときにも呼ばれます。
King_of_Flies

2017/10/18 07:30

あ、度々すいません。 問題というわけではなく、条件付き書式の挙動を知っておきたいだけです。 ttyp03さんの提案した案とは別に実装目処が立ったので、どちらのコードがより良いかという吟味をするために知りたかったのです。 ちなみに私が実装したのはThisWorkbookに '印刷実行直前に呼び出されるイベントプロシージャ Private Sub Workbook_BeforePrint(Cancel As Boolean) Range("B1").Value = ""   '印刷後に呼ばれる処理。 Application.OnTime Now(), "ThisWorkbook.AfterPrint" End Sub Private Sub AfterPrint() Range("B1").Value = "セルに入れたい文字" End Sub という簡単なものになっています。 参考URL http://www.officelabo.net/vbaskill/vba20.html
King_of_Flies

2017/10/18 07:31

↑のコードでセルの文字を白文字に設定なども考えています。
King_of_Flies

2017/10/18 07:33

条件付き書式の数式実行回数がさまざまなアクションで呼ばれるのであれば、 処理時間やCPUの負担等を考えたときに、よろしくないのでは?と感じた次第でございます。
King_of_Flies

2017/10/18 07:37

Private Sub Workbook_BeforePrint(Cancel As Boolean) Range("B1").Select Selection.Font.ColorIndex = 2 Application.OnTime Now(), "ThisWorkbook.AfterPrint" End Sub Private Sub AfterPrint() Range("B1").Select Selection.Font.ColorIndex = 1 Range("A1").Select End Sub こんな感じで。
ttyp03

2017/10/18 07:39

私の提案をゴリ推しするつもりはないので、業務に適した方を採用してください。 私のコンセプトとしては、条件付き書式の設定のみで、印刷時には元のセルに対して何ら加工が不要なところです。 条件付き書式自体は日常的に使うものですので、過剰に使わなければCPUの負担にはならないと思います。 ていうか今まで使っていないのでしたら、1つのセルに対して1つの条件が増えたところで何ら問題ないと思いますよ。 私なんて数千行に対して設定したりとか良くやりますし…。
ttyp03

2017/10/18 07:41 編集

「印刷時に色を変える」というのが調べると良く見かける手法でしたし、他に手はなさそうだったので、それをもう少し簡潔にできないかなと思って考えてみました。
King_of_Flies

2017/10/18 07:42

数千行に対して条件書式を設定しているのですか? なんともまぁ、果てしない作業でしたね・・・。 ともあれ、回答ありがとうございました。 ttyp03さんのおかげで、条件付き書式について知るキッカケにもなったので、ありがたかったです。 私は頻繁に質問してますので、 機会がありましたらまたよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問