我写了几个VBA函数,最后返回一个整数集合:
Public Function ValidIDs() As Collection
现在我想在QueryEditor中运行创建一个具有以下条件的查询:WHERE TableID IN ValidIDs()
。这是行不通的,因为只要它返回一个Collection,由于某些原因访问甚至找不到我的函数。因此我在它周围写了一个包装器,它连接了Collection:
Public Function joinCollectionForIn(Coll As Collection) As String
现在调用ValidIDs()
的第三个函数将结果传递给joinCollectionForIn
并返回该结果。让我们称之为GetIDCollectionAsString()
。
因此,我现在可以将查询更改为WHERE TableID IN (GetIDCollectionAsString())
。请注意添加的括号,因为IN
在任何情况下都需要它们,它们不能只是在GetID...
返回的字符串的结尾和开头。
然而,运行该查询会导致
标准表达式中的数据类型不匹配。
我想这是因为我返回一个String,因此访问会自动将该字符串包装在'
中,而SQL IN
- 子句不再有效,因为我会检查一个数字是IN
1个字符串的集合。
因此我的问题是:
或(会好很多):
WHERE IN
- 子句? PS :我目前正在使用一种解决方法,在IN
之后的括号中写一个占位符(例如IN (1,2,3,4,5)
),并将Form_Load中的占位符替换为结果GetIDCollectionAsString()
- 虽然有效,但不是很漂亮......
修改:最终查询应该看起来像SELECT * FROM TestTable t WHERE t.ID IN (1,2,3,4,5,6,7)
。这实际上可以使用上面的方法,但不是很好。
答案 0 :(得分:0)
这需要比看起来更多的工作......我找不到直接的解决方案,所以这里有一个解决方法
Public Function ListforIn(inputString As String) As String
Dim qdf As QueryDef
Dim valCriteria As String
Dim strsql As String
Dim splitcounter As Byte
Dim valcounter As Byte
Set qdf = CurrentDb.QueryDefs(**TheNameOfQueryYouWantToModify**)
strsql = qdf.sql
strsql = Replace(strsql, ";", "") 'To get rid of ";"
splitcounter = Len(inputString) - Len(Replace(inputString, ",", ""))
For valcounter = 0 To splitcounter
valCriteria = valCriteria & ValParseText(inputString, valcounter, ",")
Next
strsql = strsql & " WHERE TableId IN (" & Left(valCriteria, Len(valCriteria) - 1) & ")"
qdf.sql = strsql
End Function
Public Function ValParseText(TextIn As String, X As Byte, Optional MyDelim As String) As Variant
On Error Resume Next
If Len(MyDelim) > 0 Then
ValParseText = "Val(" & (Split(TextIn, MyDelim)(X)) & "),"
Else
ValParseText = Split(TextIn, " ")(X)
End If
End Function