Moin Mourad
Ich bin noch am schmökern, aber klingt für mich wie ein aufgebohrtes LET().
Die Fähigkeit zur Rekursion könnte interessant sein.
Ich warte dann mal auf die ersten Erfahrungen der Insider-User.
EDIT:
Ganz am Ende des Artikels steht dann dass man einen Namen anlegen muss. Solche Namen-Konstrukte kann man doch auch ohne LAMBDA() erstellen.
N'Abend,
Lambas wirken wie eine Funktion in Excel, hinter der eine Formel steht. Der Funktionsname ist dann ein Excel-Name.
Beispielsweise wird im Namensmanager der Name
MeineFunktion angelegt. Als Formel wird dann angegeben:
Code:
=LAMBDA(X;Y;SUMME(X;Y)) // kann natürlich auch was wesentlich komplizierteres sein
In Deiner Excel-Tabelle schreibst Du dann als Formel =MeineFunktion(A1;B1)
Gruß
Mal sehen, ob die Rekursion auch Bezug auf
Vorgängerberechnung im Array erlaubt (müsste eigentlich; ist eine der häufigsten Anforderungen für eine in sich abhängige Tabelle). Dann benötigt man für dynamische Formeln keine Iterations-Aktivierung mehr, wie noch hier:
office-hilfe.com/support/threads/variabel-lange-formelbereiche-mit-xl365-am-beispiel-annuitaetischer-tilgungen.31942/
Dann versuche ich mal mein Excel upzudaten.
Vorabfazit: Sehr schön, dass man nun endlich benannten Formeln Argumente mitgeben kann. Dann könnte ein Argument auch ein Array sein und die Funktion wiederum ein Array zurückgeben.
Mal sehen, ob damit endlich eine FIFO-Tabellenfunktion gelingt. Die habe ich vor 17 Jahren mal in VBA geschrieben. Dort bestanden Argument und Rückgabe aus verketteten Strings variabler Länge.
Aber fangen wir erst mal klein an, nach meinem Windows-Update, welches mir anscheinend immer die Office-Neuigkeiten mitbringt (XLWeb hat LAMBDA heute noch nicht):
=ESteuer2004(zvE;Splitting) mit Splitting nein = 1, ja = 2 (Argument optional/wertvorbesetzt habe ich noch nicht erforscht)
Benenne ESteuer2004 mit meiner uralten Funktion:
=LAMBDA(x;y;LET(x;x/y;y*GANZZAHL(SUMMENPRODUKT( (x>={7665.12740.52152})* (x<{12740.52152.99999999999})*( (x-{7664.12739.0})%%^2*{793,1.265,78.0}+ (x-{7664.12739.0})%*{16.24,05.45}+ {0.1016.-8845})))))
Anmerkung: Diese Funktion ist nicht auf den Euro akkurat, da z.B. die damals üblichen sprungfixen Berechnungen (alle 54 oder 18 Euro oder so ähnlich) nicht drin sind. Außerdem schließe ich nicht aus, dass im amtlichen PAP bei Zwischenstufen (anders) gerundet wird.
=ESteuer2004(40000;1) ergibt 9457 (Einzel-Durchschnittsteuer 23,9%)
=ESteuer2004(40000;2) ergibt 5804 (Splitting-Durchschnittsteuer 14,5%)
=ESteuer2004(SEQUENZ(101;;0;1000);1) ergibt leider heute noch Unsinn statt einer dynamischen Steuerliste für zvE 0, 1000, 2000, ..., 100000. Die Sequenz wird ungefragt einfach summiert.
https://techcommunity.microsoft.com/t5/e...-p/1925546
zeigt ein Rekursionsbeispiel. Das habe ich ein bisschen abgewandelt:
D3:
=WEXELN(A3;B3;C3) mit
abcdefg adf xxx xbcxexg als Inhalte der 4 Zellen.
WEXELN wird definiert mit
=LAMBDA(textString;changeChars;replaceChars;
WENN(changeChars=""; textString;
WEXELN(
WECHSELN(textString; LINKS(changeChars; 1); LINKS(replaceChars; 1));
RECHTS(changeChars; LÄNGE(changeChars)-1);
RECHTS(replaceChars; LÄNGE(replaceChars)-1)
)))
Ich kann dieses nun endlich mögliche LISTEWECHSELN auch
partiell zum Eliminieren, partiell zum Wechseln verwenden:
D3:
=WECHSELN(WEXELN(A3;B3;C3);"x";) mit
abcdefg adf xyx bcyeg als Inhalte der 4 Zellen.
Hallo,
@LCohen: WEXELN gefällt mir. Habe mal ein bißchen mit Deiner Steuerformel rumgespielt. Sieht so aus, als würde das Summenprodukt die Array-isierung killen.
Vielleicht gibt's da eine andere Lösung.
Code:
=LET(zvE;{40000;41000};Splitting;1;R;SEQUENZ(ZEILEN(zvE));Y;INDEX(zvE;R;1)/Splitting;
Z;Splitting*GANZZAHL(SUMMENPRODUKT((INDEX(Y;R;1)>={7665.12740.52152})*(INDEX(Y;R;1)<{12740.52152.99999999999})*((
INDEX(Y;R;1)-{7664.12739.0})%%^2*{793,1.265,78.0}+(INDEX(Y;R;1)-{7664.12739.0})%*{16.24,05.45}+{0.1016.-8845})));Y)
=LET(Y;{40000;41000};R;SEQUENZ(ZEILEN(Y));Z;SUMMENPRODUKT((INDEX(Y;R;1)>={7665.12740.52152})*(INDEX(Y;R;1)<{12740.52152.99999999999}));Z)
Parameter in LAMBDAs können optional sein, müssen aber angegeben werden, z.B. UDF(X;Y;Z) würde dann UDF(X;;). Empfiehlt sich dann den Fall abzufangen.
Ich habe mir mal ein paar Array-Funktionen erstellt
ARRAY.CREATE,
ARRAY.REVERSE sowie
ARRAY.REMOVE.FIRSTN und ARRAY.REMOVE.LASTN.
Werden mir dann später als Basis für mehr Funktionen dienen.
Gruß
Das Wort Splitting erinnert gleich an SPLITTEN (Gegenfunktion zu TEXTVERKETTEN):
=SPLITTEN(A1) mit
Namen Definieren SPLITTEN bezieht sich auf:
=LAMBDA(TextString;XMLFILTERN("<a><b>"&WECHSELN(TextString;" ";"</b><b>")&"</b></a>";"//b"))
Verwendete Quelle für XMLFILTERN als SPLITTEN:
techcommunity.microsoft.com/t5/excel/counting-dates/m-p/1424487
Eine sinnvolle Funktion mit Argument, bevor sie dann allgemein als eigene Funktion verfügbar wird.
Erweiterung:
Aufteilung in Zeilen (quer=0) oder Spalten (quer=1): =SPLITTEN(A1;;) oder =SPLITTEN(A1;1;) sowie
Delimiter (Default Leerzeichen, sonst z.B. "/"): =SPLITTEN(A1;;"/") oder =SPLITTEN(A1;1;"/")
als
Namen Definieren SPLITTEN bezieht sich auf:
=LAMBDA(Txt;quer;Trenn;
LET(Txt;Txt;quer;quer;y;Trenn;x;XMLFILTERN("<a><b>"&WECHSELN(Txt;WENN(y="";" ";y);"</b><b>")&"</b></a>";"//b");
WENN(quer;MTRANS(x);x)))
____________
(Deine 4 ARRAY.xxx schaue ich mir noch an)
maninweb, sehr schöne Erweiterungen!
Was ich immer bei MTRANS vermisst habe, war ein "Weiterdrehen": Denn mehrfache Verwendung schaltet immer nur zwischen Zeilen- und Spaltenorientierung hin- und her (absolut sinnvoll, weil es um das Verwenden von nur 2 möglichen Dimensionen in Excel-Arrays geht). Schick wäre aber:
MTRANS4
mit den Zuständen
Zustand 0:
1 2 3
4 5 6
Zustand 1 (MTRANS):
1 4
2 5
3 6
Zustand 2 (Dein .REVERSE):
3 2 1
6 5 4
Zustand 3 (.REVERSE zu MTRANS):
3 6
2 5
1 4
... und weiter mit MTRANS8:
Zustand 4 (.REVERSE der verbleibenden Dimension):
4 5 6
1 2 3
Zustände 5-7 weiter ggü Zustand 4 (analog zu Zustand 1-3).
z.B. .APPEND ist sehr schön. Damit können (evtl. ohne weiteres) die Unterschiede zweier Arrays mit EINDEUTIG sofort zurückgegeben werden.