05.12.2022, 18:31
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.
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ß
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
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner