在 IN 语句中使用来自表单的参数

Using parameter from form in IN statement

我有一个包含多个输入的表单,然后将其传递给查询。这非常简单,除了我希望在 sql 的 IN 语句中使用我的参数之一,如下所示:

Select sum(id) as numobs from table where year=[form]![form1]![year] and (group in([form]![form1]![group]));

当 [form]![form1]![group]="3,4" 它查询 "group in(34)" 并且如果 [form]![form1]![group]="3, 4" 那么我收到一条错误消息 "This expression is typed incorrectly, or it is too complex to be evaluated..."

我希望能够在表单的字段中输入以逗号分隔的多个数字,然后让查询在 IN 语句中使用结果。这看起来可行吗?

我知道 VBA 我可以做 if-then 语句来查看组号的每一种可能组合(有超过 40 个组,所以组合上有超过 4 万亿种方法来组合 40 多个组,因为42 choose k from 0 to 42 的总和超过 4 万亿)所以使用 IN 语句似乎是一个更好的选择。

关于如何让 IN 语句与表单中的参数一起工作有什么想法吗?

谢谢

我想不出用 IN 来做的方法。

我的解决方案:在数据库的 VBA 模块中,编写一个 sub 以基于表单控件中的值构建查询。让我们使用 Split 方法创建一个数组,我们可以遍历它来构建查询。

Sub MakeTheQuery()
Dim strSQL As String, db As DAO.Database
Set db = CurrentDb()

strSQL = "SELECT sum(id) AS numobs _
FROM table WHERE ("

Value = Forms!YourForm!YourControl.Caption
'The property may vary with controls ^

'Create an array from the control values
anArray = Split(Value, ",")

'Add to the query for each value
For i = LBound(anArray) To (UBound(anArray) - 1)
strSQL = strSQL & " ErrorKey.ID = " & anArray(i) & " OR"
Next i

'Wrap it all up
strSQL = strSQL & " ErrorKey.ID = " & anArray(UBound(anArray)) & ")"

'Assign SQL to query
db.QueryDefs!YourQuery.SQL = strSQL

End Sub

请记住,这假设表单控件中的字符串将被格式化为 no spaces,但您可以使用 [=] 轻松更改它13=] 代替(注意 space 在逗号后添加)。

要将 VBA 子项分配给表单上的按钮或其他控件,方法是转到 Layout View,单击一个控件,然后转到 [=] 上的 Event 选项卡38=] Sheet,点击点击旁边的 ... 按钮。命中 Code Builder。将 Call MakeTheQuery 放入它为您构建的子程序中。如果您也想 运行 查询,请输入 DoCmd.OpenQuery "YourQuery".

你也可以用这个方法

这可以非常简单地用 VBA 模块中的子来完成:

Sub MakeTheQuery()
    Dim db As DAO.Database
    Dim strSQL As String
    Dim strElements As String

    Set db = CurrentDb()

    strSQL = "SELECT Sum(id) AS numobs " & _
        "FROM ErrorKey WHERE ErrorKey.ID In ({0});"

    ' Example: "3,5"
    strElements = Forms!YourForm!YourControl.Caption

    ' Assign SQL to query
    db.QueryDefs!YourQuery.SQL = Replace(strSQL, "{0}", strElements)

End Sub

您可以考虑 Instr() 函数而不是 In。假设您按程序生成编号列表而不是强制最终用户键入以逗号分隔的列表,您可以更改格式。我们通常使用管道分隔符,例如,输入可能如下所示: [form]![form1]![group]="|3|4|" 这作为单个字符串参数传递给查询,并在 Instr() 函数中进行测试,如下所示: Instr([form]![form1]![group],"|" & group & "|")>0 ' Instr() returns a numeric value of the position in the first argument where the second argument is found. 管道确保我们不会得到误报(例如,当我们通过 34 时发现 3)。我们将其与 multi-select 列表框和自定义 VBA 函数一起使用,但只要您可以控制格式,它就完全可行。 Instr Function - support.office.com