【问题标题】:ApplyFilter in macro to not filter if empty宏中的 ApplyFilter 如果为空则不过滤
【发布时间】:2017-01-25 19:51:29
【问题描述】:

我有一个表格,我可以在其中记录预订,其内容如下:

PNR ¦ Date Booking Created ¦ Name of Customer
---------------------------------------------
1   ¦ 01/03/16             ¦ Marc N
2   ¦ 04/07/16             ¦ Sam D
3   ¦ 13/02/17             ¦ Max L

其中 PNR 是 ID 字段。 在表单的顶部,我有一个搜索栏,它使用一个简单的宏(连接到“点击”按钮)搜索并返回名称,比较搜索栏 LIKE [客户名称]。

我还有两个相邻的搜索栏,输入日期,并使用宏(也连接到“点击”按钮)找到 WHERE [DateFrom]

但是我不确定如何创建一个宏,其中它同时“ApplyFilter”两个。我最初从两个按钮脚本中复制了“Where”代码,并将它们都连接到一个按钮,当单击该按钮时,它会运行一个宏,它会在其中“应用过滤器”它们两者(使用 AND 分隔它们)。

但是这并不好用,好像我决定只搜索一个名字,它没有显示任何结果,因为 [DateFrom] 和 [DateTo] 搜索栏是空的,我将如何处理这种情况(最好在宏),以便即使我只是搜索没有日期限制的名称,它也会返回记录?

【问题讨论】:

    标签: ms-access macros


    【解决方案1】:

    您必须编写 VBA 代码,以根据各种过滤器元素的内容生成过滤器。这是执行此操作的 VBA 代码示例:

    Dim Filter As String
    Filter = ""
    If Nz(Me.fCustomerName)<>"" Then
        Filter = Filter & "CustomerName Like '" & Me.fCustomerName & "*' AND "
      End If
    If IsDate(Me.DateFrom) Then
        Filter = Filter & "DateCreated >= #" & Me.DateFrom & "# AND "
      End If
    If Len(Nz(Me.DateTo, "")) Then
        Filter = Filter & "DateCreated <= #" & Me.DateTo & "# AND "
      End If
    If Filter <> "" Then
        Filter = Left(Filter, Len(Filter) - 5)
        Me.Filter = Filter
        Me.FilterOn = True
      Else
        Me.FilterOn = False
      End If
    Me.Requery
    

    【讨论】:

    • 非常感谢。我将如何将其附加到单击时运行的按钮?另外,如果您能对发生的事情做一个简短的解释,以便我可以调整脚本,我们将不胜感激
    • 您将其添加到按钮的 On Click 事件中。至于发生了什么,代码实际上非常简单且不言自明,假设您可以阅读 VBA。如果您看不懂 VBA,我可以给您的任何解释都会有所帮助。但是我会尝试。该代码检查 3 个表单控件的内容,一个文本控件和两个日期控件,并生成一个类似于 SQL 的过滤器(SQL 语句的 WHERE 部分)的字符串。这是前 3 个 If。最后一个检查是否生成了任何过滤器,如果有,将其作为过滤器分配给表单并激活它,否则它会关闭过滤器。
    • 唯一可能不容易的部分是Filter = Left(Filter, Len(Filter) - 5),它基本上删除了过滤器末尾的“AND”部分。由于我们事先不知道需要多少个“AND”,因此每个具有值的控件默认添加“AND”,这总是导致最后一个多余的“AND”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2015-04-25
    • 2015-05-30
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多