Clever-Excel-Forum

Normale Version: [Lambda] ARRAY.SPLIT und ARRAY.SPLIT.BYPOS
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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ß
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;...;
    ...))
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