以前”印刷設定フォームを使い回したい”で投稿して回答頂いた者です。その節はお世話になりました。(レポートを開くと印刷設定フォームが開く。そのフォームには直ちに印刷等のボタンがあり。)
この機能を他のACCESSファイルに使おうと思い同じ様にフォーム・レポートには下記のコード記述してます。
●フォーム
Option Compare Database
Option Explicit
Private rptName As String 'レポート名用変数
Private Sub Form_Load()
rptName = Screen.ActiveReport.name 'レポート名取得
End Sub
Private Sub cmd直ちに印刷_Click()
If vbOK = MsgBox("直ちに印刷を開始します。", vbOKCancel) Then
DoCmd.OpenReport rptName, acViewNormal, "", "", acNormal
Else
MsgBox "印刷処理を中止します。", vbCritical
Exit Sub
End If
End Sub
●レポート
Private Sub Report_Open(Cancel As Integer)
DoCmd.OpenForm "F印刷設定"
End Sub
これで1つ目のレポートには問題なく動作したのですが、2つ目のレポート時はエラーがでます。(所定のフォームにレポートプレビューボタンをクリックした時)
エラーは ”指定した式ではレポートがアクティブウィンドウである必要があります”
理由がわからないです。お手数かけますが宜しくお願いします。
「cmd直ちに印刷」をクリックしてレポートを印刷した後も「F印刷設定」フォームが開いたままなのが原因と思われます。開いたままだと、Form_Loadイベントは発生しませんので。
とりあえずの対策としては、印刷したら印刷設定フォームを閉じればいいでしょう。
ただ、レポートをプレビューせずに直接印刷したときとか、レポートのプレビューを閉じてしまった時のことも考慮する必要があるでしょう。
hatenaさん ありがとうございます。
説明不足だったのですが(すみません)対象レポートを閉じる時のイベントに印刷設定フォームを閉じるコードも記述してます。
ファイルにはフォームが幾つかありそれぞれに異なるレポートをプレビューするボタンがあります。
最初にこの仕組みのコード記述したフォームAのレポートAをプレビューするボタンを実行すると問題なかったのですが、次にコード記述したフォームBのレポートBをプレビューするボタンを実行するとエラーが発生(レポート名が取得出来ていない)になるのです。試しに印刷設定フォームに MsgBox "名前は" & rptName のボタンを作成して様子みるとAの方は名前が表示されますが、Bでは無理です。レポートBにはサブレポートがあるのでその影響と思いサブレポートを消しても状況は同じでした・・・
Screen.ActiveReport.Name で対象レポート名を取得するのは不安定そうなので、OpenArgs引数でレポート名を渡せばどうでしょう。
レポートを複数プレビューしたり、プレビュー中に別のレポートを直接印刷したり、などの場合、おかしなことになるので、その辺のことを考慮して、Report_ActivateイベントやReport_Deactivateイベントを利用してレポート名を取得するほうがいいかも。
下記で紹介しているサンプルなら、上記の点も考慮していますので、よろしければご参考に。
hatenaさん ありがとうございます。
OpenArgsでしたらバッチリ上手く出来ました。感謝します!
紹介されている分もじっくり見て参考にさせて頂きます。
今回もお世話になりました。