我需要让用户使用用户输入文本框的值来过滤连续表单。连续形式也嵌套在几个级别的导航子表单中。这听起来很容易,但我在网上找到的所有示例都使用宏而不是vba。
我设置了结构并为文本框txtFilter编写了一个AfterUpdate过程,如下所示:
Private Sub txtFilter_AfterUpdate()
Dim filterval As String
filterval = txtFilter.Value
With Forms!Main!NavigationSubform.Form!NavigationSubform.Form
.Filter = "LastName Like " & filterval
.FilterOn = True
End With
End Sub
我玩过不同的语法,但似乎都没有正常工作。以下是从文件共享站点下载数据库相关部分的链接:http://jmp.sh/v/HGctZ4Ru74vDAjzN43Wq
有人可以告诉我如何改变这一点,以便用户可以使用文本框过滤连续表单吗?
答案 0 :(得分:2)
我使用它来实现它:.Filter = "LastName Like """ & filterval & """"
有时甚至需要那些烦人的字符串标识符。
好的,要让表单打开而没有记录,然后只提取你(或用户)指定的记录最简单,只需要一些重新工作。
(我建议您使用副本而不是原件)
1:在您的连续表格上,删除Recordsource;我们将使用Late Binding(Kinda)
2:然后删除txtFilter框下的代码,然后删除框本身。
3:添加一个类似于此的组合框作为记录源:
SELECT DISTINCT myTable.LastName FROM myTable ORDER BY myTable.LastName;
(这将为您提供一个唯一的姓氏列表,因此无需知道如何拼写该名称,并且确保至少有一个匹配)
4:在该组合框的After Update事件中,添加如下代码:
Dim strSource As String
strSource = "SELECT mt.IntakeNumber, mt.ClientNumber, " & _
"mt.LastName, mt.FirstName, mt.ConsultationDate " & _
" FROM myTable mt " & _
"WHERE (mt.LastName)= '" & Me.cboFilter.Value & "'"
Me.RecordSource = strSource
Me.Requery
显然你需要根据需要更改表格和字段名称,但希望你明白这一点。
答案 1 :(得分:1)
Option Compare Database
Option Explicit '<- always include this!!!!!
Private Sub txtFilter_AfterUpdate()
Dim strFilter As String
' only set Filter when text box contains something
' to search for ==> don't filter Null, empty string,
' or spaces
If Len(Trim(Me.txtFilter.Value & vbNullString)) > 0 Then
strFilter = "LastName Like '*" & _
Replace(Me.txtFilter.Value, "'", "''") & _
"*'"
' that Replace() prevents the procedure from breaking
' when the user enters a name with an apostrophe
' into the text box (O'Malley)
Debug.Print strFilter ' see what we built, Ctrl+g
Me.Filter = strFilter
Me.FilterOn = True
Else
' what should happen here?
' maybe just switch off the filter ...
Me.FilterOn = False
End If
End Sub