web-dev-qa-db-de.com

Zählen Sie eindeutige Werte in Excel

Ich muss in Excel eindeutige Werte im Bereich (C2: C2080) zählen. Googled-Formel:

=SUM(IF(FREQUENCY(MATCH(C2:C2080;C2:C2080;0);MATCH(C2:C280;C2:C2080;0))>0;1)) 

falschen Wert zurückgeben.

UPD: Lame Lösung: 

Sub CountUnique()

Dim i, count, j As Integer

count = 1
For i = 1 To 470
    flag = False
    If count > 1 Then
        For j = 1 To count
            If Sheet1.Cells(i, 3).Value = Sheet1.Cells(j, 11).Value Then
                flag = True
            End If
        Next j
    Else
        flag = False
    End If

    If flag = False Then
        Sheet1.Cells(count, 11).Value = Sheet1.Cells(i, 3).Value
        count = count + 1
    End If

Next i

Sheet1.Cells(1, 15).Value = count

End Sub
11
dayan

=SUM(IF(FREQUENCY(IF(LEN(A2:A10)>0,MATCH(A2:A10,A2:A10,0),""), IF(LEN(A2:A10)>0,MATCH(A2:A10,A2:A10,0),""))>0,1)) 

http://office.Microsoft.com/de-de/Excel/HP030561181033.aspx

Sie können auch ein VBA-Makro schreiben (Sie sind sich nicht sicher, ob Sie danach suchen.)

Etwas zur Wirkung von (bei einer Tabellenkalkulation mit A1-A11 gefüllt und B1-B11 leer):

Sub CountUnique()

Dim count As Integer
Dim i, c, j As Integer

c = 0
count = 0
For i = 1 To 11
    Sheet1.Cells(i, 2).Value = Sheet1.Cells(i, 1).Value
    c = c + 1
    For j = 1 To c
        If CDbl(Sheet1.Cells(i, 1).Value) = CDbl(Sheet1.Cells(j, 2).Value) Then
            c = c - 1
            Exit For
        End If
    Next j
Next i

' c now equals the unique item count put in the 12'th row
Sheet1.Cells(12, 1).Value = c

End Sub
8
user113476

Hier ist eine VBA-Funktion, die für mich funktioniert.

Sie können es als Arbeitsblattfunktion verwenden und auf einen beliebigen Bereich verweisen, z. B. "= CountUnique (N8: O9)".

Es behandelt Text- und numerische Werte und behandelt leere Zellen als einen Wert

Es ist nicht erforderlich, mit Array-Funktionen umzugehen.

Es erfordert einen Verweis auf die Microsoft Scripting Library für das dictionary-Objekt .

    Public Function CountUnique(rng As Range) As Integer
        Dim dict As Dictionary
        Dim cell As Range
        Set dict = New Dictionary
        For Each cell In rng.Cells
             If Not dict.Exists(cell.Value) Then
                dict.Add cell.Value, 0
            End If
        Next
        CountUnique = dict.Count
    End Function
23
JustinG

Versuchen:

=SUM(IF(FREQUENCY(C2:C2080,C2:C2080)>0,1))

EDIT: Die obigen werden leere Einträge in der Spalte behandeln

7
Jacob

Die Funktion von JustinG funktioniert sehr gut (und schnell), bis die Anzahl der eindeutigen Elemente 32.767 überschreitet, was auf eine Art Grenze in Excel zurückzuführen ist. 

Ich habe festgestellt, wenn Sie seinen Code ändern

Public Function CountUnique(rng As Range) As Integer

und mach es als ...

Public Function CountUnique(rng As Range) As Long

Es werden dann mehr einzigartige Elemente verarbeitet.

6
Jim D

Für jeden, der weiterhin versucht, die Wörterbuchmethode von @ JustinG zu verwenden, müssen Sie den Code leicht ändern, wenn Sie eine neuere Version von VBA verwenden. 

Sie müssen auf "Microsoft Scripting Runtime" verweisen und den Dictionary-Begriffen mit Scripting wie folgt vorgehen:

Public Function CountUnique(rng As Range) As Long
    Dim dict As Scripting.Dictionary
    Dim cell As Range
    Set dict = New Scripting.Dictionary
    For Each cell In rng.Cells
         If Not dict.Exists(cell.Value) Then
            dict.Add cell.Value, 0
        End If
    Next
    CountUnique = dict.Count
End Function
4
Jordan

Sie können auch einfach einen Filter verwenden, um vorübergehend eindeutige Werte anzuzeigen und die gefilterten Werte zu zählen.

3
Mathias

Dies ist möglicherweise eine effizientere Methode, um mit einer großen Anzahl von Zeilen umzugehen. Dabei wird der eingebaute AdvancedFilter-Befehl verwendet, anstatt die einzelnen Zellen nacheinander zu durchlaufen.

Public Function UniqueValues(oRange As Range) As Variant

' Uses the built-in AdvancedFilter Excel command to return the unique values onto the Worksheet
' and then populate and retuns an array of unique values

' Note:  The index:0 element in the returned array will be the header row.
'        You can ignore this element unless the first row in your oRange is a unique value
'        in which case the header will be that value.

