VBA将查询条件的函数参数作为变量传递

时间:2017-04-13 14:45:44

标签: vba ms-access

我现在已经使用VBA一年或更长时间了,但是我完全是自学成才,而且远非先进。我已经使用StackOverflow无数次地解决了我的问题,但这是我的第一个问题,所以请原谅任何问题。

我有一个带有文本框的表单,我想将其用作查询的条件。如果我的文本框只包含我要搜索的1个值,我现在可以运行查询,但是如果我想搜索多个值,我会遇到问题。

我按照这个过程来尽我所能 Using Variables in VBA to Filter Access 2007 Queries

我的计划是使用函数将条件作为字符串传递 类似标准:GetCrit() 其中GetCrit是一个公共函数,作为单独模块中的字符串,返回字符串 In("Value1",Value2") 然后我的想法是简单地将参数设置为由函数GetCrit()定义的变量。即:查询条件为In(GetCrit())

我无法使这些选项中的任何一个工作,因为我相信当前查询正在查找满足字符串"In(GetCrit())"的值,因为我的函数被定义为字符串。

我打算将文本框更改为包含所有可能值的组合框或列表框,然后使用宏将选择项转换为字符串,可以读取类似于In(“Value1”,“Value2”),但是我我愿意接受更好的方法来实现这一目标。

如下所示是我的适用代码

表格中的

Private Sub btnGen_Click()
SetQueryCriteria
End Sub

Public Sub SetQueryCriteria()
Dim MatrixCriteria As String
Dim holder As String
holder = [Forms]![frm_Name]![TXTBox].Value
SetCrit holder
End Sub
模块1中的

Private strCrit As String

Public Sub SetCrit(Value As String)
   strCrit = Value
End Sub

Public Function getcrit() As String
    getcrit = strCrit
End Function

我的查询标准目前是

In(GetCrit())

谢谢!

修改 在我继续研究的过程中,我发现也许多选列表框可能就是我想在这里使用的

1 个答案:

答案 0 :(得分:1)

您不能以这种方式通过单个函数进行过滤,因为该函数返回单个字符串,而单个字符串不能包含多个要过滤的项目。

您可以通过以下方式解决问题:

Public Sub AlterQuery()
    Dim qdf As QueryDef
    Set qdf = CurrentDb.QueryDefs("Query1")
    qdf.SQL = "SELECT * From Table Where Something In (" & GetCrit() & ")"
End Sub

这会在您的查询中对IN标准进行硬编码。如果从表单中打开查询,则可以在查询打开之前运行此代码。