Clever-Excel-Forum

Normale Version: Lambda-Funktionen in Excel
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Hallo,

der nächste Game-Changer in Excel. Lambda-Funktionen. Damit lassen sich Formeln als benutzerdefinierte Funktionen anlegen.

https://techcommunity.microsoft.com/t5/e...-p/1925546

Gruß
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ß
Hallo zusammen,

habe mal einen Artikel mit einer Einführung zur LAMBDA-Funktion geschrieben.
Und die benutzerdefinierte Funktion OSTERN erstellt.

http://www.excel-ticker.de/die-lambda-fu...-in-excel/

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.
Seiten: 1 2 3 4