我正在为一个包含表中列出的大量数据的文件编写VBA代码,其中一些数据正在重复。
我想在userform中填充一个列表框,这样我才能获得唯一的数据值。
以下是我为此编写的代码:
'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
当我运行上面的代码时,我没有收到任何错误提示,但是尽管数据表中有数据,但列表框仍未填充。
会喜欢这方面的一些智慧。
非常感谢,如果已在其他帖子中提出问题,那就很抱歉。
答案 0 :(得分:0)
您的代码中存在一些逻辑错误。
If
语句是不够的,因为它会为每个不同的项添加项,这没有任何意义。为了处理它,我添加了一个布尔变量来声明至少有一个项目是相同的doAdd = False
,因此不应该添加该项目。 BudgetEdit.SelectedYear.ListCount = 0
。第二个循环运行一次,BudgetEdit.SelectedYear.List(j)
为空。只能使用IsNull()
函数将null语句计算为布尔语句,因此必须避免布尔If
语句中的空值。For j = 0 To BudgetEdit.SelectedYear.ListCount
这是一个不正确的计数。你需要把它BudgetEdit.SelectedYear.ListCount - 1
。这也将避免空方案。你需要做这样的事情:
Dim doAdd As Boolean
For i = 2 To LastNonEmptyRow
doAdd = True
For j = 0 To BudgetEdit.SelectedYear.ListCount - 1
If .Cells(i, 3) = BudgetEdit.SelectedYear.List(j) Then
doAdd = False
Exit For
End If
Next
If doAdd Then BudgetEdit.SelectedYear.AddItem .Cells(i, 3)
Next
答案 1 :(得分:0)
@depatinkin
我找到了另一个使用集合的解决方案,效果很好:
Dim i, LastNonEmptyRow as integer
Dim Cell As Range
Dim Unique As New Collection
Dim Item As Range
LastNonEmptyRow = ThisWorkbook.Worksheets("Data").Range("B1").End(xlDown).Row
On Error Resume Next
For Each Cell In ThisWorkbook.Worksheets("Data").Range("B2:B" & LastNonEmptyRow)
Unique.Add Cell, Cstr(Cell)
NextCell
On Error GoTo 0
For Each Item In Unique
.SelectedDate.AddItem Item
Next Item
感谢您的帮助。
答案 2 :(得分:0)
下面的方法使用Dictionary和Variant arry(而不是范围)来获得速度:
D:\blinky\pca10028\blank\armgcc>make
rm -rf _build
makefile
mkdir _build
Compiling file: Main.c
Linking target: nrf51422_xxac.out
arm-none-eabi-gcc.exe: error: _build/system_nrf51.o: No such file or directory
arm-none-eabi-gcc.exe: error: _build/nrf_delay.o: No such file or directory
arm-none-eabi-gcc.exe: error: _build/gcc_startup_nrf51.o: No such file or directory
make: *** [nrf51422_xxac] Error 1