我在Excel中有5个多选列表框。每个列表框的选定内容都写在一个单元格中,用逗号分隔。
例如在单元格A1中所有选定的名称:Tim,Miranda,Laura
这些单元格是Access查询(where子句)的标准。
我打开MS Query并在查询中添加以下where子句并定义参数:
Where (Instr(?, [name])>0 And Instr(?, [number])>0 And Instr(?, [city])>0 And Instr(?, [phone])>0 And Instr(?, [email])>0)
效果很好,但如果其中一个参数字段为空(例如用户没有选择任何城市)查询返回所有行,其中在这种情况下,city是空的而不是忽略该子句。
我该如何解决这个问题?也许还有另一种使用VBA和动态SQL的解决方案。
注意:我必须使用Excel作为列表框而不是Access公式,因为该工具也应该由无权访问数据库的人使用。
答案 0 :(得分:0)
根据我的经验,它可能在某些情况下返回null并影响您在该子句中的比较。
尝试len函数时会发生什么:
Where Instr(?, [name])>0 And Instr(?, [number])>0 And (Instr(?, [number])>0 and
NOT ISNULL([CITY])) And Instr(?, [phone])>0 And Instr(?, [email])>0)**
请参阅上面的代码更改。对不起,看到了你的更新,我只需要抓住这个问题。你想要所有记录,包括那些有“空”城市的记录吗?但我以为你想让它跳过那些?我搜索这个的另一种方法是 - NOT ISNULL([CITY])。我在一个有很多Access数据库的环境中工作,它们很古怪!
答案 1 :(得分:0)
我在VBA中使用动态SQL解决了问题。如果未选择任何内容,则将列表框中的所有行链接到字符串。这是一个包含名称的列表框的示例(代码不包含与数据库的必要连接):
Dim string1 As String
Dim rngParams As Range, rngCell As Range
Dim i As Long
'String name
With Worksheets("Table1")
For i = 0 to .ListBox1.ListCount - 1
If .ListBox1.Selected(i) Then
If string1 = "" Then string1 = "("
string1 = string1 & "'" & .ListBox1.List(i) & "',"
End If
Next i
End With
If string1 <> "" Then
string1 = Left(string1, Len(string1) - 1)
string1 = string1 & ")"
End If
'If nothing is selected, use all names and write them into one string
If string1 = "" Then
string1 = "("
With Worksheets("table2")
Set rngParams = .Range("allNames")
For Each rngCell In rngParams.Cells
string1 = string1 & "'" & rngCell.Value & "',"
Next rngCell
string1 = Left(string1, Len(string1) - 1)
string1 = string1 & ")"
End With
End If
strSQL = "SELECT Name FROM accesstable WHERE Name IN " & string1
答案 2 :(得分:0)
我将使用LIKE运算符。 在Excel中填充其他单元格,然后将参数指向它们
=if(<cityCell> ="","_%",<cityCell>&"%")
并将查询更改为
Where [name] like ? And [number] like ? And[CITY] like and [phone] like ? And [email]like ?
通过这种方式,您可以处理用户的其他违规行为,即将Excel公式更改为
=if(<cityCell> ="","_%",PROPER(<cityCell>)&"%")
或
因此,多伦多的用户输入将查找多伦多。我在UPPER中经常使用此功能,因为很多数据库都包含大写字母条目。即加拿大邮政编码