[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
コード理解するのに時間がかかりましたが、試してみました。
確かに、この方法であれば、上記のきっかけスレのプリンタ変更の件も、 操作、マクロ両方の印刷の場合で設定可能でした。
ただ仰るとおり、少なくとも今回の事例では ポート番号調べるほうが楽だし、わかりやすいので、 この方法を利用することはなさそうです。
(マナ) 2015/04/08(水) 00:12
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.