Excel (VBA)

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

 
(Windows 10 Home : Microsoft 365)
印刷プレビューの画面で「印刷」ボタンを使用不可にしたい
投稿日時: 23/05/18 00:22:51
投稿者: はな8787

こんにちは。よろしくお願いいたします。
 
ws1:データ蓄積シート
ws2:印刷用フォーマット
 
ws1にある数件のデータを
ws2のフォーマットに1件ずつ埋め込んで印刷する作業を自動化しようとしています。
 
ws2にデータを埋め込んで、印刷プレビュー ⇒
「印刷プレビューを閉じる」ボタンを押下 ⇒
印刷するかしないかを確認 ⇒ 印刷
 
まではできました。
 
しかし、印刷プレビューのウィンドウ上にある「印刷」ボタンを押すと印刷ダイアログが立ち上があり
印刷ができてしまいます(このダイアログは表示したくない)。
そこで「印刷」ボタンを使用不可にするか、「印刷」ボタンが押されたことを判定できればと思うのですが
どのような方法があるのでしょうか?
 
ご存じの方がおられましたら、アドバイスいただけないでしょうか?
 
 
コード一部抜粋
 
ws2.PrintPreview EnableChanges:=False
        
res = MsgBox("プレビューされたデータを印刷しますか?" & vbLf, vbYesNo)
                     
If res <> 6 Then
  Exit Sub
Else
   ws2.PrintOut Copies:=1, Collate:=True
End If

回答
投稿日時: 23/05/18 07:14:50
投稿者: simple

既定のダイアログの中の特定の部品だけ使用不可にすることは、
できないのではないかと思います。
(Office.IAccessibleを利用するWinAPIを駆使すればできるのかもしれません。
  どなたかから回答があればよいですが、期待薄かもしれません。
  また、副作用やメインテナンスの側面も考え合わせると、
  できないと整理しておいた方が無難だと思います。)
 
なお、ThisWorkbookモジュールにWorkbook_BeforePrintというイベントプロシージャーがあります。
印刷命令をトリガーにして、印刷の直前に何かをさせたいときに使います。
また、Cancel変数をTrueにすれば、印刷そのものを取り消しできます。
 
しかし、残念ながら、
    ・Sheet1.PrintPreview
    ・Sheet1.PrintOut Copies:=1, Collate:=True, preview:=True
は、両方ともこのイベントに該当してしまうので、
PrintPreviewだけ活かして、印刷だけ抑止するということはできません。
 
■そもそもですが、それは
(1)ご自分を含め操作者の間違いの防止ということですか?
それとも
(2)情報の流出回避、情報保護の観点からですか?
もし、(2)の観点であれば、コピーペイストの抑止を含めたより広い観点からの対策が必要でしょう。
 
(1)であれば、それは注意力に期待するしかないと思います。
または、予め印刷必要なものだけに限定して印刷プレビューするような処理に変更するかでしょう。

回答
投稿日時: 23/05/18 08:02:37
投稿者: WinArrow
投稿者のウェブサイトに移動

そもそもの話ですが、
 
「印刷プレビュー」機能は、
印刷イメージを確認して、印刷するか/しない(しても問題ないか)を
判断して、それに対応するボタンをクリックすることになります。
 
印刷して問題がないことを判断して、「印刷する」を選択したのですから、
再度印刷する/しない
を確認する操作は、いささか、オーバースペックという感じがします。
 
それだったら、「印刷プレビュー」を使わずに
別な手段をっ検討しましょう。
 
例えば、PDF化する方法もあります。

投稿日時: 23/05/18 08:12:37
投稿者: はな8787

simpleさま
コメントありがとうございます。
 

simple さんの引用:

■そもそもですが、それは
(1)ご自分を含め操作者の間違いの防止ということですか?
それとも
(2)情報の流出回避、情報保護の観点からですか?
もし、(2)の観点であれば、コピーペイストの抑止を含めたより広い観点からの対策が必要でしょう。
 
