Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

[LAMBDA] Duplikate zählen - mit Randbedingungen
#1
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.

   

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ß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
[-] Folgende(r) 1 Nutzer sagt Danke an maninweb für diesen Beitrag:
  • schauan
Antworten Top
#2

  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)
[-] Folgende(r) 1 Nutzer sagt Danke an LCohen für diesen Beitrag:
  • maninweb
Antworten Top
#3
Moin,

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

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
Antworten Top
#4
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.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste