删除VBAcombobox中的重复项

这是我想要做的…我有一个表中的东西大名单。 我想把所有这些(假设是名字)名称添加到VBAcombobox,但我只想要唯一的logging。 我也想对它们进行sorting。

我知道我可以做到这一点,如果我sorting和删除在Excel中的重复…但我想从VBA它而不改变Excel中的数据。

可能吗?

只添加独特的项目:

Sub addIfUnique(CB As ComboBox, value As String) If CB.ListCount = 0 Then GoTo doAdd Dim i As Integer For i = 0 To CB.ListCount - 1 If LCase(CB.List(i)) = LCase(value) Then Exit Sub Next doAdd: CB.AddItem value End Sub 

find这个代码:

 Sub SortCombo(oCb As MSForms.ComboBox) Dim vaItems As Variant Dim i As Long, j As Long Dim vTemp As Variant vaItems = oCb.List For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 For j = i + 1 To UBound(vaItems, 1) If vaItems(i, 0) > vaItems(j, 0) Then vTemp = vaItems(i, 0) vaItems(i, 0) = vaItems(j, 0) vaItems(j, 0) = vTemp End If Next j Next i oCb.Clear For i = LBound(vaItems, 1) To UBound(vaItems, 1) oCb.AddItem vaItems(i, 0) Next i End Sub 

我已经testing了代码sorting和删除重复combobox中的重复项。 在所有项目被添加之后,它在combobox列表上运行。 将项目添加到combobox可能会使用范围或文件等,下面只是一个例子。 主要部分是sortingfunction。 有一件事要记住,这两个函数的对象参数都是通过引用传递的,所以在调用的时候不要使用像这样的括号(当我做了'Object Required'错误时):

 'example of calling function below GetItemsFromRange Worksheets(1).Range("A1:A20"), MyComboBox 'Build combobox list from range Private Function GetItemsFromRange(ByRef inRange As Range, ByRef SampleBox As ComboBox) Dim currentcell As Range For Each currentcell In inRange.Cells If Not IsEmpty(currentcell.Value) Then SampleBox.AddItem (Trim(currentcell.Value)) End If Next currentcell 'call to sorting function, passing combobox by reference, 'removed brackets due to 'Object Required' error sortunique SampleBox End Function 

现在这是我们的sortingfunction。 我使用了Do-Loop语句,因为当删除重复项时,ListCount属性可能会更改值。

 Private Function sortunique(ByRef SampleBox As ComboBox) Dim temp As Object 'helper item for swaps Dim i As Long 'ascending index Dim j As Long 'descending index i = 0 'initialize i to first index in the list If SampleBox.ListCount > 1 Then 'more than one item - start traversing up the list Do If SampleBox.List(i, 0) = SampleBox.List(i + 1, 0) Then 'duplicate - remove current item SampleBox.RemoveItem (i) 'item removed - go back one index i = i - 1 ElseIf SampleBox.List(i, 0) > SampleBox.List(i + 1, 0) Then 'if next item's value is higher then the current item's temp = SampleBox.List(i, 0) 'then make a swap SampleBox.List(i, 0) = SampleBox.List(i + 1, 0) SampleBox.List(i + 1, 0) = temp 'and if index is more than 0 If i > 0 Then j = i Do 'start traversing down to check if our swapped item's value is lower or same as earlier item's If SampleBox.List(j - 1, 0) = SampleBox.List(j, 0) Then 'if duplicate found - remove it SampleBox.RemoveItem (j) 'update ascending index (it's decreased for all items above our index after deletion) i = i - 1 'and continue on the way up Exit Do ElseIf SampleBox.List(j - 1, 0) > SampleBox.List(j, 0) Then 'If item earlier in the list is higher than current temp = SampleBox.List(j, 0) 'make a swap SampleBox.List(j, 0) = SampleBox.List(j - 1, 0) SampleBox.List(j - 1, 0) = temp Else 'When no lower value is found - exit loop Exit Do End If 'update descending index j = j - 1 'continue if items still left below Loop While j > 0 End If End If 'update ascending index i = i + 1 'continue if not end of list Loop While i < SampleBox.ListCount - 1 End If End Function