- ベストアンサー
アクセス2003でレポート印刷について。
いつもいつもお世話になっています。 アクセス2003で月間の抽出結果一覧がある帳票フォーム(選択クエリがレコードソースです)があり、印刷ボタンでその一覧のレポートを印刷したいと考えています。 そのフォームを開く時に、抽出条件として西暦と月を入力するのですが、そのレポート(同じ選択クエリがレコードソース)を印刷するときも再度西暦と月を指定しなければいけません。この年、月の入力を一度ですませるにはどのようにしたらよいでしょうか? どなたかよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 > 「全てが埋まった場合のみ抽出を行うような制御」の組み方を教えて それでは、『年』『月』『日』の抽出条件を指定するテキストボックスを、 それぞれ『抽出年』『抽出月』『抽出日』とした場合で説明します。 【VBAの場合】 '『抽出年』の更新後処理 Private Sub 抽出年_AfterUpdate Call ExtractRecords End Sub '『抽出月』の更新後処理 Private Sub 抽出月_AfterUpdate Call ExtractRecords End Sub '『抽出日』の更新後処理 Private Sub 抽出日_AfterUpdate Call ExtractRecords End Sub '各テキストボックスから呼び出す共通処理 '(上記の更新後処理と同じフォームに転記して下さい) Private Sub ExtractRecords() 'エラー発生時には「エラー処理:」の行に飛ばすための宣言 On Error Goto エラー処理 '変数の宣言 Dim sYr As String, sMn As String, sDy As String '各テキストボックスの値を変数に記録 '(Nz関数を使用して、Nullは空文字に変換) sYr = Nz(抽出年, "") sMn = Nz(抽出月, "") sDy = Nz(抽出日, "") 'どれかひとつでも空白(Nullまたは空文字)だった場合は処理を中止 If sYr = "" Or sMn = "" Or sDy = "" Then Goto 終了処理 '再クエリを実行 Me.Requery 終了処理: '「ExtractRecord」Subを抜ける '(これを入れないと「エラー処理」と無限ループになるので注意) Exit Sub エラー処理: 'エラー内容をメッセージで表示し、処理を中止 MsgBox Err.Number & ":" & Err.Description, , Me.Name & " ExtractRecords" Resume 終了処理 End Sub 【マクロの場合】 1)新規マクロをデザインビューで開き、名前を「M1_月間抽出」として保存 (現在作成済みのマクロでもOk) 2)『条件』列が表示されていない場合は、『マクロ』ツールバーの『条件』ボタンを クリックするか、メニューで「表示(V)→条件(C)」を選択してひょうじさせる 3)『条件』欄に以下の式を入力(フォーム名を仮に「F1_月間抽出」とします): Nz(Forms!F1_月間抽出!抽出年,"")="" Or Nz(Forms!F1_月間抽出!抽出月,"")="" Or Nz(Forms!F1_月間抽出!抽出日,"")="" 4)上記の条件を指定した行の『アクション』欄に、「マクロの中止」を指定 5)次の行の『アクション』欄に、「再クエリ」を指定 (引数の『コントロール名』は空白のままでOk) 6)マクロを保存して閉じる 7)当該フォームをデザインビューで開き、各テキストボックスの更新後処理に、 上記マクロ(M1_月間抽出)を指定して保存 (上記マクロは、各テキストボックス(抽出年・抽出月・抽出日)で共通で使えます) ※普段サブマクロ名(→「2」で『条件』に行ったのと同様の処理で表示できる 『マクロ名』で指定する名前)を使用している場合は、上記のマクロにサブマクロ 名をつけてもOkです。その場合は、各テキストボックスでもサブマクロ名まで 指定して下さい。 ・・・長くなりましたが(汗)、以上です。
その他の回答 (2)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.1です。 > 単に非連結のテキストボックスを置いたほうがよいのでしょうか。 > それともフィールドリストからもってきたほうがよいのでしょうか。 今回のように、抽出条件を指定する場合は、フィールドリストから ではなく、非連結のテキストボックスを使用します。 <連結コントロール(=フィールドリストからの場合)> プロパティシートの『データ』タブの『コントロールソース』に、選択 したフィールドが設定されます。 これは、テーブルに記録したデータを直接表示したい時に使用します。 <非連結コントロール> 『コントロールソース』が空白のコントロール(=フィールドに連結して いないコントロール)になります。 これは、例えば今回の『抽出条件』のように、テーブルに保存しない 値を一時的に入力したりするのに使用します。 ※『コントロールソース』に式を指定したものは「演算コントロール」と 呼ばれます(例えば合計値を表示させたいときなどに使用)。 > 現在のクエリでは日付を年と月と日に分けて、選択クエリでひとつずつ > 指定して抽出 この場合は、ヘッダまたはフッタに、『年』『月』『日』を指定するための テキストボックス(又は月なら1~12のみ指定可能にしたコンボボックス やリストボックスでも可)を設置した上で、クエリの『抽出条件』欄に、 No.1の時と同様に、今指定しているパラメータを、対応するコントロール のアドレスに置き換えてやればOkです。 (抽出条件欄の「[西暦年は?]」を「Forms!フォーム名!抽出年」に、 「[月は?]」を「Forms!フォーム名![抽出月]」に、といった感じ) なお、この場合は、『年』『月』『日』の各コントロールの更新後処理で それぞれ再クエリを行うのと、コマンドボタンを設置してやるのと、どちらが いいかは、ちょっと微妙です(汗) (前者では、どれか1個を指定した段階で検索が掛かってしまいますし、 後者では、前回言ったように、フォームとレポートで異なる結果が 表示される可能性が出てしまいます: 前者は、全てが埋まった場合のみ抽出を行うような制御を組む、 後者は、フォームでの抽出時の値を別に記録しておいて、レポートでも その値を使用するようにする(→非表示の非連結テキストボックスを 用意するなどして、抽出時にはそちらに転記&クエリはそちらを参照、 など)、といった回避策は立てられますが、ちょっと面倒かも、と(汗)) 【余談】 「年のみ」、「年月のみ」でも抽出できるようにすることもできますが、 この場合、空白(Null)の扱いによっては、クエリを複数用意しておき、 フォームレコードソースを切り替える、といった制御が必要になります。 一応、参考まで。
補足
度々申し訳ありません。「全てが埋まった場合のみ抽出を行うような制御」の組み方を教えていただけないでしょうか? あと少しなのですが。よろしくお願いいたします。
- DexMachina
- ベストアンサー率73% (1287/1744)
> この年、月の入力を一度ですませるにはどのようにしたらよいでしょうか? フォームを開くときに年月指定する代わりに、フォーム上に年月を指定するため のテキストボックスを設置してやるのが、比較的簡単かと思います。 【フォームに対して行う変更】 ・ヘッダ(又はフッタ)に、年月を指定するためのテキストボックスを設置 ・このテキストボックスの『更新後処理』に、フォームの再クエリを実行する マクロ(またはVBA)を設置 【クエリに対して行う変更】 ・年月を指定するためのパラメータ指定を、上記テキストボックスのアドレスに 変更(実際には、その値がNullの場合への対応も実施) 具体的な手順は以下の通り: 【フォーム】 1)フォームをデザインビューで開く 2)ヘッダが未表示の場合は、メニューで「表示(V)→フォーム ヘッダ/フッタ(H)」を 選択して表示させる (ヘッダ/フッタの一方を非表示にする場合は、不要な方をダブルクリックする等 してプロパティシートを表示させ、『書式』タブの『可視』を「いいえ」にするか、 同じく『書式』タブの『高さ』を「0cm」にします) 3)ヘッダ(又はフッタ)にテキストボックスを設置 4)上記テキストボックスをダブルクリックするなどしてプロパティシートを開いたら、 『イベント』タブの『更新後イベント』にマクロまたはVBAを設定 (マクロなら「再クエリ」アクション(引数は空)、VBAなら「Me.Requery」でOk) 5)保存して閉じる <参考> 再クエリをコマンドボタンに割り当ててもOkですが、その場合、テキストボックス の値を変更後、再クエリを実行せずにレポートを開くと、フォームとレポートで 異なる結果(レポートではテキストボックスの変更が反映される)になるので、 注意してください。 【クエリ】 1)クエリをデザインビューで開く 2)現在の抽出条件の式(「[年月を指定して下さい]」等)を、以下のように変更 Nz(Forms!上記フォーム名!上記テキストボックス名, "") <注意・備考> ・「上記フォーム名」等には、上の【フォーム】及び新設テキストボックス名を 指定します。 ・「Forms」などは、自動で「[ ]」で括られます。 ・保存データの年月に「""」(空文字)がある場合、最初にフォームを開いた 時点でそのデータが抽出されてしまいます。 (一応、そういうデータがない前提で、上記の式としました) 3)保存して閉じる ・・・以上です。 これで、レポートを開くときには年月を指定しないで済むようになると思います。 (但し、上記フォームを開いた状態でないと、従来と同様にパラメータを要求する ダイアログ(パラメータとしては、上記「Forms!~」の式が表示される)が開きます)
補足
丁寧にありがとうございます。一番初めのテキストボックスとあるのですが、現在のクエリでは日付を年と月と日に分けて、選択クエリでひとつずつ指定して抽出するようにしてあるのですが、この場合はどのようにしたらよいのでしょうか?単に非連結のテキストボックスを置いたほうがよいのでしょうか。それともフィールドリストからもってきたほうがよいのでしょうか。初歩的なことで申し訳ありません。よろしくお願いいたします。
お礼
おかげさまでやっとうまくできました!大変丁寧に教えていただいて勉強になり、本当にありがとうございました。またこれからもよろしくお願いいたします。ありがとうございました!!!