Microsoft Access 掲示板

フォーム上に複数の条件でフィルタをかけたい

5 コメント
views
4 フォロー

フォーム上でいくつかの条件でフィルタをかけるVBAを作成したいと思っています。
フィルタをかけたいフィールド名は「申込日」「入金日」「使途」になり、申込日と入金日は日付型、使途はテキスト型になっています。
フォームにそれぞれの検索ボックス「申込開始日検索」「申込終了日検索」「入金開始日検索」「入金終了日検索」「使途検索」を作成し、それぞれ申込日と入金日はそれぞれの期間、使途は一致するものでフィルタをかけたいのです。また、検索ボックスで空白になっているものは無視し、入力をされているものだけで検索したいと思っています。
初心者で申し訳ないのですが、ご教授よろしくお願いいたします。

わにさん
作成: 2021/11/18 (木) 18:31:43
通報 ...
1
hatena 2021/11/19 (金) 12:43:39 修正

とりあえず下記を参考にチャレンジしてみては。

複数条件の抽出フォームの設計 その1 - hatena chips

4

コード例

Private Sub cmdFilter_Click()
    Dim strFilter As String
     
    If Not IsNull(Me.申込開始日検索) And Not IsDate(Me.申込開始日検索) Then
        MsgBox "日付ではありません。"
        Me.申込開始日検索.SetFocus
        Exit Sub
    End If
    If Not IsNull(Me.申込終了日検索) And Not IsDate(Me.申込終了日検索) Then
        MsgBox "日付ではありません。"
        Me.申込終了日検索.SetFocus
        Exit Sub
    End If
    If Not IsNull(Me.入金開始日検索) And Not IsDate(Me.入金開始日検索) Then
        MsgBox "日付ではありません。"
        Me.申込開始日検索.SetFocus
        Exit Sub
    End If
    
    If Not IsNull(Me.入金終了日検索) And Not IsDate(Me.入金終了日検索) Then
        MsgBox "日付ではありません。"
        Me.申込終了日検索.SetFocus
        Exit Sub
    End If
 
    If Not IsNull(Me.申込開始日検索) Then
        strFilter = strFilter & " AND 申込日 >= #" & Me.申込開始日検索 & "#"
    End If
    If Not IsNull(Me.申込終了日検索) Then
        strFilter = strFilter & " AND 申込日 <= #" & Me.申込終了日検索 & "#"
    End If
    If Not IsNull(Me.入金開始日検索) Then
        strFilter = strFilter & " AND 申込日 >= #" & Me.入金開始日検索 & "#"
    End If
    If Not IsNull(Me.入金終了日検索) Then
        strFilter = strFilter & " AND 申込日 <= #" & Me.入金込終了日検索 & "#"
    End If
     
    If Not IsNull(Me.使途検索) Then
        strFilter = strFilter & " AND 使途='" & Me.使途検索 & "'"
    End If
     
    Me.Filter = Mid(strFilter, 6)
    If strFilter = "" Then
        Me.FilterOn = False
    Else
        Me.FilterOn = True
    End If
End Sub
 
2
りんご 2021/11/19 (金) 13:40:22 c564b@0e907

 フィルターは使った事がないので、選択クエリでやってみます。
 日付の抽出条件をBetween [Forms]![フォーム名]![申込開始日検索テキストボックス] And [Forms]![フォーム名]![申込終了日検索テキストボックス]とします。

検索ボックスで空白になっているものは無視し、

 抽出条件の範囲指定をNz([Forms]![フォーム名]![申込開始日検索テキストボックス],100/01/01)、Nz([Forms]![フォーム名]![申込終了日検索テキストボックス],9999/12/31)と変更します。
 ここはセオリーがわからないので、アドバイスがあればどなたかお願いします。

 選択クエリからフォームを作成し、検索テキストボックスを配置、更新後VBA処理にフォームの再クエリ、こんな感じでどうでしょうか?

3
りんご 2021/11/19 (金) 16:00:36 c564b@0e907 >> 2

 入金日が確定していない場合、どうしますか?
 入金日の抽出条件を入金開始日から入金終了日またはIs Nullとすると、入金日未確定のレコードを絞り込めなくなります。申込日で絞り込んでも、またはIs Nullだから復活、困りますね。これをクエリ1とします。
 最終的に、クエリ1をもとにクエリ2を作って、申込日で絞り込むようにしました。これもセオリーがあれば、誰か教えて下さい。
 入金日未確定を含めない、入金び日未確定を含める、入金日未確定のみと、切り替えるにはどうすればいいか?
 まだ途中ですが、確定を1、未確定を2として、Switch(ほにゃらら,1) Or Switch(ほにゃらら,2) Or (Switch(ほにゃらら,1) Or Switch(ほにゃらら,2))みたいな事をやってみました。Switchを使わずにもっと上手い方法がないかなぁ。
 最後に余談ですが、商品・サービスと顧客で申込日などが決まるテーブル、商品・サービスと顧客と年月で請求日や入金日が決まるテーブルみたいになると、どうでしょうか?

5
わにさん 2021/11/22 (月) 13:07:59 842b8@6703c

お二人ともありがとうございます。
フィルタの方で成功しました。クエリの方もいくつかのパタンは試したのですが、ご教示いただいた内容も試してみたいと思います。
またよろしくお願いいたします。