1

データをフィルタリングするために、ヘッダーに3つのコンボボックスを使用してアクセスできる連続フォームがあります。現在、使用されているコンボボックスの数を確認し、8つの透過すべてをカバーするために、かなり長いネストされたIFがあります。3つのボックスでそれはそれほど悪くはありませんが、私は4番目または5番目を追加するかもしれません。その場合、それはばかげているでしょう。

連続フォーム用のコンボボックスフィルターを設定する簡単な方法はありますか?

現在のコード

Private Sub filters()
    Dim fstr As String, rgS As String, piS As String, hcS As String
    rgS = "research_group_id = " & Me.fRG
    piS = "pi_id = " & Me.fPI
    hcS = "healthcat_id = " & Me.fHC
    If IsNull(Me.fRG) Then
        If IsNull(Me.fPI) Then
            If IsNull(Me.fHC) Then
                ' Do Nothing
            Else
                fstr = hcS
                Call filton(Me.Name, fstr)
            End If
        Else
            If IsNull(Me.fHC) Then
                fstr = piS
                Call filton(Me.Name, fstr)
            Else
                fstr = piS & " AND " & hcS
                Call filton(Me.Name, fstr)
            End If
        End If
    Else
        If IsNull(Me.fPI) Then
            If IsNull(Me.fHC) Then
                fstr = rgS
                Call filton(Me.Name, fstr)
            Else
                fstr = rgS & " AND " & hcS
                Call filton(Me.Name, fstr)
            End If
        Else
            If IsNull(Me.fHC) Then
                fstr = rgS & " AND " & piS
                Call filton(Me.Name, fstr)
            Else
                fstr = rgS & " AND " & piS & " AND " & hcS
                Call filton(Me.Name, fstr)
            End If
        End If
    End If
End Sub

上記のコードは、各コンボボックスの更新後に発生します。

Public Function filton(frmname As String, fstr As String)
        With Forms(frmname)
            .FilterOn = False
            .Filter = fstr
            .FilterOn = True
        End With
End Function
4

2 に答える 2

1

コンボボックスで更新後のイベントを作成できます。これは、ロード時に親と子のコンボボックスが無効になっている3層階層の例です。

Private Sub Grandfather_Combo_AfterUpdate()

    Parent_Combo.RowSource="SELECT ...."
    Parent_Combo.Enabled=True
    Child_Combo.Enabled=False     ' the child is invalid until the parent is defined

End Sub

Private Sub Parent_Combo_AfterUpdate()

    Child_Combo.RowSource="SELECT ...."
    Child_Combo.Enabled=True

End Sub

これは単一レコード形式用ですが、変更するコンボボックスの場合は、開始する必要があります。

変更するレコードフィルターの場合は、同じイベントを使用しますが、代わりに、関連するフィールドのフィルター変数を変更してから、共通のサブルーチンを呼び出して、すべてのフィルター変数の組み合わせからフォームフィルターを再作成します。

于 2013-03-22T10:10:18.063 に答える
1

" AND "フィルタ文字列に、を使用して各基準を追加します。その後、その文字列の先頭" AND "を破棄します。このアプローチは、任意の数の基準に簡単に対応できるはずです。

以下のコードですべてを正しく一致させたかどうかはわかりませんが、パターンが明確であることを願っています。

If Not IsNull(Me.fRG) Then
    fstr = fstr & " AND " & rgS
End If
If Not IsNull(Me.fPI) Then
    fstr = fstr & " AND " & piS
End If
If Not IsNull(Me.fHC) Then
    fstr = fstr & " AND " & hcS
End If
If Len(fstr) > 0 Then
    ' discard leading " AND "
    fstr = Mid(fstr, 6)
End If
于 2013-03-22T10:12:54.353 に答える