2

我在 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 公式,因为该工具也应由无权访问数据库的人使用。

4

3 回答 3

1

我会使用 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>)&"%")或者

因此,toronto 的用户条目将查找 Toronto。我在 UPPER 中经常使用它,因为很多数据库都包含大写条目.. 即加拿大邮政编码

于 2019-02-01T16:33:41.957 回答
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 数据库的环境中工作,它们很古怪!

于 2013-12-03T15:25:29.240 回答
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 
于 2013-12-10T07:44:52.827 回答