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
=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
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
Versuchen:
=SUM(IF(FREQUENCY(C2:C2080,C2:C2080)>0,1))
EDIT: Die obigen werden leere Einträge in der Spalte behandeln
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.
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
Sie können auch einfach einen Filter verwenden, um vorübergehend eindeutige Werte anzuzeigen und die gefilterten Werte zu zählen.
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
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))
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:
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.