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

基于TextBox值筛选多列ListBox的实现方案

用少量VBA代码实现ListBox基于TextBox的筛选

核心思路

先备份ListBox的原始数据,在文本框内容变化时,遍历原始数据匹配第2列,仅加载符合条件的行到ListBox。

代码实现

  1. 声明模块级变量保存原始数据
    在用户窗体的代码模块顶部添加:
Private originalList As Variant
  1. 窗体初始化时备份数据
    添加窗体初始化事件:
Private Sub UserForm_Initialize()
    ' 备份ListBox的全部原始数据
    originalList = Me.ListBox1.List
End Sub
  1. 文本框Change事件实现筛选
    添加文本框的内容变化事件:
Private Sub txtShopOrdNum_Change()
    Dim filterText As String
    Dim i As Long, colCount As Long
    Dim filteredItems As Variant
    Dim matchCount As Long
    
    filterText = LCase(Me.txtShopOrdNum.Value)
    colCount = Me.ListBox1.ColumnCount - 1
    matchCount = 0
    
    ' 清空当前ListBox内容
    Me.ListBox1.Clear
    
    ' 若筛选框为空,恢复全部数据
    If filterText = "" Then
        Me.ListBox1.List = originalList
        Exit Sub
    End If
    
    ' 初始化筛选数组,维度与原始数据一致
    ReDim filteredItems(0 To UBound(originalList, 1), 0 To colCount)
    
    ' 遍历原始数据,匹配第2列(索引从0开始,对应索引1)
    For i = 0 To UBound(originalList, 1)
        ' 模糊匹配(如需精确匹配,替换为 LCase(originalList(i, 1)) = filterText)
        If LCase(originalList(i, 1)) Like "*" & filterText & "*" Then
            ' 复制整行数据到筛选数组
            filteredItems(matchCount) = originalList(i)
            matchCount = matchCount + 1
        End If
    Next i
    
    ' 加载筛选后的结果到ListBox
    If matchCount > 0 Then
        ReDim Preserve filteredItems(0 To matchCount - 1, 0 To colCount)
        Me.ListBox1.List = filteredItems
    End If
End Sub

注意事项

  • 代码中ListBox1需替换为你实际的ListBox控件名称;
  • 第2列的索引是1(VBA中ListBox列索引从0开始);
  • 代码默认是模糊匹配,如果需要精确匹配,修改判断条件为LCase(originalList(i, 1)) = filterText;
  • 确保窗体初始化时ListBox已经加载了所有数据,若ListBox数据是从工作表读取的,可在UserForm_Initialize中先完成数据加载再备份。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:27:13