[[20150405144240]] 『Workbook_BeforePrint内でPrintOut実行』(マナ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Workbook_BeforePrint内でPrintOut実行』(マナ)

 別スレで回答していて疑問がでで、
 解決後に、便乗質問しようと姑息なことを考えていたのですが、
 未解決のまま終わりそうなので、新規で質問します。

 Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Application.EnableEvents = False
    MsgBox "1"
    ActiveSheet.PrintOut ActivePrinter:="プリンタ2"
    MsgBox "2:" & ActivePrinter
    Application.EnableEvents = True
    MsgBox "3"
   Cancel = True
 End Sub

 Sub test()
    ActiveSheet.PrintOut ActivePrinter:="プリンタ1"
    MsgBox "4"
 End Sub

 1)マクロを使用しないで印刷すると、プリンタ2で印刷されます。
 2)しかし、上記マクロ(test)の実行だと、プリンタ2でも印刷されません。

 とんでもない勘違いをしているのかもしれませんが、
 1)は理解できているつもりです。2)については何故でしょうか?
 どちらの場合もMsgboxは表示されます

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 きっかけのスレは
[[20150329020412]]

 シート毎にプリンタを変更する手段として
 Workbook_BeforePrint
 を利用できないかとと考えましたが、
 マクロから印刷する場合だと使えない??

(マナ) 2015/04/05(日) 15:17


 理由は全くわかりませんが、マクロで PrintOut された際に呼び出される
 Workbook_BeforePrint の中で PrintOut をしても(PrintPreviewも)、実行されないようです。
 いろいろネットを調べてみましたけれど、なかなか同様の事例が見当たりませんでした。

 あまり原因とは関係ないかもしれませんが、EnableEvents = False を外していても、
 再イベントが発生しません。
 そうさで印刷を実行した場合も、BeforePrint の初回はイベントが発生しますが、
 2回目ではイベントが発生しません。

 マクロ中で実行した印刷イベント内での印刷は何か制限があるのかもしれません。

 回答になっていない駄レスですみません。

(Mook) 2015/04/05(日) 18:38


こちらこそ、「何が知りたいの」な質問ですみません。

 Workbook_BeforePrintの書き方を間違えていたわけでないことが
 わかっただけでよかったです。
 そういうものなんだと考えることにします。

 >EnableEvents = False を外していても、…

  確かに。言われるまで、試そうとも思いませんでした。

 回答ありがとうございました。

(マナ) 2015/04/05(日) 21:01


 >2)しかし、上記マクロ(test)の実行だと、プリンタ2でも印刷されません。
 「永遠に幸せの連鎖を約束するよ♪」という歌がありましたねえ・・、
 BeforePrintイベントは、約束されていないのですかねえ!!

 私は、このような時は 決まって Ontimeメソッドを試してみるのですが、

 Thisworkbookのモジュールに

 Option Explicit

 Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Cancel = True
    Application.OnTime Now(), "thisworkbook.reprint"
 End Sub
 Sub reprint()
    Debug.Print "ok"
    ActiveSheet.PrintPreview
 End Sub

 標準モジュールに

 Sub test()
    ActiveSheet.PrintOut
 End Sub

 として、testを実行しても Ontimeメソッドで登録したプロシジャーは実行されませんでした。

 実際には、印刷操作を行った場合にイベントが発生してくれればよいですよね

 コードで印刷(PrintOut)させる場合は、イベントの連鎖ではなくコードでイベント内で処理させるコードをそのまま書いてしまえばよいのですから・・・・。

 大きい問題にはなりませんよね イベントの連鎖をBeforePrintでは、注意する ということですよね!!

 結論は出ていますが、考察という事で以下のようにすると、コードで印刷させてもイベントが連鎖されました。あくまでも実験的なコードです。私が実際にやるなら前述の方法で行います。

 ApiのSettimerを使ってみました。

 Thiswokbookのモジュールに

 '=========================================================================
 Option Explicit
 Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Cancel = True
    s_ed
    s_start
 End Sub
 Sub reprint()
    Application.EnableEvents = False
    ActiveSheet.PrintOut preview:=True
    Application.EnableEvents = True
 End Sub

 標準モジュールに

 '================================================================
 Option Explicit
 Private s_hwnd As Long
 Private s_nidevent As Long
 Private s_nelapse As Long
 Private s_tmfunc As Long
 Private s_id As Long
 Declare Function SetTimer Lib "user32" _
     (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
      ByVal lpTimerFunc As Long) As Long
 Declare Function KillTimer Lib "user32" _
      (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
 Sub s_setting(p_hwnd As Long, p_nidevent As Long, p_nelapse As Long, p_tmfunc As Long)
    s_hwnd = p_hwnd
    s_nidevent = p_nidevent
    s_nelapse = p_nelapse
    s_tmfunc = p_tmfunc
 End Sub
 Sub s_start()
    On Error Resume Next
    s_id = SetTimer(s_hwnd, s_nidevent, s_nelapse, s_tmfunc)
    On Error GoTo 0
 End Sub
 Sub s_ed()
    On Error Resume Next
    KillTimer s_hwnd, s_id
    On Error GoTo 0
 End Sub
 

 別の標準モジュールに

 Option Explicit
 Sub test()
    s_setting 0, 0, 250, AddressOf fake
    ActiveSheet.PrintOut
 End Sub
 Sub fake()
    Application.OnTime Now(), "thisworkbook.reprint"
    s_ed
 End Sub

 これでtestを実行すると、実際の印刷ではなく、プレビューが行われます。

 この印刷のイベントは何を危惧してこのような仕様にしているのでしょうねえ?

(ichinose) 2015/04/07(火) 21:18


ichinoseさんいつもありがとうございます。

 コード理解するのに時間がかかりましたが、試してみました。

 確かに、この方法であれば、上記のきっかけスレのプリンタ変更の件も、
 操作、マクロ両方の印刷の場合で設定可能でした。

 ただ仰るとおり、少なくとも今回の事例では
 ポート番号調べるほうが楽だし、わかりやすいので、
 この方法を利用することはなさそうです。

(マナ) 2015/04/08(水) 00:12


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.