创建用户表单以搜索八列工作表中包含的信息,并在列表框中显示匹配的行。列表框也显示八列数据。通过一些研究,我找到了一些链接,其中包含一些有用的信息(" 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
答案 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)列值嵌入到数组中,并将该数组作为项添加到集合中。同时,通过使用管道符号连接所有值来生成该项目的键。
举一个简单的例子,想象一下另一种情况,其中列表框只有三列,其中一行有这些值:a
,b
,c
。添加到集合将"字面意思"看起来像这样:
nodupes.Add Array("a", "b", "c"), "a|b|c"
希望在将每一行添加到集合时,可以更容易地看到发生了什么。