Vba 使用具有多个条件的文本框搜索多个字段
对VBA和一般的编码非常陌生。我正在研究一个数据库,我正试图建立一个搜索它的平台 数据库包含文档编号、文档日期和不同平台等字段 我正在处理的搜索表单有一个子表单显示数据库,每次按下搜索文本框中的键后,数据库都是uodatrd,有点像谷歌搜索 问题是,我需要文本框做两件事。首先,我需要能够将多个标准放在其中,用逗号分隔。例如,我可以搜索文档所基于的日期、标题和平台等参数(“Android Report 1,21/01/2020,Android”)。然后,我需要文本框来搜索数据库中的所有字段,只显示包含我输入的所有条件的记录 抱歉,如果这一切听起来很混乱,这是我第一次在这里问问题,正如前面所说的,我是一个完整的编码初学者 提前感谢在未绑定表单上放置3个文本框(txtDocument、txtDate和txtmplatform)、一个命令按钮(cmdSearch)和一个列表框(lstSearch)。将列表框设置为有3列。然后,在命令按钮的OnClick事件中,放置以下VBA代码:Vba 使用具有多个条件的文本框搜索多个字段,vba,ms-access,search,Vba,Ms Access,Search,对VBA和一般的编码非常陌生。我正在研究一个数据库,我正试图建立一个搜索它的平台 数据库包含文档编号、文档日期和不同平台等字段 我正在处理的搜索表单有一个子表单显示数据库,每次按下搜索文本框中的键后,数据库都是uodatrd,有点像谷歌搜索 问题是,我需要文本框做两件事。首先,我需要能够将多个标准放在其中,用逗号分隔。例如,我可以搜索文档所基于的日期、标题和平台等参数(“Android Report 1,21/01/2020,Android”)。然后,我需要文本框来搜索数据库中的所有字段,只显示
Private Sub cmdSearch_Click()
On Error GoTo E_Handle
Dim strSQL As String
If Len(Me!txtDocument) > 0 Then
strSQL = strSQL & " AND DocumentNumber='" & Me!txtDocument & "' "
End If
If IsDate(Me!txtDate) Then
strSQL = strSQL & " AND DocumentDate=" & Format(Me!txtDate, "\#mm\/dd\/yyyy\#")
End If
If Len(Me!txtPlatform) > 0 Then
strSQL = strSQL & " AND Platform='" & Me!txtPlatform & "' "
End If
If Left(strSQL, 4) = " AND" Then
strSQL = " WHERE " & Mid(strSQL, 5)
End If
strSQL = "SELECT DocumentNumber, DocumentDate, Platform " _
& " FROM tblDocument " _
& strSQL _
& " ORDER BY DocumentDate, DocumentNumber, Platform;"
Me!lstSearch.RowSource = strSQL
sExit:
On Error Resume Next
Exit Sub
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "cmdSearch", vbOKOnly + vbCritical, "Error: " & Err.Number
Resume sExit
End Sub
这将检查每个文本框中是否有数据,并构建SQL字符串的where部分。请注意,它将DocumentNumber和Platform的数据用单引号括起来,因为它们是文本,它将DocumentDate的数据格式化为明确的日期,并用八进制(“#”)括起来。最后,它将这段SQL插入一个SQL SELECT语句,用作ListBox的行源
关于,您需要创建一个小函数,使用正在编辑的控件的
.Text
属性和其他控件的.Value
属性动态构建行源。您构建的SQL将使用和通配符。该过程将类似于:
Private Sub sFindData(strDocument As String, dtmDate As Date, strPlatform As String)
On Error GoTo E_Handle
Dim strSQL As String
If Len(strDocument) > 0 Then
strSQL = strSQL & " AND DocumentNumber LIKE '*" & strDocument & "*' "
End If
If (IsDate(dtmDate)) And (dtmDate <> #12/31/2099#) Then
strSQL = strSQL & " AND DocumentDate=" & Format(Me!txtDate, "\#mm\/dd\/yyyy\#")
End If
If Len(strPlatform) > 0 Then
strSQL = strSQL & " AND Platform LIKE '*" & strPlatform & "*' "
End If
If Left(strSQL, 4) = " AND" Then
strSQL = " WHERE " & Mid(strSQL, 5)
End If
strSQL = "SELECT DocumentNumber, DocumentDate, Platform " _
& " FROM tblDocument " _
& strSQL _
& " ORDER BY DocumentDate, DocumentNumber, Platform;"
Me!lstSearch.RowSource = strSQL
sExit:
On Error Resume Next
Exit Sub
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "sFindData", vbOKOnly + vbCritical, "Error: & err.n"
Resume sExit
End Sub
请注意,我没有在DocumentDate
字段中包含部分匹配,因为这没有意义
关于,虽然可以这样做,但这不是一个好主意。最好使用1控件搜索表中的1个字段,可能是列出可用值的组合框。在这种情况下,我是否可以在搜索表单中添加两个文本框,并让每个文本框对所有字段执行独立搜索?基本上,不是使用一个文本框,而是用逗号分隔所有内容,而是为每个条件使用多个文本框。嗨,谢谢回复。这段代码的问题在于它不是每次击键都更新的。我正在寻找一种方法,在用户键入要搜索的参数时,使用每个按键更新包含表的列表框或子窗体。很抱歉,回复太晚,这与我需要的仍然有点不同。我需要有一个子表单绑定到我用来搜索参数的文本框,并且我需要在每次击键时更新该子表单(假设keypress是最佳方法),只显示包含精确或类似值字段的记录。例如,我在文本框中写“Android”,每次我添加/删除字母时,子表单都会自动更新,只显示包含我输入的参数的字段,无论“Android”一词是在标题、平台还是任何其他字段中。非常感谢在这种情况下,与其设置列表框的行源,不如设置子窗体的RecordSource。我在将子窗体的RecordSource设置为SQL行时遇到一些问题。除此之外,我注意到子窗体只显示一条记录。我做错什么了吗?你用来设置记录源的代码是什么?子窗体是否设置为连续?没关系,我设法找出了问题所在。代码工作得很好。非常感谢你的帮助!
Private Sub txtDate_AfterUpdate()
Call sFindData(Nz(Me!txtDocument, ""), Nz(Me!txtDate, #12/31/2099#), Nz(Me!txtPlatform, ""))
End Sub
Private Sub txtDocument_Change()
Call sFindData(Nz(Me!txtDocument.Text, ""), Nz(Me!txtDate, #12/31/2099#), Nz(Me!txtPlatform, ""))
End Sub
Private Sub txtPlatform_Change()
Call sFindData(Nz(Me!txtDocument, ""), Nz(Me!txtDate, #12/31/2099#), Nz(Me!txtPlatform.Text, ""))
End Sub