【问题标题】:Using User Defined Function output from VBA as an input in access query使用 VBA 的用户定义函数输出作为访问查询的输入
【发布时间】:2020-07-13 21:18:13
【问题描述】:

我创建了一个根据用户选择提供值的函数。我想在另一个查询中使用该函数的输出。

我的功能是:-

Public Function provisionvariable() As String


For Each sItem In Forms![Access Form].Provision.ItemsSelected

v_provision = "" & Forms![Access Form].Provision.Column(0, sItem) & ""



Provision = Provision & "" + v_provision + ","


'MsgBox Provision

Next

Provision = Left(Provision, Len(Provision) - 1)
provisionvariable = Provision
MsgBox provisionvariable
End Function

函数的输出是BBNI,FP

我想在访问查询中使用输出作为 where 条件

我的查询是

 ***SELECT DISTINCT quarter, provision, [currencycode]+'-not found in Master' AS Comment
       FROM t_00_unearned_unincepted_alloc_basis AS inp
       WHERE     **provision in (provisionvariable()) AND**
        NOT EXISTS 
        (SELECT 1 
        FROM     t_01_le_currency_master key1 
        WHERE   inp.[group_stat]=key1.[group_stat] AND 
                inp.le=key1.le AND 
                inp.[currencycode]=key1.[original_currency]);***

现在的问题是函数的输出是 BBNI,FP 但访问将其作为单个字符串,即查询中的 'BBNI,FP'。

是否可以将其作为两个字符串 ('bbni','FP') 而不是 'BBNI,FP'

非常感谢任何建议

谢谢

【问题讨论】:

    标签: ms-access vba ms-access-2010 ms-access-2007


    【解决方案1】:

    试试:

    Provision = Provision & "'" & v_provision & "',"
    

    为了确保您不会重复附加到模块级变量,您还应该执行本地操作

    Dim Provision As String
    

    【讨论】:

    • 我在我的函数中这样做。例如,如果函数的输出是 BBNI,FP。当我在我的访问查询中使用函数 provisionvariable() 时,它说 'BBNI,FP' 作为单个字符串并且查询不显示任何输出。
    • 我想要的是查询应该把它作为两个由 CSV 分隔的分隔字符串
    • @TomRobinson 的建议是正确的。只有当子句看起来像“WHERE (((Provision) In ('BBNI','FP','etc','etc')))...”时,您的查询才有效。您需要逗号并且需要分隔每个字符串都有一个单引号(或双引号,这会变得混乱)。
    • 我尝试了@TomRobinson 的方法,它把它当作'BBNI','fP' 作为单个字符串。它没有产生任何结果
    • 基于调试我看到访问是在查询中自动添加单引号''。
    【解决方案2】:

    基于下面的帖子,“一个函数不能用于 IN () 子句”How to call VBA-function from inside sql-query?

    因此,您需要构建 SQL(包括“In”列表)然后执行它。由于我不知道是否是多用户环境,或者您将如何使用查询输出,所以我将构建 SQL,保存为 QueryDef 对象,然后做任何您想做的事情。

    以下是构建 SQL 的代码:

    Dim strSQL  As String
    strSQL = "SELECT DISTINCT quarter, provision, [currencycode]+'-not found in Master' AS Comment " & _
       "FROM t_00_unearned_unincepted_alloc_basis AS inp " & _
       "WHERE  provision  In (" & ProvisionVariable() & ") AND " & _
       . . . .
    
    Debug.Print strSQL
    

    以下是我的 Function 版本(注意添加了单引号分隔符):

    Public Function ProvisionVariable() As String
    Dim sItem           As Variant
    Dim v_provision     As String
    Dim provision       As String
    
        provision = ""
        For Each sItem In Forms![Access Form].Provision.ItemsSelected
            v_provision = "'" & Forms![Access Form].Provision.Column(0, sItem) & "'"
            provision = provision & "" + v_provision + ","
        Next sItem
    
        provision = left(provision, Len(provision) - 1)
        ProvisionVariable = provision
        Debug.Print ProvisionVariable
    End Function
    

    【讨论】:

    • 我阅读了帖子,其中发现函数不能用于 IN () 子句。我使用带有 in 子句的函数运行查询,没有错误。我认为我们可以使用 in 子句运行查询。
    • 我想在代码之外查询,因为这些查询是对数据表的验证。所以需要在不查看代码的情况下明确检查输出
    • 首先,不会产生错误并不意味着它有效。如果您要坚持查询保留在函数 EMBEDDED 的调用中,那么我无能为力。如果您想产生所需的结果并愿意一次更改您的代码,那么有一个解决方案。您没有提及使用查询的方式/位置,但我猜它是另一个表单/控件的 RecordSource,还是您通过 VBA 执行它?更改代码后,您无需再次更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多