【问题标题】:VBA - Listbox and SQL IN StatementVBA - 列表框和 SQL IN 语句
【发布时间】:2015-10-07 17:23:56
【问题描述】:

我有一个列表框,其中填充了以下数据。我只希望能够按名称列进行选择(视觉上)。

id | name
1  | value1
2  | value2

我需要一些条件发生并将它们应用到我的 SQL 中的 where 语句中。

  1. 如果未选择任何内容,则将 where 语句全部省略
  2. 如果包含 1 个值,请将 where id = 1
  3. 如果两个值都被选中,则创建如下 IN 语句

    IN ('1','2')

编辑 --//

这是在初始化时填充列表框的代码

Sub UserForm_Initialize()

    'SQL query that will populate the Mode Box
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Set cnn = New ADODB.Connection
    Set rst = New ADODB.Recordset

    cnn.Open "Provider=SQLOLEDB;Data Source=yadayda;" & _
             "Initial Catalog=db;" & _
             "Integrated Security=SSPI;"

    Set rst = cnn.Execute("SELECT [ID] AS [ID],[Name] AS [Name] FROM [Table]")
    rst.MoveFirst
    i = 0

    With Me.form_mode

        .Clear
        Do
            .AddItem
            .List(i, 0) = rst![Mode]
            .List(i, 1) = rst![ID]
            i = i + 1
            rst.MoveNext
        Loop Until rst.EOF

    End With

    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing

End Sub

编辑 -// 使用以下方法让它工作

`将 strFilter 调暗为字符串 将 i 调暗为整数

    For i = 0 To Main_Window.form_mode.ListCount - 1
        If Main_Window.form_mode.Selected(i) Then
            If strFilter <> vbNullString Then strFilter = strFilter & ", "
            strFilter = strFilter & "'"
            strFilter = strFilter & Main_Window.form_mode.List(i, 1)
            strFilter = strFilter & "'"
        End If
    Next i`

感谢此线程中的@ralph - VBA - SQL with optional joins

【问题讨论】:

  • 您的标签使用excel-vba,但这听起来像是一个带有 SQL 行源的 Access 表单列表框。
  • 我在 Excel 中执行此操作。添加人口代码进行编辑
  • 创建“where”子句的具体问题是什么?请注意,您还可以通过将IN() 用于单一选择案例来简化您的逻辑。
  • 啊,我的印象是你不能做 WHERE [col] IN ('1')。我需要能够选择多个值,比如说我有 10 个选项可供选择,但只能选择 5 个。如何在 IN 语句中循环这些值。

标签: vba excel


【解决方案1】:

在您的 UserForm_Initialize 函数中设置 Me.form_mode.MultiSelect = fmMultiSelectMultifmMultiSelectExtended 以允许多选(或通过 ListBox 属性设置)。

然后在按钮单击事件中使用以下代码获取选定的值:

Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim arr() As String
    For i = 0 To form_mode.ListCount - 1
        If form_mode.Selected(i) Then
            ReDim Preserve arr(i)
            arr(i) = form_mode.List(i, 1)
        End If
    Next i
    MsgBox "WHERE [ID] IN ('" & Join(arr, "','") & "')"
End Sub

【讨论】:

  • 我正在接收这一行所需的对象 - For i = 0 To form_mode.ListCount - 1 我最初将它声明为我的子顶部的一个值,所以我删除了它.. 不走运,然后将它添加回作为form_mode = Main_Window.form_mode.List
  • 你能试试 Me.form_mode.ListCount 吗?并确保它与 User_Initialize 函数位于同一部分。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多