Próbuję utworzyć listę listową z 2 kolumnami (1 kolumna z nazwami i innym z krajami) i używam obiektu słownika, aby usunąć duplikaty.

Mój kod działa, ale tylko dla 1 kolumny, może ktoś wie, jak mogę mieć razem 2 kolumny?

Private Sub UserForm_Initialize()

Dim Dict As Object
Dim Key As Variant
Dim LastRow As Long
Dim C As Range
Dim ws As Worksheet


Set ws = Sheets("Details")

With Sheets("Details")

    Set Dict = CreateObject("Scripting.Dictionary")
    For Each C In data.Range("P2:P" & ws.Range("P" & ws.Rows.Count).End(xlUp).Row)
        If C.Value <> "" Then ' <-- skip empty cells
            If Not Dict.exists(C.Value) Then
                Dict.Add C.Value, 1
            End If
        End If
    Next C
End With

' loop through all unique keys, and add them to the listbox
For Each Key In Dict.Keys
    List_Bene.AddItem Key

Next Key

End Sub

Data for the ListBox

0
Fah 23 lipiec 2020, 14:45

1 odpowiedź

Najlepsza odpowiedź

Conatenate wartości razem, proponuję korzystać z ogranicznika na wypadek, gdybyś musiał podzielić je ponownie później. Użyję rury (|) tutaj, jak to jest mało prawdopodobne, aby był obecny w tekście.

With Sheets("Details")
    dim keystr as string
    Set Dict = CreateObject("Scripting.Dictionary")
    For Each C In data.Range("P2:P" & ws.Range("P" & ws.Rows.Count).End(xlUp).Row)
        If C.Value <> "" Then ' <-- skip empty cells
            keystr = c.value & "|" & c.offset(0, 3).value
            If Not Dict.exists(keystr) Then
                Dict.Add keystr, 1
            End If
        End If
    Next C
End With

Jeśli musisz podzielić później:

For Each Key In Dict.Keys
    List_Bene.AddItem split(Key, "|")(0) & " " & split(Key, "|")(1)
Next Key

Jeśli używasz dwóch kolumn w polu listy:

With Me.List_Bene
Dim i As Long
i = 0
For Each Key In Dict.Keys
    List_Bene.AddItem
    .List(i, 0) = Split(Key, "|")(0)
    .List(i, 1) = Split(Key, "|")(1)
    i = i + 1
Next Key
End With
End Sub
1
Warcupine 23 lipiec 2020, 12:58