我目前正在为一个文件编写VBA代码,该文件包含表中列出的大量数据,其中一些数据是重复的。
我想在用户表单中填充一个列表框,这样我就只得到唯一的数据值。
下面是我编写的代码:
'Year listbox population
With ThisWorkbook.Worksheets("Data")
LastNonEmptyRow = .Range("C1").End(xlDown).Row
For i = 2 To LastNonEmptyRow
For j = 0 To BudgetEdit.SelectedYear.ListCount
If .Cells(i, 3) <> BudgetEdit.SelectedYear.List(j) Then BudgetEdit.SelectedYear.AddItem .Cells(i, 3)
Next
Next
End With
当我运行上面的代码时,我没有得到任何错误提示,但是列表框没有被填充,尽管数据表中有数据。
会喜欢一些智慧在这上面。
谢谢,如果这个问题已经在另一篇文章中被问到了,我很抱歉。
4条答案
按热度按时间pkmbmrz71#
您的代码中有一些逻辑错误。
If
语句是不够的,因为它会为每个不同的项添加一个项,这没有任何意义。为了处理它,我添加了一个布尔变量来声明至少有一个项是相同的doAdd = False
,因此不应该添加该项。1.如果列表一开始为空,则
BudgetEdit.SelectedYear.ListCount = 0
。第二个循环运行一次,BudgetEdit.SelectedYear.List(j)
为null。null语句不能计算为布尔语句,只能使用IsNull()
函数,因此必须避免在布尔If
语句中使用null。1.您的第二个循环被设置为运行
For j = 0 To BudgetEdit.SelectedYear.ListCount
,这是一个不正确的计数。您需要将其设置为BudgetEdit.SelectedYear.ListCount - 1
。这样也可以避免空的情况。你需要这样做:
vhmi4jdf2#
@depatinkin
我发现了另一个使用集合的解决方案,效果很好:
谢谢你的帮助。
sxissh063#
以下方法使用字典和变量数组(而不是范围)来计算速度:
llew8vvj4#
似乎我找到了整洁的解决方案(忘了来源):
你可以这样调用它: