Access (VBA)

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

 
(Windows 10 Pro : Microsoft 365)
別フォームで検索したidに対応するレポートを出力させたい
投稿日時: 23/01/22 21:51:27
投稿者: langwell

今、「Q開講科目基礎データ」というクエリをデータソースとする「F科目一覧」というフォームがあって、このフォームから様々な条件によって抽出した科目があって、その科目の「Qシラバスチェック」クエリをデータソースとするレポートを出したいと考えています。「F科目一覧」の[ID]フィールドは「Qシラバスチェック」の[科目IDフィールドに対応します。以下のコードを書きました。
 
Private Sub レポートcmd_Click()
 
 Dim strSQL As String
    strSQL = "SELECT ID FROM Q開講科目基礎データ WHERE " & Forms![F科目一覧].Filter
    With CurrentDb.OpenRecordset(strSQL)
    .MoveFirst
    Do Until .EOF
    DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , "[科目ID] =" & !ID
    .MoveNext
    Loop
    .Close
    End With
    
End Sub
 
ところが、検索した最初のレポートは出てきますが、そこで終了してしまいます。
ちなみに、DoCmd.OpenReport...の代わりに
MsgBox !ID
とすると、抽出したIDが順番にすべて出てきます。どうしてレホーとの場合は最初でとまってしまうのでしょうか。また、全部のレポートを出力させるにはどうすればよいのでしょうか。

回答
投稿日時: 23/01/23 00:33:47
投稿者: hatena
投稿者のウェブサイトに移動

レポートのプレビューは、表示できるのは一つだけです。複数表示させることはできません。
 
下記のように続けてプレビューを表示するコードを実行して確認してみてください。
(科目IDは実際に存在するものを指定してください。)
 
DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , "[科目ID] = 1"
DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , "[科目ID] = 2"
DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , "[科目ID] = 3"
 
最初の科目ID=1のプレビューしか表示できません。
acPreview を acViewNormal に変更して実行すると、複数枚印刷されると思います。
 
プレビューで抽出したIDをすべてプレビューさせたいなら、
レポートを科目IDでグループ化して、グループヘッダーで改ページを設定して、フォームで設定した抽出条件で OpenReport すればいいでしょう。
 

Private Sub レポートcmd_Click()

    DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , Forms![F科目一覧].Filter

End Sub

 
これで、プレビューでページ移動させればすべてのIDのプレビューを確認できます。
 
 
 

投稿日時: 23/01/23 10:30:49
投稿者: langwell

ありがとうございました。プレビューですべて表示することはできないのですね。
それで、「レポートを科目ID出グループ化して...」の方法をとりたいのですが、これがどうやったらよいのかわかりません。Forms![F科目一覧].Filterでとりだされる「科目ID」は一つも重なりませんし、このフォームのデーターソースになっている「Q開講科目基礎データ」にはレポートで出力されるデータは何1つはいっておらず、「Qシラバスチェック」から、「科目一覧フォーム」で抽出されたIDに対応する「科目ID_に対応する情報を引き出してレポートにしなくてはなりません。ですので
DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , Forms![F科目一覧].Filter
では、何もでできません。「Q開講科目基礎データ」にレポートに出力されるデータをすべて連結させなければならないのでしょうか。そうするとこのクエリがかなり重くなるような気がするのですが、、。

回答
投稿日時: 23/01/23 11:36:11
投稿者: hatena
投稿者のウェブサイトに移動

フォームのレコードソースとレポートのレコードソースの関係が分からないので推測ですが、下記でどうでしょう。
 
 

    Dim strFilter As String    
    strFilter = "[科目ID] In (SELECT ID FROM Q開講科目基礎データ WHERE " & _
                Forms![F科目一覧].Filter & ")"
    DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , strFilter

 
サブクエリを使ってフォームのフィルターで抽出されているIDと一致する[科目ID]を絞り込んでいます。

投稿日時: 23/01/23 13:22:42
投稿者: langwell

ありがとうございました。
しかし、このコードを使っても表示されるレポートは検索されたもののうち最初のIDだけでした。

回答
投稿日時: 23/01/23 16:00:53
投稿者: hatena
投稿者のウェブサイトに移動

ページ移動ボタンで移動できませんか。
 
また、下記のコードで抽出条件を設定せずに開いた場合は、どうなりますか。
 

DoCmd.OpenReport "RPシラバスチェックレポート", acPreview

 
科目IDごとに表示されてページ移動できますか。
 

投稿日時: 23/01/23 16:47:03
投稿者: langwell

ページ移動ボタンでは移動できません。存在しない、となります。
また抽出条件を書いていないコマンドを実行すると、フォーカスが当てられている科目のレポートだけが出力されます。

回答
投稿日時: 23/01/23 20:03:43
投稿者: hatena
投稿者のウェブサイトに移動

引用:
また抽出条件を書いていないコマンドを実行すると、フォーカスが当てられている科目のレポートだけが出力されます。

 
レポートのレコードソースのクエリに「フォーカスが当てられている科目」を抽出する条件が設定されているのだと思われますので、それを削除してください。

投稿日時: 23/01/23 22:36:54
投稿者: langwell

いろいろありがとうございました。
レポートの元になっているクエリにはフォーカスを指定する条件などありません。
結局、そもそも検索に使った「F科目一覧」のソースデータである「Q開講科目基礎データ」にレポートで表示させたいフィールドを全部組み入れて「RPシラバスチェックレポート」のソースデータにして、普通にやるように
 
DoCmd.OpenReport "RPシラバスチェックレポート", acPreview, , Forms![F科目一覧].Filter
 
で出力させました。検索に使うクエリとレポートを作成するクエリを同じものにしなくてはレポートのグループ化はできないようですね。いろいろとお騒がせして申し訳ありませんでした。はじめからこうしておけばよかったのですが、クエリが巨大になるので、重くなるのではないかと思ったのです。