Clever-Excel-Forum

Normale Version: [LAMBDA] Duplikate zählen - mit Randbedingungen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

jemand fragte in meiner Facebook-Gruppe, ob es möglich ist, Dupikate so wie im Bild zu zählen. Das Zählen soll blockweise
erfolgen, die Anzahl immer nur am Ende eines Blocks erscheinen. Im Beispiel sind nur einzelne Buchstaben als Quelldaten
aufgeführt. Das können aber auch längere Texte sein. Das Problem taucht bei mir in der Praxis durchaus ab und zu auf.

[attachment=46095]

Habe mal dazu eine LAMBDA-Funktion erstellt. Vielleicht mag das ja jemand verbessern oder eine andere Lösung finden.

PHP-Code:
=LET(Data;$A$2:$A$20;
 List;
EINDEUTIG(Data);
 
Keys;MATRIXERSTELLEN(ZEILEN(List);1;LAMBDA(X;Y;TEXT(X;WIEDERHOLEN("0";LÄNGE(ZEILEN(List))))));
 
Matrix;MAP(SCAN("";MATRIXERSTELLEN(ZEILEN(Data);1;LAMBDA(X;Y;INDEX(Keys;VERGLEICH(INDEX(Data;X;1);INDEX(List;0;1);0);1)));
  LAMBDA(V;A;A&WENN(LINKS(V;LÄNGE(ZEILEN(List)))=A;V;"")));LAMBDA(A;LÄNGE(A)/LÄNGE(ZEILEN(List))));
 
Result;MATRIXERSTELLEN(ZEILEN(Matrix);1;LAMBDA(X;Y;WENN(X<ZEILEN(Matrix);WENN(INDEX(Matrix;X;1)>INDEX(Matrix;X+1;1);INDEX(Matrix;X;1);0);
  WENN(INDEX(Matrix;X;1)>1;INDEX(Matrix;X;1);0))));Result

Kurze Erläuterung: List generiert eine eindeutige Liste aus den Quelldaten. Keys erstellt eine Liste von Schlüsseln, passend zur
eindeutigen Liste. Bei Quelldaten, die von A bis D gehen, wären das die Zahlen 1, 2, 3 und 4. Wäre die Liste länger, bspw. A bis Z,
kämen als Schlüssel raus: 01, 02, ... 26.

Matrix verschachtelt mehrere Funktionen. Zuerst wird eine Matrix erstellt, die aus den Quelldaten in Spalte A die passenden Schlüssel
per INDEX/VERGLEICH sucht. SCAN geht dann hin und hängt jeden Vorwert aus der Matrix an den aktuellen Wert dran und prüft dabei,
ob der erste Schlüssel aus dem Vorwert dem aktuellen entspricht. Wenn man das beispielsweise direkt mit den Quelldaten in Spalte A
machen würde, käme raus: A, AA, B, C, D, DD, DDD, DDDD, usw.

Mit der Funktion MAP wird aus der durch SCAN entstandenen Matrix pro Zeile die Länge ermittelt. Dann verbleibt nur noch zu prüfen,
ob die jeweilige Länge größer 1 ist und ob der Nachfolger kleiner dem aktuellen Wert ist. Wenn Ja, wird der Wert übernommen,
sonst auf Null gesetzt.

Gruß

  1. Zuerst im Stil "Zusammenfassung", nicht "Original"
  2. Es werden auch die Nicht-Duplikate gezählt, damit man nachher die Gesamtanzahl mit den 19 Ausgangszeilen abstimmen kann.
  3. Ansonsten kann man die dann mit >1 wegfiltern, falls gewünscht.
=LET(a;A2:A20;
x;1-VSTAPELN(WEGLASSEN(VSTAPELN(0;WEGLASSEN(a;1)=WEGLASSEN(a;-1));1);0);
y;FILTER(HSTAPELN(a;x*SEQUENZ(ZEILEN(x)));x);
HSTAPELN(SPALTENWAHL(y;1);LET(x;VSTAPELN(0;SPALTENWAHL(y;2));WEGLASSEN(x;1)-WEGLASSEN(x;-1))))


A 2
B 1
C 1
D 7
A 1
C 1
D 1
A 2
C 1
B 2
_______________________________________________________________________
Hier nun noch die Erweiterung auf die Spalte B (Original wie bei maninweb):

=LET(
a;A2:A20;
b;SEQUENZ(ZEILEN(a));
x;1-VSTAPELN(WEGLASSEN(VSTAPELN(0;WEGLASSEN(a;1)=WEGLASSEN(a;-1));1);0);
y;FILTER(x*b;x);
u;LET(z;VSTAPELN(0;y);WEGLASSEN(z;1)-WEGLASSEN(z;-1));
WENNFEHLER(INDEX(u;XVERGLEICH(b;y));))


Die unerwünschten Werte 1 lassen sich nun noch einfach durch die erwünschten Werte 0 ersetzen:
WENNFEHLER(1-1/(1/(1-INDEX(u;XVERGLEICH(b;y))));))
(diese Zeile ersetzt die letzte Zeile der zweiten blauen Formel)
Moin,

LCohen: eine ausgesprochen elegante Lösung. Hatte zwar auch VSTAPELN im Hinterkopf,
kam da aber irgendwie nicht sonderlich weiter.

Gruß
Danke Dir! Ich brauchte im Grunde nur Teilschritte aus den Helferlein bzw. dem "Summenpivot" zu kombinieren.

Die Zeile mit doppelt VSTAPELN und dreifach WEGLASSEN ist dabei aus zwei Teilschritten zusammengeschoben.