- ベストアンサー
Access2003レポートの連続印刷方法とは?
- Access2003で取引案件管理データベースを作成している場合、案件ごとにA、B、Cの三種類のレポートがあり、それを順番に印刷する方法を知りたいです。
- 具体的には、総合メニューにある「レポート印刷ボタン」を押すと、案件ごとに連続でレポートA、B、Cを印刷できるようにしたいです。
- コードの組み合わせやレコード送りを利用することで実現できると思いますが、時間的な制約から試行錯誤する時間がありません。コードの具体的な実装方法を教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
部署,案件ID順に、Filterで対象を制限してレポートを出力したいということですね。 Set rs = dbs.OpenRecordset("テーブル") と書きましたが、ここで指定できるのはテーブル名だけではなく、SQLのSELECT文も指定できます。 なので、CaseごとにOpenのしかたを変えてください。 Select Case Group Case "sda" Set rs = dbs.OpenRecordset("SELECT 案件ID FROM テーブル WHERE 部署 LIKE 'xxx' ORDER BY 部署, 案件ID") Case "sdb" Set rs = dbs.OpenRecordset("SELECT 案件ID FROM テーブル WHERE 部署 LIKE 'yyy' ORDER BY 部署, 案件ID") Case "sdc" Set rs = dbs.OpenRecordset("SELECT 案件ID FROM テーブル WHERE 部署 LIKE 'zzz' ORDER BY 部署, 案件ID") Case Else msgbox "エラー" Exit Sub End Select レポート出力部分は、次のようになります。 DoCmd.OpenReport "レポートA", acViewNormal, WhereCondition:="[案件ID] ='" & rs!案件ID & "'" DoCmd.OpenReport "レポートB", acViewNormal, WhereCondition:="[案件ID] ='" & rs!案件ID & "'" DoCmd.OpenReport "レポートC", acViewNormal, WhereCondition:="[案件ID] ='" & rs!案件ID & "'"
その他の回答 (1)
- nag0720
- ベストアンサー率58% (1093/1860)
レコードの読み込み方法が分からないのでしょうか。 テーブルのアクセス方法には、ADOとDAOがあります。 (DAOの場合) Sub レポート印刷() Dim dbs As Database Dim rs As DAO.Recordset Set dbs = CurrentDb Set rs = dbs.OpenRecordset("テーブル") Do Until rs.EOF MsgBox rs!項目 rs.MoveNext Loop rs.Close End Sub (ADOの場合) Sub レポート印刷() Dim cnn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cnn = CurrentProject.Connection rs.Open "テーブル", cnn Do Until rs.EOF MsgBox rs!項目 rs.MoveNext Loop rs.Close cnn.Close End Sub
補足
レコードの読み込み方「も」なのですが…仕様についての説明足らずで申し訳ありません。 まず、このレポートのソースとなっているテーブルは(個々のレポートの中だけで複数あります) また、ユーザに開示するレコードはあくまでそのユーザが所属する部署のものだけとしたいので、入力フォームおよび各レポートに次のようにフィルタをかけています。 Me.OrderBy = "[部署],[案件ID]" Me.OrderByOn = True Select Case Group Case "sda" Me.Filter = "部署 like 'xxx'" Me.FilterOn = True Case "sdb" Me.Filter = "部署 like 'yyy'" Me.FilterOn = True Case "sdc" Me.Filter = "部署 like 'zzz'" Me.FilterOn = True Case Else End Select End Sub ちなみに、案件IDは文字列です。 たりたいことをより正確にかくと、 1.ユーザの部署にフィルタをかけた状態で一番初めに表示される(ソートで一番前になる)案件001のレポートAを印刷 2.001のレポートBを印刷 3.001のレポートCを印刷 2.ソート順2番目の案件002のレポートAを印刷… となります。 この場合、教えて頂いたコードの Set rs = dbs.OpenRecordset("テーブル") の下のところに Me.OrderBy = "[部署],[案件ID]" Me.OrderByOn = True Select Case Group Case "sda" Me.Filter = "部署 like 'xxx'" Me.FilterOn = True Case "sdb" Me.Filter = "部署 like 'yyy'" Me.FilterOn = True Case "sdc" Me.Filter = "部署 like 'zzz'" Me.FilterOn = True Case Else End Select End Sub という構文を埋め込むようなイメージでしょうか。 また、印刷対象となるのはあくまでレポートなのですが、それはどのタイミングで記述すればよいのでしょうか。 (rs.Open "テーブル", cnn Do Until rs.EOF MsgBox rs!項目 という構文はテーブルの全項目を読み出している、という意味と推察しているのですが、テーブルごとにこういった形で指定しなければいけ二のでしょうか…どのテーブルのどの項目をつかう、というのはレポートで設定してあるのでレポートの指定ができたら一発かと思うのですが…) わかりづらくてすみません; 宜しくお願い致します。
補足
丁寧なご解説ありがとうございます。 アドバイスを元に下記のようにコードを作成したのですが、 一件目の印刷が終わった後に、エラーが出てしまいました。 内容は「このコレクションには項目がありません」というもので、 デバックの画面ではMsgBox rs!項目の部分が黄色くなっていました。 ただ、この「MsgBox rs!項目」の構文を削除して試してみたのですが、 すると一件目だけ印刷して終了してしまいました。 構文の順番が間違っているのでしょうか…? Private Sub コマンド23_Click() Dim dbs As Database Dim rs As DAO.Recordset Dim stDocName As String Set dbs = CurrentDb Select Case Group Case "sda" Set rs = dbs.OpenRecordset("SELECT 案件ID FROM 案件マスター WHERE 部署 LIKE 'xxx' ORDER BY 部署,案件ID") Case "sdb" Set rs = dbs.OpenRecordset("SELECT 案件ID FROM 案件マスター WHERE 部署 LIKE 'yyy' ORDER BY 部署,案件ID") Case Else Exit Sub End Select DoCmd.OpenReport "レポートA", acViewNormal, WhereCondition:="[案件名] ='" & rs!案件ID & "'" DoCmd.OpenReport "レポート", acViewNormal, WhereCondition:="[案件名] ='" & rs!案件ID & "'" DoCmd.OpenReport "レポートC", acViewNormal, WhereCondition:="[案件名] ='" & rs!案件ID & "'" Do Until rs.EOF MsgBox rs!項目 rs.MoveNext Loop rs.Close End Sub