Access (VBA)

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

 
(指定なし : 指定なし)
サブレポートのソースを変更する方法
投稿日時: 21/06/09 11:16:39
投稿者: だいふくもち

いつもこちらのコミュニティには大変お世話になっております。
現在、勉強しながらAccessで作成しているものがあるのですが、途中で行き詰まってしまい、
ご経験者さまのご意見を伺うことができればと思い、ご相談させていただきました。
 
複数のテーブルをまとめた「Q_一括印刷クエリ」のレコード値を、
「R_請求書テンプレート」というレポートにループ処理で渡し、全レコード出力するのが最終目標です。
 
「一括印刷」と「スポット印刷」でクエリを分けていますが、レポートは共有しております。
そのため、レポートのソースとなるクエリを処理時に設定したいのですが、
サブレポートの設定の仕方が分かりません…
 
次で試すと、『実行時エラー7784:選択したオブジェクトは、サブフォームまたはサブレポートとしてデザインモードで既に開かれています。このオブジェクトをデザインビューで開くには、サブフォームまたはサブレポートが既に開かれているオブジェクトで、サブフォームまたはサブレポートを選択し、[デザイン]タブの[ツール]グループにある[新しいウィンドウでサブフォームを開く]をクリックしてください』というエラーが表示されます。
 

'レポートをデザインモードで開く
DoCmd.OpenReport "R_請求書テンプレート", acViewDesign
'レポートのレコードソースを設定する
Reports("R_請求書テンプレート").RecordSource = "Q_一括印刷クエリ"
'*****以降問題の処理*****
'サブレポート1を開く
DoCmd.OpenReport "R_印刷サブレポート_宛名", acViewDesign
'サブレポート1のレコードソースを設定する
Reports("R_印刷サブレポート_宛名").RecordSource = "Q_一括印刷クエリ"
'サブレポート2を開く
DoCmd.OpenReport "R_印刷サブレポート__住所", acViewDesign
'サブレポート2のレコードソースを設定する
Reports("R_印刷サブレポート_住所").RecordSource = "Q_一括印刷クエリ"
'レポートを保存し閉じる
DoCmd.Close acReport, "R_請求書テンプレート", acSaveYes

 
「OpenReport」を外すと、『実行時エラー2451:レポート名「R_印刷サブレポート_宛名」の指定が間違っています。または、参照しているレポートが閉じているか、存在しません』と表示されます。
 
'レポートをデザインモードで開く
DoCmd.OpenReport "R_請求書テンプレート", acViewDesign
'レポートのレコードソースを設定する
Reports("R_請求書テンプレート").RecordSource = "Q_一括印刷クエリ"
'*****以降問題の処理*****
'サブレポート1のレコードソースを設定する
Reports("R_印刷サブレポート_宛名").RecordSource = "Q_一括印刷クエリ"
'サブレポート2のレコードソースを設定する
Reports("R_印刷サブレポート_住所").RecordSource = "Q_一括印刷クエリ"
'レポートを保存し閉じる
DoCmd.Close acReport, "R_請求書テンプレート", acSaveYes

 
メインレポートからサブレポートに移り、ソースを変えるにはどのように書けば良いか分かりません。
どなたかご存じの方がいらっしゃいましたら、教えていただけませんでしょうか?
念のため、一連のコードを記載させていただきます。
 
Private Sub 印刷ボタン_Click()

'デスクトップのパスを取得するためにCreateObject関数を使用する
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")

Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.recordSet
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Q_一括印刷クエリ")

'クエリのパラメータ値の取得先を指定する
qdf.Parameters("[forms]![F_一括印刷]![FROMTO年月]") = [Forms]![F_一括印刷]![FROMTO年月] '入金月フィールド
qdf.Parameters("[forms]![F_一括印刷]![請求日コンボ]") = [Forms]![F_一括印刷]![請求日コンボ] '請求日フィールド

'上記で設定したパラメータの値でクエリを開く
Set rst = qdf.OpenRecordset()

