0

注:私はVBAにかなり慣れていません。カスタム フィルターにOr機能を作成しようとしています。ここで、ユーザーはいずれかをフィルター処理するオプションを使用できます。ユーザーが3つのフィールド、比較、基準をすべて選択して1つの選択にする必要があると考えています.Orボタンを押すと、別の選択が生成されます...フィルターボタンをクリックするまで。これまでのところ機能するフィルターのコードがあります。

ここに画像の説明を入力 これは私がこれまでに持っているばかげたドラフトです Private Sub cmdOr_Click()

    Dim selectOr As Integer        

ここで、これら 3 つのフィールドを 1 つのインジケーターに設定する方法がわかりません

    selectOr = Field & Comparison & Criteria

    If IsNull(selectOr) Then
        MsgBox "All three fields, Comparison and Criteria must be selected", vbOKCancel, "Filter"
    Else

selectOrここでは、ユーザーができるだけ多くのOrオプションを選択できるように、私のインクリメントを行います。

        selectOr 1
End Sub

はっきりしているといいのですが、そうでない場合はお知らせください!ありがとう!

これまでのところ、フィルターボタンにあるものは次のとおりです。注: 辞書、コレクション、その他のモジュールが使用されています。

Private Sub cmdOK_Click()
        Dim Filter As IFilter, filterString As String, filterComparison As String, FilterCriteria As String, sanitizedFilterCriteria As
    String, PrimaryFilter As String, primarySchema As String,
    primaryTable As String, primaryKey As String, targetTable As String,
    targetField As String, Target() As String, filterItem As
    ControlDefinition_Filter

            Me.Dirty = False

            'Gather data for the primary filter from the active form

            With XFormToFilter
                .ResetFilter
                Set .FilterBuilder.FormToFilter = FormToFilter

                PrimaryFilter = IIf(.BaseFilter = vbNullString, _
                                        .NullFilter, _
                                        .BaseFilter)
                primaryTable = .FilterTable
                primaryKey = .key
            End With

            With Me.RecordsetClone
                If .RecordCount > 0 Then
                    .MoveFirst
                    Do While Not .EOF
                        'Get the schema, table/view, and control targetted by the filter
                        Target = Split(.fields("Field").Value, ".")
                        targetTable = IIf(Left(Target(0), 6) = "SELECT", GetTableName(Target(0)), Target(0))
                        targetField = Target(1)

                        filterComparison = Nz(.fields("Comparison").Value, vbNullString)
                        FilterCriteria = Nz(.fields("Criteria").Value, vbNullString)

                        Set filterItem = filterDict.item(.fields("Field").Value)
                        If filterItem.HasCriteria Then 'Get the stored equivalent for the criterion if available
                            sanitizedFilterCriteria = filterItem.GetCriteriaValue(FilterCriteria)
                            If sanitizedFilterCriteria <> vbNullString Then _
                                FilterCriteria = sanitizedFilterCriteria
                        End If

                        filterString = _
                            CreateFilterString(.fields("FieldType"), targetField, targetTable, _
                                                filterComparison, FilterCriteria)
                        filterString = FilterRegExp(filterString)

                        If Filter Is Nothing Then
                            Set Filter = XFormToFilter.FilterBuilder
                            Filter.SetPrimaryFilter PrimaryFilter, primaryTable, primaryKey
                        End If

                        Filter.AddSubFilter "Filter" & .fields("ID"), _
                            filterString, targetTable, subformDict(targetTable)
                        .MoveNext
                    Loop
                End If
            End With

            If Not Filter Is Nothing Then
                Dim finalFilter As String
                Filter.OpenFilteredRecordset
                XFormToFilter.SetFoundRecords

                DoCmd.Close acForm, "Filter_Create_popup", acSaveNo
            End If
        'error handling is here   
 End Sub`
4

1 に答える 1

1

限られた数のコンボボックスを使用した機能検索があります(そのため、動的に追加しません。これが途中で役立つことを確認してください。

Dim ctrl As Control
Dim search_string As String
search_string = ""
For Each ctrl In Me.Controls
    If ctrl.ControlType = acComboBox Then
        If ctrl.value <> "" Then
            If Len(search_string) > 1 Then
                search_string = search_string & " AND "
            End If
            search_string = search_string & LCase(Replace(ctrl.value, " ", "_"))
            If ctrl.Column(1) = "Number" Then
                search_string = search_string & " Like '*" & CStr(Me.Controls("Cval" & Right(ctrl.Name, 1)).value) & "*'"
            ElseIf ctrl.Column(1) = "Date" Then
                search_string = search_string & "=#" & Me.Controls("Cval" & Right(ctrl.Name, 1)).value & "#"
            Else
                search_string = search_string & " LIKE '*" & Me.Controls("Cval" & Right(ctrl.Name, 1)).value & "*'"
            End If
        End If
    End If
Next ctrl
DoCmd.OpenForm "frmSearchResults", acNormal, , search_string

コントロールをループし、OpenForm イベントのフィルター文字列を作成します。私の場合、データ型を支援する追加のコードが含まれています。

于 2013-09-24T21:02:18.623 に答える