没有什么能阻止您编写一些代码来“解析”给定文本并创建所需的 SQL。这样的代码在 C# 或 VBA 中的外观并不是真正困难的部分。真正的挑战是编写代码来解析。 (编写代码!- 方法与我的 c# 大致相同)。
我只是对它进行了空气编码,它看起来工作得很好。此代码假定有问题的列是一个数字列(因此每个值都不需要引号)。
代码如下所示:
Function MyWhereRanges(strRanges, strField As String) As String
' take the raganges, and return a where clause
Dim vTokens As Variant
Dim strRa As String ' sql for ranges
Dim strIn As String ' sql for "in" clause
Dim s As Variant
Dim strResult As String ' return value
vTokens = Split(strRanges, ",")
For Each s In vTokens
If InStr(s, "-") Then
' this is a range - append the range
If strRa <> "" Then
strRa = strRa & " and "
End If
strRa = strRa & "(" & strField & " between " & _
Split(s, "-")(0) & " and " & Split(s, "-")(1) & ")"
Else
' append to the "in" clause
If strIn = "" Then
strIn = "(" & strField & " in ("
Else
strIn = strIn & ","
End If
strIn = strIn & s
End If
Next s
If strIn <> "" Then strIn = strIn & ")) "
strResult = strIn
If strRa <> "" Then
If strResult <> "" Then strResult = strResult & " and "
strResult = strResult & strRa
End If
MyWhereRanges = strResult ' return the value
End Function
因此,您可以在调试窗口中输入:
? mywhereranges("5,6,12-13,15-25","InvoiceNum")
上面的结果是这样的:
(InvoiceNum in (5,6)) and
(InvoiceNum between 12 and 13) and
(InvoiceNum between 15 and 25)
因此,在实际表单中,您可以像这样启动报告或表单:
Dim strSQLwhere As String
strSQLwhere = MyWhereRanges(Me.txtBoxRanges, "InvoiceNum")
DoCmd.OpenReport "rptInvoices", acViewPreview, , strSQLwhere