【问题标题】:Access textbox with multiple values to query访问具有多个值的文本框进行查询
【发布时间】:2016-10-13 13:40:03
【问题描述】:

我有一个 Access 数据库,其中有一个带有文本框(名为 c1)和一个按钮的表单。当我单击该按钮时,它会打开一个数据表表单,其中包含按文本框值过滤的信息。

按钮 vba 如下所示:

c1.Value = Replace(c1.Value, ",", " Or ")
DoCmd.OpenForm ("dsForm")

数据表后面的查询在设计视图中看起来像这样:

Field:      Name1  |  Name2
Criteria:          |  Like [Forms]![Menu]![c1].[value]

这样我以后可以将此查询的结果导出到 excel。

所以我的问题是我想在文本框中输入值并用逗号分隔它们,稍后将通过 vba 将它们转换为 Or。为什么我使用 1 个文本框而不是多个文本框来执行此操作,是因为我可以有许多要搜索的值。

现在,如果我在文本框中输入一个值,它就可以工作,但是当我输入 2 个值时,它就不起作用了。我很确定查询将整个语句作为字符串,例如,如果我输入 110,220,它应该像“110”或“220”,但在查询中它会像“110 或 220”。

我尝试将字段设置为字符串或数字。我将如何操作来自 vba 的查询的条件?

【问题讨论】:

    标签: sql ms-access vba


    【解决方案1】:

    我建议使用 IN 语句而不是 OR 编写 SQL 字符串,并使用 OpenArgs 事件将数据从主表单传递到数据表表单。

    主窗体按钮代码

    Dim sql as String
    
    sql = "Select * From [table name] Where Name2 IN (" & c1 & ")"
    DoCmd.OpenForm "dsForm", acFormDS, , , , , sql
    

    数据表表单 (dsForm) 代码 -- 使用 Form_Load 事件。

    Private Sub Form_Load()
      Me.RecordSource = Me.OpenArgs
    End Sub
    

    IN 语句允许您使用逗号。 OpenArgs 事件允许您将值从一种形式传递到另一种形式。

    【讨论】:

    • 为什么你不能只使用sql = "WHERE Name2 in (" & c1 & ")" 然后DoCmd.openform "dsform", acformDS, , sql 并将SQL 语句放在Where 语句的位置。那么就不需要传递任何openargs或者使用其他形式的recordsource语句
    • @geeFlo 你是对的,这更适合这种情况。虽然正确的措辞是在没有“WHERE”保留字的情况下完成的。 'sql = Name2 in (" & c1 & ")" '
    【解决方案2】:

    实际上我的第一个方法很糟糕,将值读入这样的数组:

    Sub y()
    a = "a,b,c,d"
    
    'Split into 1d Array
    b = Split(a, ",", , vbTextCompare)
    
    For c = 0 To UBound(b)
        Debug.Print b(c)
    Next c
    
    End Sub
    

    您可以像在 debug.print 循环中一样循环遍历数组并分别使用每个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多