• ベストアンサー

Excel VBA の印刷後の判定

いつもお世話になっています。 Excel VBA で不明な点が出てきたので質問させていただきます。 処理順として 1.AccessからExcelを出力し、出力後はそのまま表示しておく。 2.表示してあるExcelをユーザーが印刷する。 3.印刷したシートの見出しの色を変更する。 の3つなのですが、3の処理をExcelマクロで実行する際に、 印刷が実行されたかどうかの判別方法がわからないのです。 印刷直前でも構わないと思い、BeforePrint イベントを調べて使用してみたのですが、 印刷プレビューでもイベントが走ってしまい、ダメでした。 印刷実行なのか、プレビューなのか区別が出来る方法があればとも思っているのですが…。 ご存知の方、ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 印刷したものと、プレビューしたもののイベントの区別をしたいということですね。いくつか方法を考えてみましたが、実際に印刷したかどうかは、API関数でしか把握できませんが、かなり大掛かりで、リスクを背負うことになってしまいます。私としては、あまりお勧めできません。 私が、実際の開発で、Excelの中だけでどう考えるかというと、あまり良い案は浮かびません。 '<ThisWorkbook> Private Sub Workbook_BeforePrint(Cancel As Boolean) If PrinterFlg = False Then  Cancel = True End If End Sub '<標準モジュール> Public PrinterFlg As Boolean '<シートモジュール> Private Sub CommandButton1_Click() PrinterFlg = True  ActiveSheet.PrintOut  '他の作業 PrinterFlg = False End Sub こうすれば、PrinterFlg がTrue にならない限りは、印刷もプレビューもされませんので、後は、開発側の設けたボタンで、印刷が把握できます。そのボタンを押した時のみ、有効になるわけです。ユーザー側に余計なことをしてもらいたくない場合は、メニューバーやツールバーも隠します。自分が望むボタンだけを置くことにします。 ここまでは良いと思いますが、しかし、印刷プレビューを許す場合は、印刷プレビュー画面から印刷が可能ですから、そこでは、もう BeforePrint イベントが利きません。印刷プレビューのイベントで、例えば、PDF出力などのダミーのプリンタ・ドライバに切り替えるぐらいしか、今のところ思いつきません。やはり、API関数での制御になってしまいます。 根本的にPrint Out Preview と Print Out の違いというは、Excel上ではないかもしれません。 ちなみに、印刷プレビューのイベントというのは、以下のようなものです。 'Class 1 Public WithEvents myPrinterButton As CommandBarButton Private Sub myPrinterButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)   Application.ActivePrinter = " 別のプリンタドライバ " End Sub '標準モジュール Dim myClass As Class1 Sub PreviewEventSetting() Set myClass = New Class1  Set myClass.myPrinterButton = Application.CommandBars("Standard").FindControl(, 109) End Sub なお、PreviewEventSetting を、ThisWorkbook の Open イベントから、Call すればよいと思います。

guruguru2
質問者

お礼

アドバイスありがとうございます。 API関数の使用になりますか。 それ以外となると、やはりユーザーに印刷プレビューをさせない方法をとるしかないのですかね。 ありがとうございます。参考にさせていただきます。

その他の回答 (1)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんにちは。 Accessからのデータを常に決まったブックの決まったシートに出力するようにすれば、 案1. シート上に、Print用とPreview用のボタンを配置 案2. Print用とPreview用のボタンを配置したユーザー定義のフローティングメニューを表示 案3. Print用とPreview用のボタンを配置したモードレスのユーザーフォームを表示 このような方法が簡単では、と思います。 但し、何れの場合もメニューバー、ツールバー等は非表示にしておくことは言うまでもありません。 以上です。

guruguru2
質問者

お礼

回答ありがとうございます。 ツールバー・メニューバーでプレビュー禁止でいきたいと思います。 ありがとうございます。今後の為、頂いた回答の案も参考にさせていただきます。

関連するQ&A