'レポートに渡す値を格納する変数
Dim strOpenArgs As String

    Do Until rst.EOF
        'レポートに渡す値を代入
        strOpenArgs = Nz(rst!賃貸借期間_開始.Value, 0) & "," & Nz(rst!契約期間_開始.Value, 0) & "," & Nz(rst!請求日, 0) & "," & Nz(rst!支払形態, 0) & "," & Nz(rst!入金月, 0) & "," & Nz(rst!レポート種類, 0)
        'レポートをデザインモードで開く
        DoCmd.OpenReport "R_請求書テンプレート", acViewDesign
        'レポートのレコードソースを設定する
        Reports("R_請求書テンプレート").RecordSource = "Q_一括印刷クエリ"
      '*****以降問題の処理*****
      'サブレポート1を開く
            DoCmd.OpenReport "R_印刷サブレポート_宛名", acViewDesign
            'サブレポート1のレコードソースを設定する
            Reports("R_印刷サブレポート_宛名").RecordSource = "Q_一括印刷クエリ"
      'サブレポート2を開く
            DoCmd.OpenReport "R_印刷サブレポート_住所", acViewDesign
            'サブレポート2のレコードソースを設定する
            Reports("R_印刷サブレポート_住所").RecordSource = "Q_一括印刷クエリ"
        'レポートを保存し閉じる
        DoCmd.Close acReport, "R_請求書テンプレート", acSaveYes
        'レポートをプレビュー画面で開く (契約番号でフィルターを掛け、レポートに変数を渡す)
        DoCmd.OpenReport "R_請求書テンプレート", acViewPreview, , "[契約番号]='" & rst!契約番号 & "'", , strOpenArgs
         'レポートをデスクトップにPDF出力する
        DoCmd.OutputTo acOutputReport, "R_請求書テンプレート", acFormatPDF, wsh.SpecialFolders("Desktop") & "\請求書_." & rst!契約番号 & ".pdf"
        '次のレコードに移動する
        rst.MoveNext
    Loop

End Sub

 
また、他に指摘すべき箇所がありましたら、ご教授いただけますと大変有難いです!
ここまで読んでくださってありがとうございました。

回答
投稿日時: 21/06/09 13:19:29
投稿者: Suzu

全てを見れてはいませんが、
メイン - サブ構成の場合、手動で行って貰えれば判りますが
メインをデザインビューで開くと、サブレポートコントロール内に、サブレポートも表示されますよね?
 
これは、サブレポートもデザインビューで開かれている事になります。
ですので、メインレポートを デザインビューで開いたままの状態で
サブレポートを開こうとしても、すでに開かれているので
「実行時エラー7784:選択したオブジェクトは、サブフォームまたはサブレポートとしてデザインモードで既に開かれています。」となるのです。
 
・メインレポートを閉じ、サブレポートを開き、レコードソース設定
・メインレポートから サブレポートコントロール内の レポートのレコードソースを設定
    Reports("メインレポート名").Controls("サブレポートコントロール名").Report.RecordSource=〜〜
 
のどちらかでしょう。
 
個人的には、
 サブのオブジェクトのレコードソースを変更、保存後 閉じ、その後で、メイン側の設定を行います。

投稿日時: 21/06/09 16:42:44
投稿者: だいふくもち

>suzu様
ご指摘いただいた通りの内容でやってみたところできました!
ひとつずつ開いて…閉じて…をすれば良かったのですね…単純なことでした。
分かりやすくかつ丁寧に教えていただき、本当にありがとうございました!
 

'サブレポート1の設定
DoCmd.OpenReport "R_印刷サブレポート_宛名", acViewDesign
Reports("R_印刷サブレポート_宛名").RecordSource = "Q_一括印刷クエリ"
DoCmd.Close acReport, "R_印刷サブレポート_宛名", acSaveYes
'サブレポート2の設定
 DoCmd.OpenReport "R_印刷サブレポート_住所", acViewDesign
Reports("R_印刷サブレポート_住所").RecordSource = "Q_一括印刷クエリ"
DoCmd.Close acReport, "R_印刷サブレポート_住所", acSaveYes
'メインレポートの設定
DoCmd.OpenReport "R_請求書テンプレート", acViewDesign
Reports("R_請求書テンプレート").RecordSource = "Q_一括印刷クエリ"
DoCmd.Close acReport, "R_請求書テンプレート", acSaveYes 'レポートを保存し閉じる