Dim oTarget As Range
Dim r As Long, numrows As Long
Dim vs1, vs2 As Variant

' Get the first unused cell on the first row where the unique vaues will be temporarily populated
   Set oTarget = oRange.SpecialCells(xlLastCell) ' the last cell on the worksheet
   Set oTarget = oTarget.Parent.Cells(1, oTarget.Column + 1) ' the first unused cell on the first row

' Copy the unique values from your oRange to the first unused cell on row 1
   oRange.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=oTarget, Unique:=True

' Get the number of rows including the first row which is the header
   numrows = WorksheetFunction.CountA(oTarget.EntireColumn)

' create an 2-dim array of the rows
   vs1 = oTarget.Resize(numrows)

' Prepare a second 1-dim array for the result
   ReDim vs2(numrows)

' Transfer the 2-dim array into the 1-dim array
   For r = 1 To UBound(vs1, 1)
      vs2(r - 1) = vs1(r, 1)
   Next

' Return the 1-dim array as the function result
   UniqueValues = vs2

' Clean up the extra column on the worksheet
   oTarget.EntireColumn.Delete

End Function
1
Neil

Siehe https://excelchamps.com/blog/count-unique-values-Excel/ . Es gibt Ihre Antwort.

Die Formel, die Sie eingeben müssen, lautet:

=SUMPRODUCT(1/COUNTIF(C2:C2080,C2:C2080))

Wenn Sie diese Formel als Array eingeben, sieht das ungefähr so ​​aus:

{=SUMPRODUCT(1/COUNTIF(C2:C2080,C2:C2080))}

Nachdem ich das durchgelesen und dann weiter untersucht habe, habe ich einen, der besser für mich ist als alles, was ich hier sehe:

Array-Eingabe:
(Strg + Shift + Enter, ohne geschweifte Klammern)

{=SUM(IFERROR(1/COUNTIF(C2:C2080,C2:C2080),0))}

Oder in VBA:

MyResult = MyWorksheetObj.Evaluate("=SUM(IFERROR(1/COUNTIF(C2:C2080,C2:C2080),0))")

Es funktioniert sowohl für Zahlen als auch für Text, es verarbeitet leere Zellen, Fehler in referenzierten Zellen und es funktioniert in VBA. Es ist auch eine der kompaktesten Lösungen, die ich je gesehen habe. Bei der Verwendung in VBA handelt es sich offensichtlich automatisch um die Notwendigkeit, eine Array-Formel zu sein.

Beachten Sie, dass Fehler auf diese Weise behandelt werden, indem Sie sie einfach in die Anzahl der Uniken aufnehmen. Zum Beispiel, wenn Sie zwei Zellen haben, die # DIV/0 zurückgeben! und drei Zellen, die #WERT! zurückgeben. Diese 5 Zellen würden den endgültigen Wert der eindeutigen Werte um 2 erhöhen. Wenn Sie möchten, dass Fehler vollständig ausgeschlossen werden, müssen Sie dies ändern.

In meinen Tests funktioniert dieser von Jacob oben nur für Zahlen und nicht für Text und behandelt Fehler in referenzierten Zellen nicht (gibt einen Fehler zurück, wenn eine der referenzierten Zellen einen Fehler zurückgibt):

=SUM(IF(FREQUENCY(G4:G29,G4:G29)>0,1))
1
Greg Lovern

Die Formel funktioniert für mich. Es gibt einige Dinge, die dazu führen könnten, dass dies nicht funktioniert. Erstens müssen alle Zielzellen einen Wert enthalten. Ein anderes Beispiel, bei dem dies möglicherweise nicht funktioniert, ist, wenn Sie eine Zelle mit dem Wert 31 und eine andere Zelle mit dem Textwert "31" haben. Es erkennt diese als unterschiedliche Werte.

Sie könnten dies versuchen:

=SUM(IF(FREQUENCY(IF(LEN(B2:B11)>0,MATCH(B2:B11,B2:B11,0),""), IF(LEN(B2:B11)>0,MATCH(B2:B11,B2:B11,0),""))>0,1))

Dies ist eine array - Formel. Statt zu schlagen, drücken Sie einfach die Eingabetaste, um es zu bestätigen.

Welches ist von:

http://www.cpearson.com/Excel/Duplicates.aspx

1
Dan

Eine andere Möglichkeit, dies zu tun, ist folgende:

Sub CountUnique()
    Dim Count, x, a, lastRow, Values(), StringValues
    a = ActiveCell.Column
    a = GetLetterFromNumber(a)
    lastRow = Range(a & Rows.Count).End(xlUp).row
    Count = 0
    For Each c In Range(Range(a & "1"), Range(a & Rows.Count).End(xlUp))
        If c.row = 1 Then
            ReDim Values(lastRow)
            Values(Count) = c.Value
            Count = Count + 1
        End If
        StringValues = Join(Values, "#")
        StringValues = "#" + StringValues
        If InStr(1, StringValues, c.Value) = 0 Then
            Values(Count) = c.Value
            Count = Count + 1
        End If
    Next c
    MsgBox "There are " & Count & " unique values in column " & a
End Sub

Die aktive Zelle muss sich nur in Zeile 1 der Spalte befinden, die Sie zählen.

1
Mike