Excel VBA - 用于填充不添加重复项的ComboBox的循环

时间:2014-10-28 08:56:03

标签: excel vba excel-vba

我使用循环在userform上填充ComboBox,它会添加所有"名称"在表的第一列中,具有相同的"类型"在第二栏。

我不想详细说明,但它可能是相同的" name"多次发生。我不希望循环添加那些重复的值。

我在其他论坛上找到了一些解决方案,但那些看起来非常过时,我觉得这应该很容易解决。 (这些"过时的"解决方案就像30多个句子代码,我不觉得我需要它)

有人可以帮我进一步解决这个问题吗?

这是填充循环:

With resourceSheet.ListObjects("Table3")
    For x = 2 To .ListRows.Count + 1
        If .Range(x, 2) = cType Then

            'cbname is the combobox
            cbName.AddItem .Range(x, 1)

        End If
    Next x
End With

2 个答案:

答案 0 :(得分:3)

试试这个:

' Create Dictionary object
Dim obj As Object
Set obj = CreateObject("Scripting.Dictionary")

With resourceSheet.ListObjects("Table3")
    For x = 2 To .ListRows.Count + 1
        If .Range(x, 2) = cType Then

        ' If name doesn't exist in the Dictionary object yet, add the name to the listbox and the Dictionary object
            If IsEmpty(obj.Item(.Range(x, 1) & "")) Then

                'cbname is the combobox
                cbName.AddItem .Range(x, 1)
                obj.Item(.Range(x, 1) & "") = .Range(x, 1)
            End If

        End If
    Next x
End With

字典对象允许您将名称用作键。如果密钥不存在,则将名称添加到列表框并添加密钥。下次遇到相同的名称时,该密钥已经存在,因此它可以移动到下一行。

答案 1 :(得分:3)

  

这些"过时"解决方案就像30多个句子代码,我不觉得我需要那个

虽然您已经有了答案,但这是另一个使用集合的选项

Sub Sample()
    Dim Col As New Collection, itm As Variant

    With resourceSheet.ListObjects("Table3")
        For x = 2 To .ListRows.Count + 1
            If .Range(x, 2) = cType Then
                On Error Resume Next
                Col.Add .Range(x, 2).Value, CStr(.Range(x, 2).Value)
                On Error GoTo 0
            End If
        Next x
    End With

    For Each itm In Col
        cbName.AddItem itm
    Next
End Sub