如何基于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
相关产品推荐
相关产品推荐

