限制ComboBox中的RowSource(访问)

时间:2016-01-27 14:57:17

标签: forms vba ms-access combobox access-vba

我有一个表格,上面有一个ComboBox,可以从一个包含我们所有销售(50k +记录)的大表中提取所有DISTINCT同事的名字。它工作得非常好,但打开表单需要3-4分钟,因为Access需要很长时间才能找到表中所有唯一的同事姓名。

我一直在努力研究这个并找到一些看似有用的东西,但似乎无法做到正确。

我现在的代码:

Private Sub CollName_Change()
Dim strText As String

strText = Nz(Me.CollName.Text, "")

If Len(strText) > 2 Then

Me.CollName.RowSource = "SELECT CollPerf.Colleague FROM CollPerf WHERE CollPerf.Colleague LIKE ""*"" & strText & ""*""; "

Me.CollName.Dropdown

End If
End Sub

我在两个论坛上发现了这个代码,这应该执行以下操作:“关键是没有为组合框定义行源。行源将被定义为用户开始键入字母。一旦他们开始得到3个字母,然后将定义组合框的行源,并告诉组合框下拉。“

当我收到3个字母时,会出现一个下拉列表,但它是空白的,不会显示任何结果。

我对Access比较新,虽然已经构建了两个数据库,但它们都有相对基本的SQL查询,所以我不知道我在这里做的不是什么。

有什么建议吗?或者另外一个不同的解决方案是如何更快地使我的组合框保持唯一值?

1 个答案:

答案 0 :(得分:1)

你只有一些双引号混音。使用单引号而不是双引号更容易。

Me.CollName.RowSource = _
 "SELECT CollPerf.Colleague FROM CollPerf WHERE CollPerf.Colleague LIKE '*" & strText & "*';"

但如果您只使用起始字母,即删除前导*

,您的查询会更快
Me.CollName.RowSource = _
 "SELECT CollPerf.Colleague FROM CollPerf WHERE CollPerf.Colleague LIKE '" & strText & "*';"

但这取决于您的要求。

编辑进行调试:

Dim strText As String
Dim strSelect As String

strText = Nz(Me.CollName.Text, "")

If Len(strText) > 2 Then

    strSelect = "SELECT CollPerf.Colleague FROM CollPerf WHERE CollPerf.Colleague LIKE '*" & strText & "*';"
    Debug.Print strSelect 

    Me.CollName.RowSource = strSelect 
    Me.CollName.Dropdown

End If

将立即窗口中的strSelect复制到查询中,然后尝试一下。它应该有助于解决问题。

请参阅How to debug dynamic SQL in VBA