如何在 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 函数的主要内容,如果未能解决你的问题,请参考以下文章