VBA中用变量定义ListBox列表范围时出现1004错误求助
VBA ListBox加载过滤数据时1004错误的解决方法
你遇到的1004错误,核心原因是错误拼接了Range范围字符串——直接写Range("B3:LastRow")时,Excel会把LastRow当成字符串的一部分,而非你定义的变量,自然找不到合法的单元格区域。之前把LastRow存为Address或Range对象的写法,也没解决字符串拼接的本质问题。
修正方案
正确获取最后一行行号
别用End(xlDown)(遇到空行就会中断),改用Cells(Rows.Count, "B").End(xlUp).Row获取B列真正的最后一行行号,定义为Long类型,方便后续拼接范围。合法拼接Range范围
把范围写成Range("B3:B" & LastRow),这样变量LastRow的数值会被正确代入,生成合法的单元格区域。处理过滤后的不连续可见区域
过滤后的可见单元格可能是多个不连续区域,直接赋值给ListBox会报错,需要转成一维数组后再赋值。
修正后的完整代码
Sub Vehicle_Catergory() Dim LastRow As Long ' 获取B列真正的最后一行行号(规避空行干扰) LastRow = Sheets("Vehicle_Data").Cells(Sheets("Vehicle_Data").Rows.Count, "B").End(xlUp).Row Sheets("marine Vehicle Selection").ListBox_Vehicle_selection.Clear ' 设置过滤条件 Dim Criteria_1 As Range Set Criteria_1 = Sheets("Config").Range("A3") ' 执行数据过滤 With Sheets("Vehicle_data").Range("A2") .AutoFilter Field:=1, Criteria1:=Criteria_1.Value ' 用Value避免引用潜在问题 End With ' 处理过滤后的可见单元格 Dim visibleRng As Range On Error Resume Next ' 防止无匹配数据时SpecialCells报错 Set visibleRng = Sheets("Vehicle_Data").Range("B3:B" & LastRow).SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not visibleRng Is Nothing Then Dim arr As Variant ' 把多区域数据转成一维数组,适配ListBox的List属性 arr = Application.Transpose(visibleRng.Value) Sheets("marine Vehicle Selection").ListBox_Vehicle_selection.List = arr End If End Sub
额外说明
- 加入
On Error Resume Next是为了避免过滤后无匹配数据时,SpecialCells触发报错。 - 用
Criteria_1.Value而非直接引用Range对象,可规避跨工作表引用的潜在问题。 Application.Transpose用于把单元格的二维数组转成一维,符合ListBox单列数据的要求。
内容的提问来源于stack exchange,提问作者Alex Band
相关产品推荐
相关产品推荐

