ACCESS VBA フォームのフィルター結果を引き継いでレポート表示する方法
ACCESSでは検索フォームを作成することができます。
検索条件に応じて、一定のレコードのみをフォームに表示します。
さらにそこから、レポートも同じ条件で絞り込んで出すことが可能です。
今回は、フォームのフィルター結果を引き継いでレポート表示する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
完成形
まずは、実現するのがどんな機能かをご紹介します。
下記は売上データを検索するフォームです。
ここでは、すでに顧客名が「ココナラ」のレコードだけを抽出しています。
この状態でレポート表示ボタンを押します。
すると売上検索結果のレポートが、フォームと同じ抽出条件で抽出された状態で表示されます。
フォームとレポートの連動、これができるとかなり便利です。
フォームの検索結果をレポートに引き継ぐ方法
では、実現方法をご紹介します。
フォームの検索結果をレポートに引き継いで表示するためには、レポートを開く際にフォームに適用されている抽出条件式をレポートに引き継ぎます。
具体的にはDoCmd.OpenReportメソッドの引数の一つである、抽出条件を利用します。
DoCmd.OpenRepotは以下の構文で利用します。
DoCmd.OpenReport レポート名 , ビュー , フィルター名 , 抽出条件 , ウィンドウモード , OpenArgs
4つめに抽出条件という引数があります。
ここにフォームで適用されている抽出条件式をそのまま持っていくのです。
DoCmd.OpenReportの使い方を知りたい方は以下もご覧ください。
作成例
では、実際に作ってみましょう。
まずはフォームです。
検索フォーム自体の作り方は以下の記事をご参照ください。
検索フォームをデザインビューで見ると下記のようになっています。
このフォームのレコードソースは「LIST_売上明細」です。
次にレポートです。
レポートのレコードソースもフォームと同じく「LIST_売上明細」にしています。
フォームの検索条件をレポートに引き継ぐためには、レコードソースを同じにしておくことが必要ですので、注意してください。
では、フォームの検索結果からレポートへの引継ぎ処理を見ていきましょう。
このフォームでは検索ボタンを押した際に、フォームで指定した検索条件をフィルター条件式に変換し、フォームのFilterプロパティに適用することで検索を行っています。
検索ボタンクリック時に設定してあるイベントプロシージャは以下の通りです。
Private Sub 検索_ボタン_Click()
filter_txt = ""
'FROM、TOの前後不備チェック
If Me!売上日検索FROM <> "" And Me!売上日検索TO <> "" Then
If Me!売上日検索FROM > Me!売上日検索TO Then
MsgBox "期間指定が不適切です。再度入力してください。", vbCritical + vbOKOnly, "期間指定不備"
Exit Sub
End If
End If
'売上期間
If Me!売上日検索FROM <> "" Then
If Me!売上日検索TO <> "" Then
filter_txt = "処理日 >= #" & Me!売上日検索FROM & "# and 処理日 <= #" & Me!売上日検索TO & "#"
Else
filter_txt = "処理日 >= #" & Me!売上日検索FROM & "#"
End If
ElseIf Me!売上日検索TO <> "" Then
filter_txt = "処理日 <= #" & Me!売上日検索TO & "#"
End If
'顧客名
If Me!顧客名検索 <> "" Then
If filter_txt = "" Then
filter_txt = "顧客名 like '*" & Me!顧客名検索 & "*'"
Else
filter_txt = filter_txt & " and 顧客名 like '*" & Me!顧客名検索 & "*'"
End If
End If
'商品名
If Me!商品名検索 <> "" Then
If filter_txt = "" Then
filter_txt = "商品名 like '*" & Me!商品名検索 & "*'"
Else
filter_txt = filter_txt & " and 商品名 like '*" & Me!商品名検索 & "*'"
End If
End If
'未請求
If Me!未請求検索 = True Then
If filter_txt = "" Then
filter_txt = "請求済 = false"
Else
filter_txt = filter_txt & " and 請求済 = false"
End If
End If
'削除
If Me!削除検索 = False Then
If filter_txt = "" Then
filter_txt = "削除 = false"
Else
filter_txt = filter_txt & " and 削除 = false"
End If
End If
If filter_txt = "" Then
Me.FilterOn = False
Else
Debug.Print filter_txt
Me.Filter = filter_txt
Me.FilterOn = True
Me.OrderBy = "処理日 DESC"
Me.OrderByOn = True
End If
End Sub
かなり長いですが、今回注目していただきたいのは下から6行目にある
Me.Filter = filter_txt
です。
これは、Me、つまり現在操作している検索フォームのFilterプロパティに、filter_txtを適用する、という意味です。
filter_txtには、その上にあるVBAのコードでフォームで指定した検索条件をテキストに変換して格納してあります。
そのため、このfilter_txtをフォームだけではなくレポートにも適用すれば、全く同じ抽出結果が得られるということになります。
このためにフォームとレポートのレコードソースを同一にしているのです。
では、フォームのレポート表示ボタンに設定したイベントプロシージャも見てみましょう。
Private Sub レポート表示_ボタン_Click()
DoCmd.OpenReport "test_売上検索結果", acViewPreview, , filter_txt
End Sub
こちらはとてもシンプルですね。
DoCmd.OpenReportメソッドで「test_売上検索結果」というレポートを開くのですが、4つ目の引数にfilter_txtを指定しています。
4つ目の引数がフォームを開く際の抽出条件ですので、ここにフォームに適用されている抽出条件をそのまま適用しているということです。
これを使いこなすことができれば手間をかけずにフォームとレポートで同様の抽出結果を得ることが可能です。
以上、フォームのフィルター結果を引き継いでレポート表示する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。