[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.