VBA Userform ListBox加载工作表P列唯一值仅显示首行问题求解
问题原因
代码存在两个核心错误导致仅能加载首个单元格数据:
- 变量拼写错误:循环遍历的单元格变量是
Cellrng,但你给Collection生成唯一键时错写为不存在的变量Cell,导致所有条目尝试添加时的键都为同一个空值/默认值。Collection要求键必须唯一,后续添加操作被On Error Resume Next静默拦截,自然只有第一个单元格内容能成功加入集合。 - 隐式变量问题:代码中的
lRow没有提前声明和赋值,如果模块顶部没有开启Option Explicit强制变量声明,该变量会被默认为0,也可能导致遍历范围不符合预期。
修复后的代码
' 建议所有模块顶部先添加Option Explicit强制变量声明,从根源避免拼写类错误 Option Explicit Sub 填充ListBox唯一值() Dim Cellrng As Range Dim Unique As New Collection Dim Item As Variant Dim lRow As Long ' 先计算P列最后一行有数据的行号 lRow = ThisWorkbook.Worksheets("START").Cells(Rows.Count, "P").End(xlUp).Row On Error Resume Next For Each Cellrng In ThisWorkbook.Worksheets("START").Range("P8:P" & lRow) ' 跳过空单元格避免添加无效内容 If Trim(Cellrng.Value) <> "" Then ' 修正变量拼写,用单元格值作为唯一键 Unique.Add Cellrng.Value, CStr(Cellrng.Value) End If Next Cellrng On Error GoTo 0 ' 每次填充前清空原有内容,避免重复累加 ListBox1.Clear For Each Item In Unique ListBox1.AddItem Item Next Item End Sub
额外调整说明
你原代码中将Item声明为Range类型,如果后续仅需要在ListBox中展示单元格的值,声明为Variant更稳妥,避免空值、文本值等场景出现类型不匹配报错。如果需要保留单元格对象引用,可以将集合添加逻辑改为Unique.Add Cellrng, CStr(Cellrng.Value),后续取值时调用Item.Value即可。
内容的提问来源于stack exchange,提问作者bensasse
相关产品推荐
相关产品推荐

