1

我正在使用 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 运行的查询中访问表单控件。

4

2 回答 2

1

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

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

这是一个VBACollection示例...

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
于 2013-05-23T15:31:25.853 回答
1

请原谅我,但我在看到这种额外间接级别的真正好处时遇到了一些麻烦。您必须创建与您计划调用的特定查询的参数相对应的变量,然后调用通用函数来调用它。为什么不直接创建一个 QueryDef,将参数传递给它,然后就地调用它呢?它看起来基本上是相同的工作量,它使代码更容易理解,因为“一切都在那里”。

于 2013-05-23T15:35:01.260 回答