从列表框中删除重复的行

时间:2015-11-22 16:48:32

标签: excel vba excel-vba listbox

创建用户表单以搜索八列工作表中包含的信息,并在列表框中显示匹配的行。列表框也显示八列数据。通过一些研究,我找到了一些链接,其中包含一些有用的信息(" http://www.mrexcel.com/forum/excel-questions/580692-how-delete-duplicates-listbox.html",但它没有产生所需的输出。这是我的工作簿中的代码:

Sub FindPastDueCustomers
    Dim i As Long, j As Long
    Dim nodupes As New Collection
    Dim Swap1, Swap2, Item

    With frm_Customers.lbox_Customers

        For i = 0 To .ListCount - 1
            ' The next statement ignores the error caused
            ' by attempting to add a duplicate key to the collection.
            ' The duplicate is not added - which is just what we want!
            On Error Resume Next
            nodupes.Add .List(i), CStr(.List(i))
        Next i

    '   Resume normal error handling
        On Error GoTo 0

        'Clear the listbox
        .Clear

        'Sort the collection (optional)
        For i = 1 To nodupes.Count - 1
            For j = i + 1 To nodupes.Count
                If nodupes(i) > nodupes(j) Then
                    Swap1 = nodupes(i)
                    Swap2 = nodupes(j)
                    nodupes.Add Swap1, before:=j
                    nodupes.Add Swap2, before:=i
                    nodupes.Remove i + 1
                    nodupes.Remove j + 1
                End If
            Next j
        Next i

    '   Add the sorted and non-duplicated items to the ListBox
        For Each Item In nodupes
            .AddItem Item
        Next Item

    End With
'   Show the UserForm
    frm_Customers.Show
End Sub

1 个答案:

答案 0 :(得分:0)

在顶部附近,你有这一行:

nodupes.Add .List(i), CStr(.List(i))

只将列表框的第一列添加到集合中。要添加八列,您需要更具体:

nodupes.Add Array(.List(i, 0), .List(i, 1), .List(i, 2), .List(i, 3), .List(i, 4), .List(i, 5), .List(i, 6), .List(i, 7)), _
            .List(i, 0) & "|" & .List(i, 1) & "|" & .List(i, 2) & "|" & .List(i, 3) & "|" & .List(i, 4) & "|" & .List(i, 5) & "|" & .List(i, 6) & "|" & .List(i, 7)

区别是什么?好吧,一个集合一次接受一个项目和一个密钥。因此,上述更改的作用是将所有当前行的(i)列值嵌入到数组中,并将该数组作为项添加到集合中。同时,通过使用管道符号连接所有值来生成该项目的键。

举一个简单的例子,想象一下另一种情况,其中列表框只有三列,其中一行有这些值:abc。添加到集合将"字面意思"看起来像这样:

nodupes.Add Array("a", "b", "c"), "a|b|c"

希望在将每一行添加到集合时,可以更容易地看到发生了什么。