[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
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;...;
    ...))
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
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
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Top


Gehe zu:


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