访问VBA:使用Me.Filter重复更改表单过滤器

时间:2016-02-20 21:16:33

标签: ms-access access-vba

Access中的过滤器似乎是“粘性的”' - 当您使用VBA设置一个时,您可以删除它但不能设置另一个。

我有一个用于跟踪学生分数的Access数据库。它包含表格subjectsteachersstudentsteststest_results。每个结果记录都是指学生和考试。

我有一个显示测试的表单,其子表单显示结果。我想使用各种标准搜索测试,因此我在(外部)表单标题中添加了一些未绑定的字段,并将其标记为' name',' subject','开始日期&# 39;,'结束日期'和老师'。我添加了一个'过滤器'按钮和'重置'按钮。每个搜索字段都是可选的,因此可以使用任何组合:任何左侧空白都将被忽略。

这是过滤器按钮的代码:

Me.Filter =
"([Forms]![testWithResults]![Text102] IS NULL OR test_name Like '*' & [Forms]![testWithResults]![Text102] & '*')
AND ([Forms]![testWithResults]![Combo89] IS NULL OR teacher = [Forms]![testWithResults]![Combo89])
AND ([Forms]![testWithResults]![Combo52] IS NULL OR subject = [Forms]![testWithResults]![Combo52])
AND ([Forms]![testWithResults]![Text83] IS NULL OR [Forms]![testWithResults]![Text85] IS NULL OR test_date BETWEEN [Forms]![testWithResults]![Text83] AND [Forms]![testWithResults]![Text85])"
Me.FilterOn = True

这是重置按钮的代码:

Me.FilterOn = False
Me.Combo89 = Me.Combo89.DefaultValue
Me.Combo52 = Me.Combo52.DefaultValue
Me.Text83 = Me.Text83.DefaultValue
Me.Text85 = Me.Text85.DefaultValue
Me.Text102 = Me.Text102.DefaultValue

当我第一次加载表单时,我第一次搜索它时一切正常。过滤器按钮按预期工作,重置按钮清空所有字段并显示所有记录。 但是当我尝试再次使用新条件进行搜索时,我只是再次获得旧结果。要使其正常工作,我必须关闭并重新打开表单。

当我用Me.Filter替换DoCmd.ApplyFilter时,它仍然在第一次完美运行,但第二次我会收到错误&#39;表达式太复杂而无法评估&#39;。< / p>

1 个答案:

答案 0 :(得分:1)

由于Access抱怨Filter字符串太复杂,请简化它。

您希望在文本框中添加Filter条件。在您创建Filter字符串时,您的代码可以检查该文本框是否为空。如果它不是Null,则根据文本框的值添加条件。如果它为空,Filter可以简单地忽略该文本框。

Dim strFilter As String
With [Forms]![testWithResults]
    If Not IsNull(![Text102]) Then
        strFilter = strFilter & " AND test_name Like '*" & ![Text102] & "*'"
    End If
    If Not IsNull(![Combo89]) Then
        strFilter = strFilter & " AND teacher = " & ![Combo89]
    End If
    If Not IsNull(![Combo52]) Then
        strFilter = strFilter & " AND subject = " & ![Combo52]
    End If
    If Not (IsNull(![Text83]) Or IsNull(![Text85])) Then
        strFilter = strFilter & " AND test_date BETWEEN " & Format(![Text83], "\#yyyy-m-d\#") _
            & " AND " & Format(![Text85], "\#yyyy-m-d\#")
    End If
End With
If Len(strFilter) > 0 Then
    ' use Mid() to discard leading " AND "
    Debug.Print Mid(strFilter, 6) '<- view this in Immediate window; Ctrl+g will take you there
    Me.Filter = Mid(strFilter, 6)
    Me.FilterOn = True
Else
    MsgBox "no conditions for Filter"
End If