Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Lambda-Funktionen in Excel
#1
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ß
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
Antworten Top
#2
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.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Antworten Top
#3
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ß
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
Antworten Top
#4
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ß
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
Antworten Top
#5
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.
Antworten Top
#6
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.
Antworten Top
#7
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.
Antworten Top
#8
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ß
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
Antworten Top
#9
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).
Antworten Top
#10
z.B. .APPEND ist sehr schön. Damit können (evtl. ohne weiteres) die Unterschiede zweier Arrays mit EINDEUTIG sofort zurückgegeben werden.
Antworten Top


Gehe zu:


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