【问题标题】:MS Access fast Combo Box with VBA带有 VBA 的 MS Access 快速组合框
【发布时间】:2021-05-07 01:41:50
【问题描述】:

我有一个表单,上面有一个 ComboBox,它通过 ID 提取记录并显示链接表中的名称。标准在生成的表单组合框向导中查找值。它工作得很好,但每次找到一条记录需要 3-4 分钟。

我一直在尝试对此进行研究,并发现了一些看起来很有用但似乎无法正确使用的东西。

我现在的代码:

 Private Sub Combo81_Change()
 Dim strText As String
 Dim strSelect As String
 strText = Nz(Me.Combo81.Text, "")
 If Len(strText) > 2 Then
 strSelect = "SELECT Name FROM CTable WHERE Name LIKE '*" & strText & "*'; "
 Debug.Print strSelect
 Me.Combo81.RowSource = strSelect
 Me.Combo81.Dropdown
 End If
 End Sub

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

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

我想当用户输入时,例如“史密斯”只有那些姓史密斯的人才会出现。

我对 Access 和数据库比较陌生,我正在使用 FE/BE 将表链接到共享网络文件夹和用户桌面上的 FE。

有什么建议吗?或者另一种解决方案,即如何更快地使用我的组合框并仍然保持值的唯一性?

【问题讨论】:

  • 有时但并非总是如此,在 sql 语句中包含终止符会导致问题。构建查询表达式时,最好不要使用分号 SQL 终止符:“SELECT Name FROM CTable WHERE Name LIKE '” & strText & “'”
  • 即使 (="[ID] = " & Str(Nz([Screen].[ActiveControl],0))) on/ 或删除它,我是否应该在更新后离开搜索记录?
  • 这能回答你的问题吗? Search as you type with MS Access Combobox
  • Combobox AutoExpand 属性不够用?
  • 自动展开 = 是

标签: sql vba ms-access combobox


【解决方案1】:

您可以使用以下代码在 ms 访问中作为用户类型在组合框中搜索值, 假设我们的表单中有一个名为 org_id 的组合框,为了在 org_id 中搜索一个值,我们需要 org_id 组合框上的三个事件。 AfterUpdate、LostFocus 和 KeyPress 事件。 代码是:

Dim strFilter As String ' Module scope variable used for filter on our combo (org_id)

Private Sub org_id_AfterUpdate()
    strFilter = ""
    strSQL = "SELECT org_tbl.org_id, org_tbl.org_name, org_tbl.org_code FROM org_tbl" & _
             " ORDER BY org_tbl.org_code"
    org_id.RowSource = strSQL
    
End Sub

Private Sub org_id_LostFocus()
    strFilter = ""
    strSQL = "SELECT org_tbl.org_id, org_tbl.org_name, org_tbl.org_code FROM org_tbl" & _
             " ORDER BY org_tbl.org_code"
    org_id.RowSource = strSQL
End Sub

Private Sub org_id_KeyPress(KeyAscii As Integer)
    strSQL = "SELECT org_tbl.org_id, org_tbl.org_name, org_tbl.org_code FROM org_tbl ORDER BY org_tbl.org_code"
    
    If KeyAscii <> 8 Then ' pressed key is not backspace key
        strFilter = strFilter & Chr(KeyAscii)
    End If
    
    If IsNull(strFilter) = True Or strFilter <> "" Then
        If KeyAscii = 8 Then ' pressed key is backspace key
            strFilter = Left(strFilter, (Len(strFilter) - 1))
        End If
    End If
    
    strSQL = "SELECT org_tbl.org_id, org_tbl.org_name, org_tbl.org_code FROM org_tbl" & _
             " WHERE org_name Like '*" & strFilter & "*' ORDER BY org_tbl.org_code"
    org_id.RowSource = strSQL
    org_id.Dropdown
End Sub

我希望这个(答案)对你有所帮助。

编辑: 您可以从以下链接下载示例文件: Access combo box to search as you type sample file

【讨论】:

  • 我把这段代码放在哪里?只需转到设计,查看代码,然后将其全部放入其中并修改组合和字段名称。还是将其单独添加到表单属性窗口中的每个事件中?
  • 我在上面添加了组合框属性当前的样子
  • 只需在设计视图中打开您的表单。 1. 单击设计选项卡上的查看代码按钮。 2.将以上代码复制粘贴到VBE窗口中。 3. 用您的组合名称查找并替换 org_id。请注意,所有事件名称都必须使用您的组合名称进行编辑,例如 org_id_LostFocus 必须更改为 your_combo_LostFocus。
  • 我在上面的这个和其他解决方案中遇到了同样的情况。我终于让它工作了,但它不会过滤或转到表格中的记录。我错过了什么?一旦选择了正确的名称,我需要表格才能转到该记录....
  • 我终于弄明白了,我在更新后的部分添加了 DoCmd.SearchForRecord , "", acFirst, "[ID] = " & Str(Nz(Screen.ActiveControl, 0))代码。非常感谢您的帮助!!!
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多