Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
プリンタを速やかに止めたい
投稿日時: 19/05/23 18:09:22
投稿者: ngc1955

    
シートの列3にある名前のデータを入れて他のbookを印刷するマクロです
    
    For i = 1 To 20
     
        Workbooks(targetBook).Sheets("帳票1").Cells(4, 40) = Cells(i, 3) '氏名
         Workbooks(targetBook).PrintOut
 
    Next
 
    
おっと!ミス入力がありました。あわててCTR+breakとプリンタの停止・終了ボタン連打。
一回止まってもまたデータ受信中がでてなかなか止まりません。
コントロールパネルで見ると20回分のジョブが漸次実行されています。
 
場面A:単純に同じシートをExcelの印刷メニューから20部印刷中だとプリンタ停止ボタン押下後1つのジョブが速やかに削除され停止します。
 
VBAマクロで何らかの方法で場面Aのように停止させる方法はありますか。あるいは違う方法のマクロは考えられますか

回答
投稿日時: 19/05/23 18:42:36
投稿者: WinArrow
投稿者のウェブサイトに移動

「印刷」の仕組みは、
アプリケーション(Excelなど)の「印刷」ボタンなどをクリックすると
プリンタドライブのバッファに転送されます。
この時点でアプリケーションでは、制御できない状態になります。
 
手操作でプリンタの「中止」or「電源OFF]ボタンを押しましょう。

回答
投稿日時: 19/05/23 19:42:46
投稿者: WinArrow
投稿者のウェブサイトに移動

通常、いきなり、印刷するのではなく、印刷プレビューで確認してから、印刷するようにします。
VBAでも同じ対応ができますから、チャレンジしてみましょう。
 

回答
投稿日時: 19/05/23 20:06:22
投稿者: mattuwan44

印刷するときは、
データの転送速度より印刷のスピードの方が遅いので、
急に止めたいと思ってもすでにたくさんのデータがプリンターに送られた後です。
なので、迅速に止めるなら、プリンターの電源を切るのが一番かと思います。
当然、紙詰まり状態になりますが。。。。
 
それが、嫌なら、
1ページづつ印刷して、その間に少しキャンセルの命令を受け付けるように待つようにすることになります。
が、当然、今度は大量の印刷がなかなか終わらないようになります。。
 
他の方法もあるかも知れませんが、
現状を受け入れるのが、たぶん一番楽です。
 

投稿日時: 19/05/24 06:24:54
投稿者: ngc1955

あれから、いろいろ実験したのですが、私の所有するブラザーのプリンタでは
電源を切るとプリンタから「動作終了後電源を切ります」とでて電源が切れますが
コントロールパネルで印刷ジョブを観察するとその時1個のジョブが削除され
ますが19個のジョブがそのまま残り電源再投入するとご丁寧にそのジョブが
継続されて印刷が再開されます。これはちょっと困りました。
 
私は経験上ここでコントロールパネルを開いて19個のジョブを選択して右クリック削除する
方法を知っていますが配布先の事務の方はできないと思います。大混乱が目に浮かびます。
 
ここで、msgboxやプレビュー等で何とかユーザーと対話しながらそもそ印刷停止するような
事態を未然に防ぐのも方策と思いますが、プリンタから出てきた後「あついけない」って
私もよくやります。
 
ふと、プロが作ったアプリはどうなっているのだろうと年賀状ソフト「筆まめ」で
同じシーンを再現してみると例えば筆まめもそれぞれ異なる住所と名前を入れては
印刷を繰り返しますが、コントロールパネルでジョブを観察していると例えば20人の
宛名データを印刷してもプリンタのジョブは1個で20/20からカウントダウンを繰り返しています
ここでプリンタ停止ボタンや電源停止するとこのジョブは自動的に削除されて事なきを
得ます。(確かに1枚62円のはがき印刷が失敗のまま止まらなかったら大変!)
 
さてやはり方策としては
VBAコードでプリンタジョブを削除する方法
筆まめのような印刷動作にするVBAコードはやはりできないのでしょうか
技術のないものが勝手なことを言ってすみません。

回答
投稿日時: 19/05/24 07:31:42
投稿者: simple

VBAからプリンタをコントロールする手段は提供されていません。
プリンタ側に外部からコントロールできるAPIが提供されてでもいればですが、
普通は無理です。
 
・VBAで両面印刷にしたい
・印刷設定をVBAで実行できないか
・VBAでプリンタを中止できないか。
同じ趣旨の質問を続けていますが、いずれも同じことです。

回答
投稿日時: 19/05/24 08:20:09
投稿者: kumatti
投稿者のウェブサイトに移動

「印刷ジョブを取り消すプログラム」
http://bbs.wankuma.com/index.cgi?mode=al2&namber=57277&KLOG=96
 
この辺を見てると、WMIなのかなーという気はします。

回答
投稿日時: 19/05/24 08:37:06
投稿者: eden

違う方法で。
1回の Workbooks(targetBook).PrintOut で1つのジョブが作成されます。
印刷するデータをシートに並べて最後に1回 PrintOut を実行すれば
ジョブは1つになり、止める時も1回で済みます。

