以下のような仕様にて、Access2003で取引案件管理データベースをつくっています。
一案件ごとにA,B,Cと三種類のレポートがあり、それを順番に印刷する機能を追加しようとしているのですが、方法がわからず、アドバイスをお願い致します。
*仕様*
・ユーザはアクセスオープン時に、自身のIDとパスワードを入力
・認証が通ると、総合メニュー画面が起動される。
総合メニューには「入力フォーム起動ボタン」と「レポート印刷ボタン」がある
・DB内部でIDとユーザの所属部署の紐付けを行っており、入力フォームを起動すると、自分の所属部署の担当案件だけが表示される
(フォームのコードで、グループごとにフィルタをかけている)
・レポートは案件ごとにA,B,Cと三枚に分かれている
・入力フォーム内にも、印刷ボタンがあり、それを押すと表示されている案件のレポートがA、B、Cの順番で出力される。
コードは以下の通り
DoCmd.OpenReport "レポートA", acViewNormal, WhereCondition:="[案件名] ='" & Me.案件名 & "'"
DoCmd.OpenReport "レポートB", acViewNormal, WhereCondition:="[案件名] ='" & Me.案件名 & "'"
DoCmd.OpenReport "レポートC", acViewNormal, WhereCondition:="[案件名] ='" & Me.案件名 & "'"
*今回つくりたい機能*
総合メニューの「レポート印刷ボタン」の中身を実装したいと考えています。
これを押すと、案件ID「001」のレポートA→B→C→案件ID「002」のレポートA→B→C→案件ID「003」・・というように、案件ごとにレポートA,B,Cがセット(連続)で印刷できるようにしたいのです。
上の構文と、レコード送りを組み合わせればいいのではないかと予想はついているのですが…緊急対応で、自分でコードを試行錯誤している時間がないもので、コードを上のような機能を実現できるコードを教えて頂けますと幸いです。宜しくお願い致します。
No.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 & "'"
この回答への補足
丁寧なご解説ありがとうございます。
アドバイスを元に下記のようにコードを作成したのですが、
一件目の印刷が終わった後に、エラーが出てしまいました。
内容は「このコレクションには項目がありません」というもので、
デバックの画面では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
No.1
- 回答日時:
レコードの読み込み方法が分からないのでしょうか。
テーブルのアクセス方法には、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!項目
という構文はテーブルの全項目を読み出している、という意味と推察しているのですが、テーブルごとにこういった形で指定しなければいけ二のでしょうか…どのテーブルのどの項目をつかう、というのはレポートで設定してあるのでレポートの指定ができたら一発かと思うのですが…)
わかりづらくてすみません;
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Access(アクセス) access レポート 請求書について 2 2022/07/04 22:52
- その他(クラウドサービス・オンラインストレージ) おすすめのパスワードマネージャは? 1 2023/02/28 20:09
- 事件・犯罪 刑法についてです 2 2022/06/04 03:11
- Access(アクセス) MSaccessのレポートを開く 2 2022/09/01 13:16
- 事件・犯罪 刑法についてだれか助けてください。 2 2022/06/05 04:08
- Access(アクセス) お世話になっています 下記データがクエリにあります。 商品名 A A B B B B B C C C 1 2022/09/11 21:07
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- 固定電話・IP電話・FAX 業務用ファックスについて 5 2022/09/28 19:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルをACCESSのレポ...
-
Accessレポートのチェックボッ...
-
レポート等をURLで送信のU...
-
Accessでフォームの検索結果を...
-
Accessでグループフッターの非表示
-
Accessのレポートの2段組した...
-
ビシソワーズはなぜ冷たいのか?
-
医療専門用語がスラスラ出てく...
-
Accessのレポートで番号順に表...
-
ACCESSでフォーム入力→レポート...
-
アクセスのレポート起動時のウ...
-
YahooのIDがロックされてしまい...
-
Accessで、フォームからフォー...
-
サブフォームに対してGoToRecor...
-
レコードを保存するコード ア...
-
Accessの検索フォームで。
-
Accessフォームからパラメータ...
-
エクセル 自動入力
-
アクセスでテキストボックスの...
-
このオブジェクトに値を代入す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルをACCESSのレポ...
-
Accessレポートのチェックボッ...
-
アクセスのレポートで同ページ...
-
Accessのレポートで印刷プレビ...
-
複数のクエリーを一枚のレポー...
-
アクセスのレポート起動時のウ...
-
ACCESSでフォーム入力→レポート...
-
Accessのレポートで再読み込み
-
AccessVBAでのカラー印刷モード
-
Accessでグループフッターの非表示
-
Access2007サブレポートの絞り...
-
Accessのレポートのデザインに...
-
Accessのレポート機能でソート...
-
アクセスのレポートをマクロでE...
-
Accessのレポートの2段組した...
-
禁則処理の方法がわかりません。
-
PDF変換後、線が表示されない
-
アクセス2007のレポートの...
-
Excel ピボットレポート セル...
-
アクセスでレポートの使いまわ...
おすすめ情報