我正在使用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。
答案 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,传递参数,并在适当的位置调用它?它似乎基本上是相同的工作量,它使代码更容易遵循,因为“一切都在那里”。