回答
投稿日時: 19/05/24 11:14:40
投稿者: WinArrow
投稿者のウェブサイトに移動

予防策として、Printoutの代わりに
PrintPreview
を使うことができます。
 
印刷イメージが表示されるので、確認して問題なければ、
「印刷」ボタンをクリックします。
問題あれが、「閉じる」ボタンクリックで終了します。
 
プログラムでは、どのボタンをクリックしたかを判定できます。
 
 
 
 
コントロールパネルの操作として
たまっているジョブを一挙にキャンセルできます。
 
ので、この操作も試してみてください。

投稿日時: 19/05/24 13:49:07
投稿者: ngc1955

みなさん ありがとうございます。WinArrowさん印刷プレビューのご提案ありがとうございました。
早速取り入れさせていただきました。やはり 大量印刷の前は事前確認は基本だと思います。
しかし人間ですから特に一人で作業していると思わぬことをやってしまいます
私も年賀状印刷で何度もプレビューで確認したつもりですが差出人を家内の名前で印刷して印刷が
始まってから気が付いたことがあります。印刷停止や電源ボタンOFFがすぐに効くことが大切だと
思いました。
 
私のVBAコードのようにWorkbooks(targetBook).PrintOutでループを回すとそあっという間に
大量のジョブが作成され、結果、プリンタ停止・電源OFFも機能しなくなりますね。
これは自分で使うならまだしも他の方が使う場合はダメだなと思いました。
 
それでedenさんのご提案ですが、感動しました。発想の転換が素晴らしいですね。
逆にジョブ一つになるようにすれば、皆さんがいう手動でプリンタの印刷停止ボタン電源ボタンが
一発で効きますものね。
 
ということでデータの差し込み先のブックをコピーしたシートに並べてからデータを書き込み最後に1回
だけbookを PrintOut を実行するVBAコードにしてみました
 
 For i = 1 To 20
     
    Workbooks(targetBook).Worksheets("帳票1").Activate
        ActiveSheet.Copy AFTER:=Worksheets("帳票1")
        
    Workbooks(targetBook).Worksheets(2).Cells(4, 36) = Cells(i, 1) '電算番号
        Workbooks(targetBook).Worksheets(2).Cells(4, 30) = Cells(i, 2) '職名
        Workbooks(targetBook).Worksheets(2).Cells(4, 40) = Cells(i, 3) '氏名
 
Next
      
    Application.DisplayAlerts = False
     Workbooks(targetBook).Worksheets("帳票1").Delete
     Application.DisplayAlerts = True
     
    Workbooks(targetBook).PrintOut
     
    Application.DisplayAlerts = False
    ActiveWorkbook.Close
    Application.DisplayAlerts = True
     
 
実際にはDo until ループでデータを読み出しに行くので何枚のシートに
なるかわからないのですが、帳票1原本は印刷したらダメなので最後消しに
いっていますがちょっと乱暴でしょうか。書き込んだ後変更終了無し保存としないと
ダメですね。
上級の方ならここもスマートに書けそうですが、試してみましたが、いちおう
目的の動作と「筆まめ」と同じようにプリンタ中止できるようになりました。
 
まあ、ちょっと落とし穴が心配ですが・・いかがでしょうか

回答
投稿日時: 19/05/24 15:22:41
投稿者: WinArrow
投稿者のウェブサイトに移動

確かに
PrintPreviwは、レイアウトなど体裁を確認するには、有効な手段ですが、
データのミス入力などには、対応できませんよね。
  
でも、ブックで一括印刷しても、例えば20件目にミスが発見した場合は、
 修正後、再印刷すると、同じだけ印刷されてしまいます。
  
ブックでの印刷指定より
 シートを指定して、印刷するような、手段を用意すれば、無駄な印刷がなくなると思います。
作業グループを利用すれば、複数シートを一括印刷できますよ。
 
 
なお、私だったら、WORDの差し込み印刷を利用しますが・・・

投稿日時: 19/05/24 16:47:14
投稿者: ngc1955

はい。それでデータを持っている呼び出し側ブックに1項目✓をいれるところ作って
印刷ジャムしたりデータ修正があった時には✓全クリアして該当のデータに✓をつける
という仕様にしました。
 
それから、教えていただいたグループ化によるシートの印刷を早速試してみましたが、
確かにプリントジョブは一つしか作成されないので、緊急停止できますね。
これも次回ぜひ使ってみようと思います。
 
それで、最後のワードの差し込みについては図星です。このアプリはワードの差し込み印刷に
対抗して作りました。おかげさまで印刷停止の問題は解決したので、これからアドバイスいただいた
プレビューやフォームによるメッセージ機能を盛り込んでユーザーフレンドリなインターフェイスを
作りたいと思います。配布先で、「これって差し込み印刷より便利ね!」って言われるのが目標です。

投稿日時: 19/05/24 16:48:47
投稿者: ngc1955

みなさんお世話になりました。解決済みにするのを忘れました。