使用QueryDef在查询中定义参数时出错

时间:2013-05-23 14:25:35

标签: vba ms-access

我正在使用Access并尝试在VBA中使用带参数的查询。我有几个需要使用的查询,所以我添加了一个例程来概括过程:

Public Function Execute_query(query) As Recordset

Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs(query)
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
    Next prm

If (qdf.Type = 80) Then
    qdf.Execute
    Else: Set Execute_query = qdf.OpenRecordset
    End If
End Function

我仍在对此进行测试,因此可能存在其他问题,但我的直接问题是为什么Eval(prm.name)行不起作用。参数是[R_Yr],我已将其声明为公共变量,并已赋值 - 我可以在监视窗口中验证。但我得到一个错误代码2482 - Access无法找到名称'R_yr“

当参数值来自表单而不是变量时,这个相同的代码似乎有用 - 这就是为什么我必须首先设置它 - 我无法访问查询运行中的表单控件VBA。

2 个答案:

答案 0 :(得分:1)

Eval()获取您提供的字符串并使用“表达式服务”来处理它。您面临的问题是表达式服务对VBA变量一无所知。如果你真的有决心,你可以找出一个解决方法,将变量的而不是变量的 name 构建到你给出的字符串Eval()中......嗯...评估。

但是对于你正在做的事情,我建议你放弃Eval()。而是为函数提供一个数据结构,例如Scripting.Dictionary或VBA Collection,其中包含以前的变量名称作为键的参数值。

这是一个VBA Collection示例......

Dim MyCol As Collection
Set MyCol = New Collection
MyCol.Add CLng(10), "R_Yr"
MyCol.Add "foo", "MyString"
Debug.Print MyCol("R_Yr"), TypeName(MyCol("R_Yr"))
Debug.Print MyCol("MyString"), TypeName(MyCol("MyString"))

该代码在立即窗口中给我输出...

 10           Long
foo           String

因此,请考虑在调用代码中构建一个类似的集合,并将该集合传递给修改后的Execute_query函数。

Public Function Execute_query(ByVal pQdf As String, _
        ByRef pCol As Collection) As Recordset

    Dim qdf As QueryDef
    Set qdf = CurrentDb.QueryDefs(pQdf)
    For Each prm In qdf.Parameters
        prm.Value = pCol(prm.Name)
    Next prm

    If (qdf.Type = 80) Then
        qdf.Execute
    Else
        Set Execute_query = qdf.OpenRecordset
    End If
End Function

答案 1 :(得分:1)

请原谅我,但是从这种额外的间接水平看到真正的好处我有点麻烦。您必须创建与您计划调用的特定查询的参数相对应的变量,然后调用泛型函数来调用它。为什么不创建一个QueryDef,传递参数,并在适当的位置调用它?它似乎基本上是相同的工作量,它使代码更容易遵循,因为“一切都在那里”。