プロが教えるわが家の防犯対策術!

いつもお世話になっています。
Excel VBA で不明な点が出てきたので質問させていただきます。

処理順として
1.AccessからExcelを出力し、出力後はそのまま表示しておく。
2.表示してあるExcelをユーザーが印刷する。
3.印刷したシートの見出しの色を変更する。

の3つなのですが、3の処理をExcelマクロで実行する際に、
印刷が実行されたかどうかの判別方法がわからないのです。

印刷直前でも構わないと思い、BeforePrint イベントを調べて使用してみたのですが、
印刷プレビューでもイベントが走ってしまい、ダメでした。

印刷実行なのか、プレビューなのか区別が出来る方法があればとも思っているのですが…。

ご存知の方、ご教授お願いいたします。

A 回答 (2件)

こんにちは。



印刷したものと、プレビューしたもののイベントの区別をしたいということですね。いくつか方法を考えてみましたが、実際に印刷したかどうかは、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 すればよいと思います。
    • good
    • 0
この回答へのお礼

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

ありがとうございます。参考にさせていただきます。

お礼日時:2005/11/18 23:45

こんにちは。



Accessからのデータを常に決まったブックの決まったシートに出力するようにすれば、


案1.
シート上に、Print用とPreview用のボタンを配置

案2.
Print用とPreview用のボタンを配置したユーザー定義のフローティングメニューを表示

案3.
Print用とPreview用のボタンを配置したモードレスのユーザーフォームを表示


このような方法が簡単では、と思います。
但し、何れの場合もメニューバー、ツールバー等は非表示にしておくことは言うまでもありません。

以上です。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
ツールバー・メニューバーでプレビュー禁止でいきたいと思います。

ありがとうございます。今後の為、頂いた回答の案も参考にさせていただきます。

お礼日時:2005/11/18 23:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A