(1)であれば、それは注意力に期待するしかないと思います。
または、予め印刷必要なものだけに限定して印刷プレビューするような処理に変更するかでしょう。

 
状況としては(1)に近く、普段ほとんどPCを使用ない人も使用するため
以下のような目的がありました。
・印刷ダイアログを出して余計なことをされるのを防止したい
・単価の高い紙に印刷するため、本当に印刷しても良いのか再確認
 
現状では印刷ボタンを使用すると印刷ダイアログが出て
確認用のメッセージを出さずに印刷できてしまいます。
そして印刷が終わった後に、同じデータを印刷するかのメッセージが出てきます。
 
以下のようなステップで印刷まで行いたいのですが、
コードの実行順や書き方の工夫?で実現することは可能なのでしょうか?
(印刷ダイアログが立ち上がるのは仕方がないとして)
1.プレビューでレイアウトを確認
2.印刷しても良いかのメッセージ
3.よければ印刷
 
何かご指導いただければチャレンジしてみたいです。

投稿日時: 23/05/18 09:03:10
投稿者: はな8787

WinArrowさま
コメントありがとうございます。
 

WinArrow さんの引用:

操作する人が、不慣れということではなく、
印刷してよいかを買う人するための「印刷プレビュー」ですから、
それを再度確認させる・・・ということが余計なことと思います。
 
紙の無駄遣いをしないためでしたら、
印刷プレビューの代用おして、PDF化で対応する方法があります。
PDF化:印刷イメージを画面委表示して、印刷してもよいと判断して印刷することが出来まし。

 
確かに自分でも再確認は「くどい」かな?と思いつつ実効していました。
PDFにしてから印刷はいいアイデアですね!
ちょっと検討してみたいと思います。

回答
投稿日時: 23/05/18 09:07:29
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

以下のような目的がありました。
・印刷ダイアログを出して余計なことをされるのを防止したい
・単価の高い紙に印刷するため、本当に印刷しても良いのか再確認

 
  
概ね目的が理解できました。
>・印刷ダイアログを出して余計なことをされるのを防止したい
  
操作する人が、不慣れということではなく、
印刷してよいかを確認するための「印刷プレビュー」ですから、
それを再度確認させる・・・ということが余計なことと思います。
  
紙の無駄遣いをしないためでしたら、
印刷プレビューの代用として、PDF化で対応する方法があります。
PDF化:印刷イメージを画面に表示して、印刷してもよいと判断して印刷することが出来まし。
  
共用プリンタを使っている場合は、特別な紙をセットしている最中に、別のPCからの割込みされる
リスクも考えられます。ことらは、本当ンお無駄使いになりますね?
PDFにしておいて、あとで、まとめて印刷した方が安全かと思います。
 
もう一つの打開策は、
印刷用シートを複写して、印刷イメージのシートを必要なだけ作成します。
印刷イメージのシートを作業グループとして、「印刷プレビュー」もしくは「PDF化」して
一挙に印刷する方法です。

回答
投稿日時: 23/05/18 10:40:30
投稿者: WinArrow
投稿者のウェブサイトに移動

付録のレス
  
「印刷プレビュー」で、操作者が実施した操作を取得することができます。
  

Dim Ret
    Ret = ws.PintPreview
    If Ret Then
      '印刷ダイアログで「OK」を選択(印刷した)
    Else
        '「印刷プレビュー―を閉じる」を選択
     または、印刷ダイアロウで「キャンセル」を選択(印刷しなかった)
     End If

投稿日時: 23/05/18 11:27:28
投稿者: はな8787

WinArrowさま
ありがとうございます。
 
まさにこれが知りたかったのです!
今回はPDFで印刷レイアウト確認で進めようと思いますが
知りたかったことが知れて感激です。
 

WinArrow さんの引用:
付録のレス
  
「印刷プレビュー」で、操作者が実施した操作を取得することができます。
  

Dim Ret
    Ret = ws.PintPreview
    If Ret Then
      '印刷ダイアログで「OK」を選択(印刷した)
    Else
        '「印刷プレビュー―を閉じる」を選択
     または、印刷ダイアロウで「キャンセル」を選択(印刷しなかった)
     End If

 
WinArrowさま
simplyさま
 
ありがとうございました。