如何在 WHERE IN 条件下使用自定义 VBA 函数

Posted

技术标签:

【中文标题】如何在 WHERE IN 条件下使用自定义 VBA 函数【英文标题】:How to use custom VBA function in WHERE IN condition 【发布时间】:2017-02-10 16:52:10 【问题描述】:

我正在尝试使用自定义 VBA 函数来填充访问 SQL 查询的 WHERE IN 函数的列表,但是我似乎无法让它工作。查询的简化版本如下所示

SELECT staffNo, [Staff Member], CoachingStage, 
FROM tblCoachingStages
WHERE CoachingReason IN (getList())

getList()函数的代码是

Function getList() As String

If DCount("[CDP]", "[tblAdmin]", "[CDP] = '" & Environ("username") & "'") = 0 Then
        getList= "'Performance', 'ReDeployment'"
Else
        getList= "'Performance', 'ReDeployment', 'Absence'"
End If

End Function

我尝试过使用引号,例如缺少前导和结束引号,以防编译器添加但我无法使其正常工作。

我试图避免使用 queryDef 来更改查询的 SQL,因为表单在打开数据库时加载并且查询填充子表单,所以如果我在表单的加载事件上更改 sql 它已经在后台运行查询。

谢谢

【问题讨论】:

您遇到什么错误?如果添加 sql 字符串的 debug.print 会得到什么? 【参考方案1】:

我认为这行不通。您的函数返回一个 单个字符串 值,因此 WHERE 子句有效地出现(取决于您的 DCOUNT 函数的结果):

WHERE CoachingReason = "'Performance', 'ReDeployment'"

WHERE CoachingReason = "'Performance', 'ReDeployment', 'Absence'"

也许你可以试试

WHERE getList() Like "*" & CoachingReason & "*"

【讨论】:

抱歉,我的回复延迟了,在您回复之前我已经在星期五离开了办公室。这很好用,我没想到会这样做。非常感谢【参考方案2】:

@Skippy 是对的。必须在运行查询之前解析 in-values。

你可以这样做:

SELECT 
    staffNo, [Staff Member], CoachingStage 
FROM 
    tblCoachingStages
WHERE 
    CoachingReason IN ('Performance', 'ReDeployment')
    OR
    CoachingReason = Nz(DLookup("'Absence'", "[tblAdmin]", "[CDP] = '" & Environ("username") & "'"))

【讨论】:

谢谢 Gustav,我将使用 Skippy 的答案,因为我发布的示例问题有点简化,getlist 返回的字符串可以包含许多不同的值,因此使用通配符更容易.干杯【参考方案3】:

在带有 public 关键字的 bas 模块中声明函数 getList,以便可以通过 Access Queries 访问它。对于测试,从 VBA 代码即时窗口(如 ?getlist())调用该函数,然后按 Enter。这应该返回一个结果而不是错误。 使用函数返回值的硬编码值运行查询后,确保函数返回字符串时查询语法和 SQL 正常。

【讨论】:

你好假。是的,查询使用硬编码值正确运行。我试图让它与作为查询的一部分的函数一起运行。我现在要接受 Skippy 的回答,谢谢

以上是关于如何在 WHERE IN 条件下使用自定义 VBA 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何优化Oracle在where条件中用了自定义函数的SQL语句

excel中怎样用vba使单元格在特定条件下才可以编辑?

如何在 Linq 的 Where 条件中使用 IN 运算符

VBA SQL 缺少 WHERE 子句的最后一个条件

access 查询条件 能否用自定义的函数

如何添加自定义条件查询(请各位老大指教)