Microsoft Access 掲示板

Screen.ActiveReport.nameで取得出来ない

5 コメント
views
4 フォロー

以前”印刷設定フォームを使い回したい”で投稿して回答頂いた者です。その節はお世話になりました。(レポートを開くと印刷設定フォームが開く。そのフォームには直ちに印刷等のボタンがあり。)
この機能を他の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つ目のレポート時はエラーがでます。(所定のフォームにレポートプレビューボタンをクリックした時)
エラーは ”指定した式ではレポートがアクティブウィンドウである必要があります”
理由がわからないです。お手数かけますが宜しくお願いします。

XS
作成: 2024/10/04 (金) 16:18:34
最終更新: 2024/10/05 (土) 08:53:58
通報 ...
1

これで1つ目のレポートには問題なく動作したのですが、2つ目のレポート時はエラーがでます。

「cmd直ちに印刷」をクリックしてレポートを印刷した後も「F印刷設定」フォームが開いたままなのが原因と思われます。開いたままだと、Form_Loadイベントは発生しませんので。

とりあえずの対策としては、印刷したら印刷設定フォームを閉じればいいでしょう。

Private Sub cmd直ちに印刷_Click()
    If vbOK = MsgBox("直ちに印刷を開始します。", vbOKCancel) Then
        DoCmd.OpenReport rptName, acViewNormal, "", "", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo '自身を閉じる
    Else
        MsgBox "印刷処理を中止します。", vbCritical
    End If
End Sub

ただ、レポートをプレビューせずに直接印刷したときとか、レポートのプレビューを閉じてしまった時のことも考慮する必要があるでしょう。

2
XS 2024/10/07 (月) 08:48:49 ddfe5@3ad83

hatenaさん ありがとうございます。
説明不足だったのですが(すみません)対象レポートを閉じる時のイベントに印刷設定フォームを閉じるコードも記述してます。
ファイルにはフォームが幾つかありそれぞれに異なるレポートをプレビューするボタンがあります。
最初にこの仕組みのコード記述したフォームAのレポートAをプレビューするボタンを実行すると問題なかったのですが、次にコード記述したフォームBのレポートBをプレビューするボタンを実行するとエラーが発生(レポート名が取得出来ていない)になるのです。試しに印刷設定フォームに MsgBox "名前は" & rptName のボタンを作成して様子みるとAの方は名前が表示されますが、Bでは無理です。レポートBにはサブレポートがあるのでその影響と思いサブレポートを消しても状況は同じでした・・・

3

Screen.ActiveReport.Name で対象レポート名を取得するのは不安定そうなので、OpenArgs引数でレポート名を渡せばどうでしょう。

Private Sub Report_Open(Cancel As Integer)
    DoCmd.OpenForm "F印刷設定", OpenArgs:=Me.Name
End Sub

Private Sub Report_Close()
    DoCmd.Close acForm, "F印刷設定"
End Sub
Private Sub Form_Open(Cancel As Integer)
    rptName = Me.OpenArgs   'レポート名取得
End Sub

レポートを複数プレビューしたり、プレビュー中に別のレポートを直接印刷したり、などの場合、おかしなことになるので、その辺のことを考慮して、Report_ActivateイベントやReport_Deactivateイベントを利用してレポート名を取得するほうがいいかも。

4

下記で紹介しているサンプルなら、上記の点も考慮していますので、よろしければご参考に。

印刷プレビューに[印刷][閉じる]ボタンを付加する関数-改良版
以前の記事 印刷プレビューに[印刷][閉じる]ボタンを付加するOpenReport互換関数 - hatena chips の改良版です。 上記の関数は、複数のプレビューを同時に開いたとき、最後に開いたものだけしか[印刷][閉じる]ボタンが付加されません。前に開いていたものからはボタンが消えてしまいます。これを改良して、複数のプレビューにもそれぞれ[印刷][閉じる]ボタンが付加されるようにしました。 また、レポートの開くときイ...
fc2

5
XS 2024/10/07 (月) 14:04:50 ddfe5@3ad83

hatenaさん ありがとうございます。
OpenArgsでしたらバッチリ上手く出来ました。感謝します!
紹介されている分もじっくり見て参考にさせて頂きます。
今回もお世話になりました。