You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access多行表单ComboBox输入筛选:避免清空历史行项

解决连续窗体中ComboBox筛选不影响其他行的问题

你的代码目前会修改ComboBox的全局RowSource属性,导致所有行的该控件都使用新的筛选结果,从而清空之前行的已选内容。要让筛选仅作用于当前编辑行,需要避免修改控件的全局RowSource,改用动态生成临时下拉列表的方式:

修改后的代码

Private Sub cboProductID_Change()
    FilterComboAsYouType Me.cboProductID, "SELECT * FROM Products", "ProductName", "ProductID"
End Sub

Public Sub FilterComboAsYouType(combo As ComboBox, defaultSQL As String, displayField As String, boundField As String)
    Dim strSQL As String
    Dim rs As DAO.Recordset
    Dim currentValue As Variant
    
    ' 保存当前行的绑定值,避免筛选后丢失
    currentValue = combo.Value
    
    ' 生成筛选SQL,处理单引号防止报错
    If Len(combo.Text) > 0 Then
        strSQL = defaultSQL & " WHERE " & displayField & " LIKE '*" & Replace(combo.Text, "'", "''") & "*'"
    Else
        strSQL = defaultSQL
    End If
    
    ' 打开筛选后的记录集
    Set rs = CurrentDb.OpenRecordset(strSQL)
    
    ' 清空当前下拉列表
    combo.Clear
    
    ' 设置列数与绑定列
    combo.ColumnCount = 2
    combo.BoundColumn = 2
    
    ' 将筛选结果添加到下拉列表
    Do While Not rs.EOF
        combo.AddItem rs(displayField) & ";" & rs(boundField)
        rs.MoveNext
    Loop
    
    ' 恢复当前行的绑定值,确保显示正确
    If Not IsNull(currentValue) Then
        combo.Value = currentValue
    End If
    
    ' 弹出下拉列表
    combo.Dropdown
    
    ' 清理资源
    rs.Close
    Set rs = Nothing
End Sub

关键修改说明

  • 不再修改RowSource,而是通过AddItem动态生成当前行的下拉列表,控件默认的RowSource保持不变,其他行不受影响。
  • 新增boundField参数指定绑定字段(比如ProductID),确保选中后能正确保存对应值。
  • 加入Replace(combo.Text, "'", "''")处理输入中的单引号,避免SQL语法错误。
  • 保存并恢复当前行的绑定值,防止筛选后已选内容丢失。

配套设计设置

在窗体设计视图中,给cboProductID设置以下属性:

  • ColumnCount:设为2
  • BoundColumn:设为2(对应绑定字段的列)
  • ColumnWidths:可设为"100pt;0pt",隐藏绑定列,只显示产品名称

内容的提问来源于stack exchange,提问作者Yvonne Ayala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:05:56