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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:18:00