Clever-Excel-Forum

Normale Version: [LAMBDA] TEXTTEILEN.2D in klassischem Kleid
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
TEXTTEILEN.2D beziehtSichAuf

=LAMBDA(x;[tt];[nn];LET(
t;WENN(WURDEAUSGELASSEN(tt);" ";tt);
n;WENN(WURDEAUSGELASSEN(nn);MAX(1+LÄNGE(x)-LÄNGE(WECHSELN(x;t;)));nn);
f;LAMBDA(x;n;o;FINDEN("#";WECHSELN(t&x&"#";t;"#";SEQUENZ(;n)+o)));
TEIL(x;f(x;n;0);f(x;n;1)-f(x;n;0))))


findet sich in 
office-hilfe.com/support/threads/string-oder-csv-mit-trennzeichen-per-formel-auf-zellen-aufteilen.22254/
und zwar nach der dort erklärten GLÄWEXWDH- als unbegrenzte FINDEN-Variante.

=TEXTTEILEN.2D(A1:A9) teilt den Bereich spaltenweise mit " " als Trenner auf, und zwar mit der Anzahl der maximalen Trenner in einer Zelle des Bereichs.

=TEXTTEILEN.2D(A1:A9;;3) tut dies nur für die ersten 3 "Felder".

=TEXTTEILEN.2D(A1:A9;"-") nimmt als Trenner den Strich.

=TEXTTEILEN.2D(A1:A9;"-";2) nimmt als Trenner den Strich und gibt die ersten beiden Felder zurück.

Man könnte die Funktion außer dem impliziten Wiedergeben vom Anfang her auch noch um das vom Ende her oder irgendwo in der Mitte erweitern.

Das Thema wurde schon in clever-excel-forum.de/Thread-Beschraenkte-Spillfaehigkeit-neuer-Funktionen behandelt, aber man findet diese doch wichtige Funktion dort nicht so schnell wieder. Daher hier jetzt mit eigenem Beitrag.
Die Rückgabe einer festen Anzahl Einträge von rechts - auch bei "unterschiedlich langen Datensätzen" (also Strings mit variabler Anzahl Trenner) - klappt dann wie folgt:

TEXTTEILEN.2D beziehtSichAuf

=LAMBDA(xx;[tt];[nn];LET(
t;WENN(WURDEAUSGELASSEN(tt);" ";tt);
m;1+LÄNGE(xx)-LÄNGE(WECHSELN(xx;t;));
k;MAX(m);
n;WENN(WURDEAUSGELASSEN(nn)+(nn<1);k;nn);
x;WENN(nn<0;WIEDERHOLEN(t;k-m);"")&xx;
f;LAMBDA(x;n;o;FINDEN("#";WECHSELN(t&x&"#";t;"#";SEQUENZ(;n)+o)));
u;TEIL(x;f(x;n;0);f(x;n;1)-f(x;n;0));
WENN(nn<0;WEGLASSEN(u;;k+nn);u)))


=TEXTTEILEN.2D(A1:A3;;-4) ergibt die 4 letzten "Felder"; aus den 3 Strings

1 2 3 4 5 6
1 2 3 4
1 2 3 4 5

wird also zurückgegeben in eigenen Spalten (bzw. Zellen):

3 4 5 6
1 2 3 4
2 3 4 5

Die drei fetten Stellen zeigen einen unterschiedlichen Weg des Codes. Das ist unbefriedigend, da von der Logik her fehlerträchtig (schlimmer Spaghetticode). Vielleicht bekomme ich das irgendwie noch sauberer hin. Es wird dann aber wohl auch länger.

Wie schon in #1 trennen 2 Trenner hintereinander auch hier beabsichtigt 2mal, also mit einem Leereintrag. Will man das vermeiden, muss man statt A1:A9 halt GLÄTTEN(A1:A9) oder die bei einem anderen Trenner gegebene Maßnahme verwenden.

Mit der Zählung der Felder nun auch von rechts (mit dem "Minus-nn") ist die schwierigste Behandlung erledigt. Den Rest kann man mit WEGLASSEN und/oder SPALTENWAHL um die Funktion herum erledigen:

=WEGLASSEN(TEXTTEILEN.2D(A1:A9;;-2);;-1) ergibt das vorletzte "Feld".
=SPALTENWAHL(TEXTTEILEN.2D(A1:A9;;-2);1) ergibt ebenfalls das vorletzte "Feld".
Elex hat herausgefunden, dass TEXTTEILEN auch 2D funktioniert, wenn man es mit TEXTVOR und/oder TEXTNACH kombiniert. Damit sind meine langen Formeln vermutlich hinfällig.

clever-excel-forum.de/Thread-VBA-Split-Arrays-nach-VLOOKUP-Fkt-sortieren
Ich habe es jetzt auch mit TEXTVOR und TEXTNACH realisiert. Der Trenner darf mehr als ein Zeichen haben.

=LAMBDA(x;t;LET(y;t&x&t;m;LÄNGE(t);
n;MAX(NACHZEILE(y;LAMBDA(a;(LÄNGE(a)-LÄNGE(WECHSELN(a;t;))-m)/m)));
WENNFEHLER(TEXTNACH(TEXTVOR(y;t;SEQUENZ(;n;2));t;SEQUENZ(;n;1));"")))


Die Rechtsbündigkeit ist jetzt genauso wie eine beschränkte Anzahl der Spalten nicht enthalten.