首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用VBA函数调用在QueryEditor中创建查询以指定WHERE子句

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

Stack Overflow用户
提问于 2015-06-01 06:51:59
回答 1查看 595关注 0票数 1

我编写了两个VBA函数,这些函数最终返回一个整数集合:

代码语言:javascript
复制
Public Function ValidIDs() As Collection

现在,我想使用以下条件在QueryEditor中运行create查询:WHERE TableID IN ValidIDs()。这不起作用,因为access由于某种原因甚至找不到我的函数,只要它返回一个Collection。因此,我在它周围编写了一个包装器,它加入了集合:

代码语言:javascript
复制
Public Function joinCollectionForIn(Coll As Collection) As String

现在,第三个函数调用ValidIDs(),将结果传递给joinCollectionForIn并返回结果。让我们称它为GetIDCollectionAsString()

因此,我现在可以将查询更改为WHERE TableID IN (GetIDCollectionAsString())。注意添加的括号,因为IN在任何情况下都需要它们,它们不能仅仅位于GetID...返回的字符串的末尾和开头。

但是,运行该查询将导致

标准表达式中的数据类型不匹配。

我猜这是因为我返回了一个字符串,因此access会在'中自动包装该字符串,因为IN-clause将不再工作,因为我将检查数字是否为IN (一个1字符串的集合)。

因此,我的问题是:

  • 是否有一种方法可以防止访问为SQL包装返回的字符串?

或者(会好得多):

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

EN

回答 1

Stack Overflow用户

发布于 2015-06-01 07:15:39

这需要比看上去更多的工作..。我找不到直截了当的解决办法,所以这里有个解决办法

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30567336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档