使用VBA函数调用在QueryEditor中创建查询,以指定WHERE IN子句

时间:2015-06-01 06:52:00

标签: vba ms-access access-vba ms-access-2013

我写了几个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个字符串的集合。

因此我的问题是:

  • 是否有办法阻止访问包装SQL的返回字符串

或(会好很多):

  • 是否有一种已经存在的方法将集合或数组传递给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)。这实际上可以使用上面的方法,但不是很好。

1 个答案:

答案 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