Clever-Excel-Forum

Normale Version: [LAMBDA] NACHZEILE kann anscheinend nur ein Feld
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Siehe Anhang mit INDEX, wo ich versuche, ein Teil-Array aus dem Array zur Untersummierung zu bilden. Möglicherweise klappt das dann mit SPLIT(TEXTVERKETTEN(, weil so zu einer Zeit eine einzelne Zelle entsteht ... ein nerviger Umweg. EDIT: Nein, noch umständlicher, innen mit MAP(TEXTVERKETTEN(, außen mit NACHZEILE. Mein erstes Mal mit MAP, übrigens. Einfach ohne Wissen verwendet.

Die gleiche Beobachtung war schon hier mit SORTIEREN: 
office-hilfe.com/support/threads/spalten-einer-zeile-sortieren-und-das-gleich-fuer-mehrere-zeilen.55595/

[attachment=42217]
Hallo,

richtig, das geht nicht, ein Subarray aus einem gerade behandelten Array zu extrahieren. Dafür musst Du nach meinem derzeitigen Kenntnisstand
eine Art Kopie des (Sub)Arrays anlegen - bspw. durch Neuerzeugen über SEQUENZ und Zuordnen über MAP oder MATRIXERSTELLEN.
Auf die Kopie lässt sich dann NACHZEILE anwenden. Anbei, wie ich es lösen würde:

Code:
=LET(Daten;$A$2:$A$24;Umsatz;$B$2:$B$24;
     vnDaten;INDEX(Daten;0;1);
     vnUmsatz;INDEX(Umsatz;0;1);
     vnKumulation;NACHZEILE(MAP(SEQUENZ(ZEILEN(vnDaten);3);LAMBDA(A;LET(X;AUFRUNDEN(A/3;0);Y;WENN(REST(A;3)>0;REST(A;3);3);Z;
     WOCHENTAG(INDEX(Daten;X;1);2);WENN(Z<6;WENN(Z<5;WENN(Y>1;0;INDEX(vnUmsatz;X;1));INDEX(vnUmsatz;X+Y-1;1));0))));LAMBDA(A;SUMME(A)));
     vnMatrix;MATRIXERSTELLEN(ZEILEN(vnDaten);2;LAMBDA(X;Y;WENN(Y<2;INDEX(vnDaten;X;1);INDEX(vnKumulation;X;1))));
     FILTER(vnMatrix;REST(INDEX(vnMatrix;0;1);7)>1))

Es geht auch ohne MAP:

Code:
=LET(Daten;$A$2:$A$24;Umsatz;$B$2:$B$24;
     vnDaten;INDEX(Daten;0;1);
     vnUmsatz;INDEX(Umsatz;0;1);
     vnKumulation;NACHZEILE(MATRIXERSTELLEN(ZEILEN(vnDaten);3;LAMBDA(X;Y;
     LET(Z;WOCHENTAG(INDEX(Daten;X;1);2);WENN(Z<6;WENN(Z<5;WENN(Y>1;0;INDEX(vnUmsatz;X;1));INDEX(vnUmsatz;X+Y-1;1));0))));LAMBDA(A;SUMME(A)));
     vnMatrix;MATRIXERSTELLEN(ZEILEN(vnDaten);2;LAMBDA(X;Y;WENN(Y<2;INDEX(vnDaten;X;1);INDEX(vnKumulation;X;1))));
     FILTER(vnMatrix;REST(INDEX(vnMatrix;0;1);7)>1))

Gruß
Das ist nett ... so kann man anhand des Problems auch einen fremden Code schneller verstehen.

MATRIXERSTELLEN ist im Grunde hier wie WAHL. Wo wäre wohl der Vorteil?

Übrigens hast Du den letzten Umsatz nicht gültig gefüllt. Es ist bei allen Arrays oft das Problem, dass lfd. und Vorgänger berücksichtigt werden müssen (und somit ein Eintrag wegfällt, wenn man das Array nicht um einen Eintrag verlängert).
Hallo,

hmm, den Zusammenhang mit WAHL verstehe ich nicht ganz, denn MATRIXERSTELLEN erzeugt Dir ja eine neue Matrix,
die Du eben an NACHZEILE übergeben kannst. WAHL könnte man vielleicht anstatt der WENNs nehmen. Aber sonst?

Stimmt, die vorherige Formel lieferte einen Bezugsfehler, wenn das Startdatum verändert wurde, wegen fehlender Array-Elemente.
Ich habe das mal ergänzt; durch +2 im Array. Allerdings verstehe ich die Problematik so, dass wenn am Ende noch Sa. und So.
drin sind, die wiederum auf Fr. aufaddieren zu sind (oder nicht?). Daher dann am Ende 666 statt 122.

Aktuelle Formel, besser zum Debuggen:

Code:
=LET(Daten;$A$2:$A$24;Umsatz;$B$2:$B$24;
     vnDaten;INDEX(Daten;0;1);
     vnUmsatz;INDEX(Umsatz;0;1);
     vnVerteilung;MATRIXERSTELLEN(ZEILEN(vnDaten)+2;3;LAMBDA(X;Y;LET(Z;WENNFEHLER(WOCHENTAG(INDEX(Daten;X;1);2);0);
     WENN(Z<6;WENN(Z<5;WENN(Y>1;0;WENNFEHLER(INDEX(vnUmsatz;X;1);0));WENNFEHLER(INDEX(vnUmsatz;X+Y-1;1);0));0))));
     vnKumulation;NACHZEILE(vnVerteilung;LAMBDA(A;SUMME(A)));
     vnMatrix;MATRIXERSTELLEN(ZEILEN(vnVerteilung);2;LAMBDA(X;Y;WENN(Y<2;WENNFEHLER(INDEX(vnDaten;X;1);0);INDEX(vnKumulation;X;1))));
     vnFilter;FILTER(vnMatrix;REST(INDEX(vnMatrix;0;1);7)>1);vnResult;vnFilter;vnResult)

Gruß
WAHL tut das auch (eine neue Matrix erstellen, die dann auch per A1# adressierbar ist):

A1: =WAHL({1.2};{1;2;3;4;5};{6;7;8;9}) ergibt

1 6
2 7
3 8
4 9
5 #NV
Ich habe die Funktionen aus dem Nebenthread clever-excel-forum.de/Thread-LAMBDA-Diverse-Helferlein verwendet, und die Umwandlung sieht mit den dortigen "Standardfunktionen" (fett) jetzt so aus:

=LET(
z;CELL.COL(A1);
p;z-(REST(z;7)<2)*(REST(z;7)+1);
r;WAHL({1.2.3};p;ACCUM(CELL.COL(B1));SHOW.LAST(p;99999));
x;FILTER(r;INDEX(r;;3));
WAHL({1.2};INDEX(x;;1);DECUM(INDEX(x;;2))))


mit Erläuterung der Variablen:
z: macht aus A1 mit CELL.COL einen Spalten-A1# (hier A1:A3652)
p: lässt davon die WE auf das Datum des vorhergehenden Freitags zurückfallen
r: zeigt die modifizierten Datümer p, die kumulierten Werte der dynamisierten Spalte B1 sowie das hinzugefügte FILTER-Kennzeichen WAHR/FALSCH
x: filtert derart, dass jeweils nur der (dem Freitag zugewiesene ehemalige) Sonntag bleibt, Freitag und Samstag aber verschwinden
WAHL stellt die beiden Datenspalten nebeneinander und entkumuliert die Beträge. Dabei entsteht jeweils am Freitag die Differenz von Sonntagabend und Donnerstagabend (jeweils kumuliert).

Super Performance in XLWeb, by the way! Dadurch, dass ich die LAMBDA-Funktionen benannt habe, gibt es auch keine (Nicht)-Übersetzungsprobleme.

Bitte in der Datei den Apostroph in A1:B1 entfernen, spart Uploadplatz im Forum[attachment=42241]