Wie kann ich eindeutige, durch Kommas getrennte Namen in mehreren Zellen zählen?

Wie kann ich eindeutige, durch Kommas getrennte Namen in mehreren Zellen zählen?

Ich bin neu bei VBA. Ich möchte eindeutige Namen, getrennt durch Komma und Leerzeichen, in dem Bereich zählen, den ich von derselben Website als UDF erhalten habe, aber es wird nur eine Zelle betrachtet.

Function ListCount(list As String, delimiter As String) As Long
Dim arr As Variant
arr = Split(list, delimiter)
ListCount = UBound(arr) - LBound(arr) + 1
End Function

Function RemoveDuplicates(list As String, delimiter As String) As String
Dim arrSplit As Variant, i As Long, tmpDict As New Dictionary, tmpOutput As String
arrSplit = Split(list, delimiter)
For i = LBound(arrSplit) To UBound(arrSplit)
    If Not tmpDict.Exists(arrSplit(i)) Then
        tmpDict.Add arrSplit(i), arrSplit(i)
        tmpOutput = tmpOutput & arrSplit(i) & delimiter
    End If
Next i
If tmpOutput <> "" Then tmpOutput = Left(tmpOutput, Len(tmpOutput) - Len(delimiter))
RemoveDuplicates = tmpOutput
'housekeeping
Set tmpDict = New Dictionary
End Function

kann jemand den Zellbereich ändern? Danke, Rao

Antwort1

Diese Formel ersetzt auch das gesamte VBA:

=SUMPRODUCT(--(ISERROR(FIND(TRIM(MID(SUBSTITUTE(TEXTJOIN(",",TRUE,A:A),",",REPT(" ",999)),(ROW(1:100)-1)*999+1,999)),MID(SUBSTITUTE(TEXTJOIN(",",TRUE,A:A),",",REPT(" ",999)),1,(ROW(1:100)-1)*999)))))

Bildbeschreibung hier eingeben


TEXTJOIN wurde in Office 365 Excel eingeführt. Wenn Sie es nicht haben, verwenden Sie diesen Code, der die Funktion nachahmt:

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0

    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function

Antwort2

Für einEinzelzelle, verwenden:

=listcount(removeduplicates(A1,","),",")

Bildbeschreibung hier eingeben

Fürmehrere Zellenverwenden:

=listcount(removeduplicates(TEXTJOIN(",",TRUE,A1:A2),","),",")

Bildbeschreibung hier eingeben

Wenn Ihre Excel-Version dies nicht unterstützt TEXTJOIN(), erstellen Sie Ihren eigenen Code.

verwandte Informationen