将唯一项添加到Excel-VBA中的列表框

时间:2015-05-05 09:19:13

标签: excel vba excel-vba

我正在为一个包含表中列出的大量数据的文件编写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

当我运行上面的代码时,我没有收到任何错误提示,但是尽管数据表中有数据,但列表框仍未填充。

会喜欢这方面的一些智慧。

非常感谢,如果已在其他帖子中提出问题,那就很抱歉。

3 个答案:

答案 0 :(得分:0)

您的代码中存在一些逻辑错误。

  1. 列表循环中的If语句是不够的,因为它会为每个不同的项添加项,这没有任何意义。为了处理它,我添加了一个布尔变量来声明至少有一个项目是相同的doAdd = False,因此不应该添加该项目。
  2. 如果您的列表开头为空,请BudgetEdit.SelectedYear.ListCount = 0。第二个循环运行一次,BudgetEdit.SelectedYear.List(j)为空。只能使用IsNull()函数将null语句计算为布尔语句,因此必须避免布尔If语句中的空值。
  3. 您的第二个循环设置为运行For j = 0 To BudgetEdit.SelectedYear.ListCount这是一个不正确的计数。你需要把它BudgetEdit.SelectedYear.ListCount - 1。这也将避免空方案。
  4. 你需要做这样的事情:

    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