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

如何基于ComboBox选择值筛选Input工作表数据至Listbox?

解决方案

1. 初始化组合框选项(加载唯一筛选值)

在用户窗体的Initialize事件中添加代码,将Input工作表J列的唯一值加载到组合框,同时加入「全部」选项方便查看所有数据:

Private Sub UserForm_Initialize()
    Dim sh As Worksheet
    Dim lr As Long
    Dim cell As Range
    Dim uniqueVals As Collection
    
    Set sh = ThisWorkbook.Sheets("Input")
    lr = sh.Range("J" & Rows.Count).End(xlUp).Row
    Set uniqueVals = New Collection
    
    ' 添加「全部」选项
    Me.cmbFilter.AddItem "全部"
    
    ' 提取J列唯一值(跳过空单元格)
    On Error Resume Next
    For Each cell In sh.Range("J2:J" & lr)
        If cell.Value <> "" Then
            uniqueVals.Add cell.Value, Key:=CStr(cell.Value)
        End If
    Next cell
    On Error GoTo 0
    
    ' 将唯一值添加到组合框
    For Each val In uniqueVals
        Me.cmbFilter.AddItem val
    Next val
    
    ' 默认选中「全部」
    Me.cmbFilter.ListIndex = 0
    
    ' 初始化加载全部数据到列表框
    LoadListBoxData "全部"
End Sub

2. 编写通用加载列表框的过程

这个过程可根据传入的筛选值,加载全部数据或筛选后的数据,替代原代码中RowSource的方式,更灵活适配筛选需求:

Private Sub LoadListBoxData(filterVal As String)
    Dim sh As Worksheet
    Dim lr As Long
    Dim i As Long, j As Long
    Dim arrData As Variant
    
    Set sh = ThisWorkbook.Sheets("Input")
    lr = sh.Range("B" & Rows.Count).End(xlUp).Row
    
    ' 无数据时清空列表框
    If lr < 2 Then
        Me.lstbox1.Clear
        Exit Sub
    End If
    
    ' 获取B2:J区域的全部数据
    arrData = sh.Range("B2:J" & lr).Value
    
    ' 重置列表框设置
    Me.lstbox1.Clear
    With Me.lstbox1
        .ColumnCount = 9
        .ColumnHeads = True
        .ColumnWidths = "30,40,150,60,60,180,50,0,80"
        ' 临时设置表头(从B1:J1读取)
        .RowSource = "Input!B1:J1"
        .RowSource = "" ' 清空RowSource避免冲突
    End With
    
    ' 遍历数据并加载(匹配筛选条件则添加)
    For i = LBound(arrData, 1) To UBound(arrData, 1)
        If filterVal = "全部" Or arrData(i, 9) = filterVal Then
            Me.lstbox1.AddItem
            For j = 1 To 9
                Me.lstbox1.List(Me.lstbox1.ListCount - 1, j - 1) = arrData(i, j)
            Next j
        End If
    Next i
End Sub

3. 组合框选择变化时触发筛选

在cmbFilter的Change事件中调用加载过程,实现选择筛选条件后实时更新列表框:

Private Sub cmbFilter_Change()
    If Me.cmbFilter.ListIndex = -1 Then Exit Sub ' 无选中项时退出
    LoadListBoxData Me.cmbFilter.Value
End Sub

补充说明

  • 原代码使用RowSource加载数据,筛选场景下灵活性不足,改用数组遍历的方式可更精准地过滤数据。
  • 表头通过临时绑定RowSource获取,避免手动输入表头内容,保证与工作表表头同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:50:19