如何将应用AutoFilter后的可见单元格内容赋值给Listbox?
自动筛选可见单元格填充ListBox解决方案
你原代码的核心错误有两点:
- 自动筛选后的可见单元格是离散多区域结构,
SpecialCells(xlCellTypeVisible)返回的Range包含多个子区域,你原来遍历单个单元格的嵌套循环逻辑错误,会导致同一个单元格的值被重复填充到整行数组,最终所有行数据异常 - 原代码中
Cells没有带工作表限定符,当活动工作表不是Sheet1时会读取错误的行/列边界
修正后可直接运行的代码
With Worksheets("Sheet1") ' 读取数据源边界 LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column ' 统计可见行数量 Dim nRow As Long nRow = Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & LastRow)) ' 无可见行时清空列表框直接退出 If nRow = 0 Then UserForm1.ListBox2.Clear Exit Sub End If ' 初始化存储数据的数组 Dim arr1() As Variant ReDim arr1(1 To nRow, 1 To lastCol) Dim currentRow As Long: currentRow = 1 ' 逐行判断是否可见,可见行数据写入数组 Dim i As Long, j As Long For i = 2 To LastRow If Not .Rows(i).Hidden Then For j = 1 To lastCol arr1(currentRow, j) = .Cells(i, j).Value Next j currentRow = currentRow + 1 End If Next i ' 配置列表框并填充数据 UserForm1.ListBox2.ColumnCount = lastCol UserForm1.ListBox2.List = arr1 End With
代码说明
- 采用逐行判断隐藏状态的逻辑,避免处理离散多区域的复杂逻辑,兼容性更高
- 增加空可见行的异常处理,避免空数组赋值报错
- 自动配置列表框列数,无需手动在属性窗口提前设置也可以正常显示多列内容
内容的提问来源于stack exchange,提问作者Tou Mou
相关产品推荐
相关产品推荐

