我编写了两个VBA函数,这些函数最终返回一个整数集合:
Public Function ValidIDs() As Collection现在,我想使用以下条件在QueryEditor中运行create查询:WHERE TableID IN ValidIDs()。这不起作用,因为access由于某种原因甚至找不到我的函数,只要它返回一个Collection。因此,我在它周围编写了一个包装器,它加入了集合:
Public Function joinCollectionForIn(Coll As Collection) As String现在,第三个函数调用ValidIDs(),将结果传递给joinCollectionForIn并返回结果。让我们称它为GetIDCollectionAsString()。
因此,我现在可以将查询更改为WHERE TableID IN (GetIDCollectionAsString())。注意添加的括号,因为IN在任何情况下都需要它们,它们不能仅仅位于GetID...返回的字符串的末尾和开头。
但是,运行该查询将导致
标准表达式中的数据类型不匹配。
我猜这是因为我返回了一个字符串,因此access会在'中自动包装该字符串,因为IN-clause将不再工作,因为我将检查数字是否为IN (一个1字符串的集合)。
因此,我的问题是:
或者(会好得多):
WHERE IN-clause的方法?P.S.:我目前使用的方法是在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)。这实际上使用了上述方法,但不是很好的方式。
发布于 2015-06-01 07:15:39
这需要比看上去更多的工作..。我找不到直截了当的解决办法,所以这里有个解决办法
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 Functionhttps://stackoverflow.com/questions/30567336
复制相似问题