Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : Access 2016)
印刷プレビューを一定時間経過後自動的に閉じるようにしたい
投稿日時: 17/04/23 11:55:13
投稿者: edx0w7r

ACCESS2013で、印刷のボタンをクリックするとレポートをプレビューを表示するようにしました。その後印刷を実行するようにしました。VBAに次のように記述しました。
Private Sub cmd_print_Click()
 
' 印刷するレポートをプレビューで開く
DoCmd.OpenReport "R_〇〇〇〇〇", acViewPreview
 
'プレビューで開いたレポートを印刷する
DoCmd.RunCommand acCmdPrint
 
End Sub
 
レポートを印刷する
DoCmd.RunCommand acCmdPrint
のレポートプレビューを閉じようとして次に下記のように記述しました。
DoCmd.Close acReport, "R_〇〇〇〇〇"
しかし、これではプレビューを開いて印刷を開始する前にすぐに閉じてしまいます。
 
このままでは、プレビューで開いたレポートを自動的に閉じることができません。
印刷後、2〜3秒後に自動的にプレビューを閉じたいのですがどのようにしたら良いでしょうか?お手数でもお教えください。
 
印刷 自動的にこのプレビューを閉じたいのですがどのようにしたら良いかわかりません。

回答
投稿日時: 17/04/23 14:20:56
投稿者: i-brown

単純にコードの実行を停止させるなら、Sleepで。
 
以下の宣言を追加すると、VBAの関数の中でWindows APIのSleep関数を呼び出せるようになります。

Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)

 
プレビューを表示しているコードでプレビュー表示中に2秒Sleepさせます。
DoCmd.RunCommand acCmdPrint
Sleep 2000    ' 2秒コードの実行が止まる
DoCmd.Close acReport, "R_〇〇〇〇〇"

 
ただし、この方法ではSleep中に何か操作しても
コードの実行が止まっているので、ユーザーの操作を受け付けないかもしれません。
 
なお、プレビューするということは「気に入らなかったら印刷しない」という意味を含んでいると思うので、「ボタンを押したらプレビューが開く」だけのほうが親切ではないかと思います。
ユーザーがそのまま印刷したければ、ユーザー自身が操作して印刷すれば良いでしょう。

投稿日時: 17/04/23 16:26:53
投稿者: edx0w7r

早速回答をいただきありがとうございます。
回答いただいた内容で、
Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
は、どこに記述すれば良いのでしょうか?
 
コードは、次のように記述しています。
cmd_printのボタンがありそれをクリックすると印刷プレビューを開き、その後印刷するようにしています。
ご指示いただいた
 Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)

Private Sub cmd_print_Click()
の前に挿入するとを試みましたが、宣言文のすぐ下に線が引かれて挿入ができませんでした。
 
 次のようになりました。
  Private Sub cmd_△△△△△_Click()
 
   〜 コード 〜
  
  End Sub
 
 Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
___________________________________________________________________________________
 
Private Sub cmd_print_Click()
 
' 印刷するレポートをプレビューで開く
DoCmd.OpenReport "R_〇〇〇〇〇", acViewPreview
 
'プレビューで開いたレポートを印刷する
DoCmd.RunCommand acCmdPrint
 
 Sleep 2000
 
End Sub
 
 お手数をおかけして申し訳ありませんがご教示をお願いします。

回答
投稿日時: 17/04/23 17:41:17
投稿者: hatena
投稿者のウェブサイトに移動

edx0w7r さんの引用:
回答いただいた内容で、
Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
は、どこに記述すれば良いのでしょうか?

 
フォームのモジュールの先頭に、
 
Option Compare Database
Option Explicit

 
と記述されてますが、その下に挿入するといいでしょう。
Option Explicit がない場合はそれも挿入してください。
 
Option Compare Database
Option Explicit
Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)

 
 
クリック時イベントは下記で。
 
Private Sub cmd_print_Click()
    ' 印刷するレポートをプレビューで開く 
    DoCmd.OpenReport "R_〇〇〇〇〇", acViewPreview
    DoEvents ’これがないと、プレビューが真っ白のままになる
    DoCmd.RunCommand acCmdPrint
    Sleep 2000
    DoCmd.Close acReport, "R_〇〇〇〇〇"
End Sub

 
 
ただし、
Sleepで待機している間は、ユーザーは何も操作ができないので、
あまり長く待機させるのは問題があります。
2秒ぐらいならいいでしょうが。
 
長く待機させる場合は、タイマー時イベントを使う方法も検討されるといいでしょう。
 
Private Sub cmd_print_Click()
    ' 印刷するレポートをプレビューで開く 
    DoCmd.OpenReport "R_〇〇〇〇〇", acViewPreview
    DoEvents ’これがないと、プレビューが真っ白のままになる
    DoCmd.RunCommand acCmdPrint
    Me.TimerInterval = 100000 '10秒後にタイマーイベント発生
End Sub

Private Sub Form_Timer()
    Me.TimerInterval = 0 'タイマーを止める
    On Error Resume Next 'ユーザーがレポート閉じた場合のエラーを無視する
    DoCmd.Close acReport, "R_〇〇〇〇〇"
End Sub

 
この方法だと待機中もユーザーは操作をできますので、待ちきれない場合はプレビューを閉じたりできます。
 
 
さらに、i-brownさんも指摘していますが、
本来プレビューというのは印刷する前に確認するためのものですので、
プレビューしてすぐ印刷というのはユーザーインターフェースとして、
どうかなと思います。
 
別にプレビューボタンがあるのならいいのですが。
(ただ、それなら、印刷するときにプレビューも表示させるというのはあまり意味がないとも思います。)

回答
投稿日時: 17/04/23 18:55:29
投稿者: i-brown

hatenaさん、フォローありがとうございます。

投稿日時: 17/04/23 20:22:31
投稿者: edx0w7r

i-brownさん、hatenaさん、お忙しいところ回答をいただきありがとうございました。明日以降になってしましますが、お二人のご教示いただいたことを参考にして改善させていただきます。
 なお、言葉足らずで申し訳ありませんでしたが、印刷を実行する前に、印刷プレビューだけを開くようにボタンを用意しています。「屋上屋を架す」ようで無駄だと承知をしてはいますが、印刷の時に念のために印刷プレビューも開くように考えました。
 誠にありがとうございました。

トピックに返信