我有一个搜索表单,其中空白字段绑定到表格,四个条件搜索框和一个按钮,用于从搜索框中获取输入,搜索表格,并在表单的空白字段中填充结果。
截至目前,只要所有四个标准框都不为空,它就会起作用 我使用过滤器来实现这一点,只要所有四个框都不为空,这里的代码就可以运行。 (我的标准框如下:一个名为“Keyword”的文本框和三个名为HRCombo,BuildingCombo和RoomCombo的组合框,以及它们绑定的字段如下:“项目描述”“HR Holder”“Building”“房间“)我的第一行”Me.Filter = ...“被拆开以便于查看。
Me.Filter = "[Item Description] Like " & Chr(34) & Me.Keyword & "*" & Chr(34) & "
AND [HR Holder] = '" & Me.HRCombo & "'" & " AND [Building] = '" & Me.BuildingCombo
& "'" & " AND [Room] = '" & Me.RoomCombo & "'"
Me.FilterOn = True
Me.Requery
无论标准框的哪个组合输入,我都需要它才能进行搜索。有人建议使用if语句执行以下操作: 创建四个字符串,每个条件框一个。使用4 if语句检查该框是否为null - 如果为null,则为其字符串分配星号,如果它不为null,则将我用于上述Me.Filter语句的值分配给每个框的字符串。然后,使用Me.Filter并在最后连接四个字符串。
这是我用于此的代码,而且由于我的知识有限,我无法让它工作。
Dim StrA as String, StrB as String, StrC as String, StrD as String
If Me.Keyword is null then
StrA = "*"
else
StrA = [Item Description] Like " & Chr(34) & Me.Keyword & "*" & Chr(34)
End If
If Me.HRCombo is null then
StrB = "*"
else
StrB = [HR Holder] = '" & Me.HRCombo & "'"
End If
If Me.BuildingCombo is null then
StrC = "*"
else
StrC = [Building] = '" & Me.BuildingCombo & "'"
End If
If Me.RoomCombo is null then
StrD = "*"
else
StrD = [Room] = '" & Me.RoomCombo & "'"
End If
Me.Filter = "StrA & " AND "StrB & " AND "StrC &" AND "StrD"
Me.FilterOn = True
Me.Requery
就像我说的那样,我的知识有限,所以我确信可能缺少引号和逗号,或者说它们太多了。有什么想法吗?
答案 0 :(得分:1)
您缺少一些重要的引号,检查null的逻辑对于SQL是正确的,但对于VBA则不正确。我在这里发帖,我认为这是一种更干净的方式。请注意,您没有转义可能在控件中输入的单引号,我也不在此代码中(除了在第一个代码中,因此您可以使用Replace函数查看如何执行此操作)。当单个引用可能出现在其中一个搜索/过滤控件中时,这是非常重要的事情。
Dim strWhere as String
If Nz(Me.Keyword, "") <> "" Then
strWhere = strWhere & "[Item Description] Like '*" & Replace(Me.Keyword, "'", "''") & "*' AND "
End If
If Nz(Me.HRCombo, "") <> "" Then
strWhere = strWhere & "[HR Holder] = '" & Me.HRCombo & "' AND "
End If
If Nz(Me.BuildingCombo, "") <> "" Then
strWhere = strWhere & "[Building] = '" & Me.BuildingCombo & "' AND "
End If
If Nz(Me.RoomCombo, "") <> "" Then
strWhere = strWhere & "[Room] = '" & Me.RoomCombo & "' AND "
End If
If strWhere <> "" Then
strWhere = Left(strWhere, Len(strWhere)-5) 'Remove the extra AND
Me.Filter = strWhere
Me.FilterOn = True
Else
Me.Filter = ""
Me.FilterOn = False
End If