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] ARRAY.SPLIT und ARRAY.SPLIT.BYPOS
#1
Moin,

zwei neue Funktion von mir: ARRAY.SPLIT und ARRAY.SPLIT.BYPOS.

Code:
ARRAY.SPLIT=LAMBDA(Array;Separator;Default;
LET(D;WENN(ISTLEER(Default);"";INDEX(Default;1;1));
    S;WENN(ISTLEER(Separator);" ";INDEX(Separator;1;1));
    A;S&INDEX(Array;0;1);
    C;MAX(LÄNGE(A)-LÄNGE(WECHSELN(A;S;"")));
    P;SEQUENZ(ZEILEN(A);C);
    M;INDEX(A;AUFRUNDEN(INDEX(P;0;0)/C;0);1);
    T;ZEICHEN(1)&SEQUENZ(1;C)&ZEICHEN(1);
    V;WECHSELN(M;S;T;SEQUENZ(1;C))&S;
    X;WENNFEHLER(LÄNGE(INDEX(T;1;SEQUENZ(1;C)))+
      FINDEN(INDEX(T;1;SEQUENZ(1;C));V);0);
    Y;WENN(X>0;WENNFEHLER(FINDEN(S;V;X)-1;0);0);
      WENN(Y>0;TEIL(V;X;Y-X+1);D)))

Code:
ARRAY.SPLIT.BYPOS=LAMBDA(Array;Positions;Default;
LET(D;WENN(ISTLEER(Default);"";INDEX(Default;1;1));
    S;WENN(SPALTEN(Positions)>1;MTRANS(INDEX(Positions;1;0));Positions);
    F;SORTIEREN(EINDEUTIG(FILTER(S;ISTZAHL(S)*(S>1))));
    A;INDEX(Array;0;1);
    L;MAX(LÄNGE(A))+1;
    C;ZEILEN(F)+1;
    P;SEQUENZ(ZEILEN(A);C);
    M;INDEX(A;AUFRUNDEN(INDEX(P;0;0)/C;0);1);
    X;SEQUENZ(1;C;0);
    Y;SEQUENZ(1;C;1);
    U;WENN(X>0;INDEX(F;X;0);1);
    V;WENN(Y>C-1;L;INDEX(F;Y;0));
      WENN(LÄNGE(M)>U;TEIL(M;U;V-U);D)))

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
#2
Sehr schön Deine Doku in Form der Wiederholung der Funktion mit normaler Sprache!

Da die meisten LAMBDAs auch LET verwenden, erspare ich mir das Einrücken des dort getätigten Hauptcodes. LAMBDA ist weder schleifen- noch bedingungs-erklärbedürftig, wie andere Sprachen, da das Fortkommen im Code über vorwärts-prozedurale Zwischenschritte abläuft (was ja auf der anderen Seite auch eine Einschränkung ist). 

Daher kann einfach immer bei Spaltenzeichen 1 begonnen werden, ohne dass die Verständlichkeit leidet.

Also möglich:

=LAMBDA(a;b;c;LET(
d;...;
e;...;
...))


statt

=LAMBDA(a;b;c;
LET(
    d;...;
    e;...;
    ...))
Antworten Top
#3
Die beiden ARRAY.SPLIT's sind wertvoll, gerade im Kontext mit dynamischen Funktionen. Die XMLFILTERN-Krücke kann das nämlich nicht mit Arrays.

Das fest eingebaute Funktions-Gegenstück TEXTJOIN leider auch nicht, da das Array (wie auch bei SUMME oder MAX) nur innen eingeht, nicht aber die Erstreckungsrichtung der Funktion dynamisch mit begleiten kann, weil man Excel das nicht sagen kann.

Man müsste also alle diese Funktionen noch mit der Arbeitsweise ausstatten, dass z.B.

=SUM.V(A1:C9;) quer summiert und über 9 Zeilen dynamisch die SUMME(Spalten) ausfüllt
=SUM.V(A1:C9;1) hochkant summiert und über 3 Spalten dynamisch die SUMME(Zeilen) ausfüllt

Dann müsste man z.B. nicht mehr =WENN(A1:A9>B1:B9;A1:A9;B1:B9) nehmen, sondern könnte verwenden:

=MAX.V(A1:B9;). Und es fällt ganz automatisch erstmals auch ein MAX-MIN-Vergleich von mehr als 2 Werten dabei ab, der mit WENN nie ging:
=MAX.V(A1:C9;)

Das gilt dann genauso für TEXTJOIN.V() und viele weitere, auch LARGE.V() (KGRÖSSTE) oder sogar COUNTIF.V().

Alles für das hehre Ziel, dass solche Auswertungen ebenfalls ihrerseits dynamische Bezüge werden.

.V steht dabei für .VECTOR

Noch weiter aufbohren könnte man es mit =SUM.A(A1:C9;4;5), aber der Bedarf, die Summe(9x3-Zellen) über 4 Zeilen und 5 Spalten zu führen, bedeutet einen rechnerischen und/oder logischen Zirkel, wenn das nicht z.B. über Rekursion geführt wird.

.A steht dabei für .ARRAY
Antworten Top


Gehe zu:


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