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

时间:2017-02-10 16:52:11

标签: sql access-vba

我正在尝试使用自定义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的load事件表单已经在后台运行查询。

由于

3 个答案:

答案 0 :(得分:1)

我不认为这会起作用。您的函数返回一个单字符串值,因此WHERE子句实际上会出现(取决于您的DCOUNT函数的结果):

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

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

也许你可以试试

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

答案 1 :(得分:1)

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

你可以这样做:

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

答案 2 :(得分:0)

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