Das Excel-Team hat gestern – 03.12.2020 – die LAMBDA-Funktion in Excel angekündigt und im Excel-Betakanal zur Verfügung gestellt. Um den Betakanal nutzen zu können, ist eine Teilnahme am Office-Insider-Programm erforderlich. Ein Hinweis dazu: oft ist es so, dass neue Features in Excel stückweise ausgerollt werden. Wenn der aktuellste Betakanal bereits genutzt wird, die LAMBDA-Funktion jedoch noch nicht vorhanden ist, dann ist ein bißchen Geduld gefragt. In einem der nächsten Updates sollte dann die Funktion auftauchen.
Mit der LAMBDA-Funktion lassen sich benutzerdefinierte Funktionen erstellen, die rein formelbasierte Berechnungen beinhalten. Es ist somit keine Programmierung in VBA oder JavaScript erforderlich. Laut dem Excel-Blog sind zudem noch weitere Features in Zusammenhang mit der LAMBDA-Funktion geplant und diese erste Veröffentlichung ist nur der Anfang.
Dieser Artikel stellt die LAMBDA-Funktion sowie die derzeit noch gültigen Randbedingungen zu deren Verwendung vor. Als Beispiel stelle ich dann meine benutzerdefinierte Funktion OSTERN vor, die das Osterdatum eines beliebigen Jahres berechnet und hierbei die LAMBA-Funktion verwendet.
Die LAMBDA-Funktion
Die Syntax der LAMBDA-Funktion ist recht einfach. Als erstes Argument sollte ein Parameter angegeben werden. Unter einem Parameter ist eine Variable zu verstehen, deren Benennung der in Excel zulässigen Benennung für Namen folgt. Allerdings sollten Punkte, die ja in Namen zulässig sind, in der Benennung von Parametern vermieden werden.
Bis zu 253 weitere Parameter können optional als Folgeargumente definiert werden. Das letzte in der LAMBDA-Funktion verwendete Argument muss jedoch in jedem Fall eine Berechnung sein. Im Normalfall wird die Berechnung sinnvollerweise die zuvor definierten Parameter verwenden.
Angenommen, es soll eine Formel erstellt werden, die je nach Angabe eines Steuerungsparameters die Summe oder Differenz zweier Zahlen berechnet. Die Formel liesse sich dann so formulieren:
=LAMBDA(X;Y;Z;WAHL(Z;X+Y;X-Y))
Je nachdem, ob Z den Wert 1 oder 2 einnimmt, würde die Summe oder die Differenz von X und Y berechnet werden. Wird allerdings die Formel in Excel so eingegeben, wie sie hier zuvor aufgeführt ist, liefert Excel jedoch den Fehler #KALK!.
Das liegt daran, dass zwar die Funktion definiert, aber keine Werte übergeben wurden. Das Ergebnis von LAMBDA ist als Funktion – eine sogenannte anonyme Funktion, wie Sie in einigen Programmiersprachen vorkommt – zu betrachten, weshalb die Eingangswerte angegeben werden müssen, um ein Ergebnis zu erhalten. Beispielsweise würde folgende Formel den Wert 3 zurückgeben.
=LAMBDA(X;Y;Z;WAHL(Z;X+Y;X-Y))(1;2;1)
Die Funktion LAMBDA ist auch in der Lage dynamische Arrays zurückzugeben, weshalb die Angabe zwei gleich hoher Bereiche dann die Summe bzw. die Differenz der jeweiligen Werte liefert. Beispielsweise:
=LAMBDA(X;Y;Z;WAHL(Z;X+Y;X-Y))(A2:A9;B2:B9;1)
In folgender Abbildung ist das zurückgegebene dynamische Array zu sehen, was die Summe der einzelnen Werte aufführt.
LAMBDA kann übrigens noch viel mehr: so erkennt LAMBDA Datentypen und kann sogar Rekursionen ausführen, also sich selbst aufrufen. Diese Features werde ich jedoch in separaten Artikeln vorstellen.
Aber wie wird nun aus einer LAMBDA-Funktion eine benutzerdefinierte Funktion erstellt? Ganz einfach: einen Excel-Namen anlegen und die erstellte LAMBDA-Funktion als Formel hinterlegen – und zwar ohne Angabe der Eingangswerte. Folgende Abbildung zeigt die LAMBDA-Funktion, die unter dem Namen MEINEFUNKTION abgelegt wurde.
Anschließend kann der Name als benutzerdefinierte Funktion verwendet werden, wie hier folgt zu sehen. MEINEFUNKTION verhält sich wie eine Art Blackbox, die im Hintergrund die in LAMBDA hinterlegte Formel ausführt.
Natürlich könnte jetzt eingewendet werden, dass dies etwas umständlich ist. Da dies jedoch die erste Version der LAMBDA-Funktion ist und weitere Entwicklungen geplant sind, denke ich mal, dass das Excel-Team sich dazu was einfallen lassen wird.
Zu beachten ist bei der Benennung von benutzerdefinierten Funktionen, dass deren Name nicht mit dem Namen einer bereits bestehenden Excel-Funktion übereinstimmt. Und, wenn im internationalen Umfeld gearbeitet wird, gilt dies auch für die Zielsprachen. Es empfiehlt sich, gegebenenfalls den Namen der benutzerdefinierten Funktionen ein Präfix voranstellen.
Da die eigenen benutzerdefinierten Funktionen als Name abgelegt werden, sind diese logischerweise an die Arbeitsmappe gebunden. Es gelten dann auch die Excel-Regeln für Namen, wenn z.B. Arbeitsblätter von einer Mappe in eine andere kopiert werden.
OSTERN als benutzerdefinierte Funktion in Excel
Im Internet sind eine ganze Reihe an Excel-Formeln zu finden, die das Osterdatum eines Jahres berechnen. Manche dieser Formeln schränken diese Berechnung jedoch auf einen Zeitraum ein, z.B. auf Jahreszahlen größer 1900. Manche Formeln wiederum berechnen nicht alle Jahre korrekt. Eine der besten und zuverlässigsten Methode zur Berechnung des Osterdatums ist meines Wissens die Gaussformel. Eine sehr elegante Umsetzung dieser Methode ist bei Excelformeln.de zu finden. Diese Formel verwende ich nachfolgend als Grundlage zur Erstellung der OSTERN-Funktion.
Die Berechnung des Osterdatums erfolgt hierbei in mehrere Schritten. Angenommen, das Jahr steht in Zelle A1, dann würden in den Zellen A2 bis A6, dem Ergebnis, folgende Formeln stehen.
A2=GANZZAHL(A1/100)
A3=REST(19*REST(A1;19)+A2-GANZZAHL(A2/4)-GANZZAHL((A2-GANZZAHL((A2+8)/25)+1)/3)+15;30)
A4=REST(32+2*REST(A2;4)+2*GANZZAHL(REST(A1;100)/4)-A3-REST(REST(A1;100);4);7)
A5=A3+A4-7*GANZZAHL((REST(A1;19)+11*A3+22*A4)/451)+22
A6=DATUM(A1;WENN(A5>31;4;3);WENN(A5-31< 1;A5;A5-31))
Parametrisieren wir nun in einem ersten Schritt diese Zellen A2 bis A6, indem wir die Zelladressen durch die Parameter A bis E ersetzen und das Jahr in A1 durch die Variable Jahr.
A=GANZZAHL(Jahr/100)
B=REST(19*REST(Jahr;19)+A-GANZZAHL(A/4)-GANZZAHL((A-GANZZAHL((A+8)/25)+1)/3)+15;30)
C=REST(32+2*REST(A;4)+2*GANZZAHL(REST(Jahr;100)/4)-B-REST(REST(Jahr;100);4);7)
D=B+C-7*GANZZAHL((REST(Jahr;19)+11*B+22*C)/451)+22
E=DATUM(Jahr;WENN(D>31;4;3);WENN(D-31< 1;D;D-31))
Die Excel-Funktion LET ermöglicht es, innerhalb einer Formel Teilberechnungen durchzuführen und diese wiederum in weiteren Teilberechnungen zu verwenden. Eine Pseudoformel würde somit wie folgt aussehen:
=LET(A;Berechnung_A;B;Berechnung_B; … … ; Ergebnis; Berechnung_Ergebnis; Ergebnis)
Die Berechnung des Osterdatums unter Berücksichtigung des Jahres - hier gleich 2020 - sieht dann bei Verwendung der LET-Funktion wie folgt aus:
=LET(Jahr;2020;
A;GANZZAHL(Jahr/100);
B;REST(19*REST(Jahr;19)+A-GANZZAHL(A/4)-GANZZAHL((A-GANZZAHL((A+8)/25)+1)/3)+15;30);
C;REST(32+2*REST(A;4)+2*GANZZAHL(REST(Jahr;100)/4)-B-REST(REST(Jahr;100);4);7);
D;B+C-7*GANZZAHL((REST(Jahr;19)+11*B+22*C)/451)+22;
E;DATUM(Jahr;WENN(D>31;4;3);WENN(D-31< 1;D;D-31));E)
Somit ist die einzige Eingangsvariable das Jahr. Kapseln wir nun die Formel in eine LAMBDA-Funktion. Wir erhalten:
=LAMBDA(Jahr;
LET(A;GANZZAHL(Jahr/100);
B;REST(19*REST(Jahr;19)+A-GANZZAHL(A/4)-GANZZAHL((A-GANZZAHL((A+8)/25)+1)/3)+15;30);
C;REST(32+2*REST(A;4)+2*GANZZAHL(REST(Jahr;100)/4)-B-REST(REST(Jahr;100);4);7);
D;B+C-7*GANZZAHL((REST(Jahr;19)+11*B+22*C)/451)+22;
E;DATUM(Jahr;WENN(D>31;4;3);WENN(D-31< 1;D;D-31));E))(2020)
Wie zu sehen, ist die Jahresangabe von der LET-Funktion zu der LAMBDA-Funktion gewandert und dient dort als erster Parameter. Und in diesem Fall wird die LAMBDA-Funktion auf 2020 angewendet. Es ist fast geschafft, denn nun brauchen wir nur noch den Namen OSTERN angelegen und die LAMBDA-Funktion abzüglich des Eingangswertes (2020) als Formel angeben.
Folgende Abbildung zeigt dann die Verwendung der neuen Funktion OSTERN. Auch hier akzeptiert die Funktion einen Bereich als Werteliste und liefert ein dynamisches Array zurück.
Fazit
LAMBDA-Funktionen sind ein innovativer Meilenstein in Excel, der aus meiner Sicht, ähnlich zu den dynamischen Arrays und Datentypen, das Arbeiten mit Excel verändern wird. Ich bin wirklich sehr gespannt, was das Excel-Team in den kommenden Wochen und Monaten an Verbesserungen zu den LAMBDA-Funktionen zur Verfügung stellen wird.
Wünschen würde ich mir beispielsweise eine Möglichkeit, eigene benutzerdefinierte Funktionen in einer Art Bibliothek ablegen zu können, um von jeder Arbeitsmappe aus auf diese zugreifen zu können.
Happy Exceling :-)
Hi there,
for my English speaking readers, a translation of the Easter-Formula:
=LAMBDA(Year,
LET(A,INT(Year/100),
B,MOD(19*MOD(Year,19)+A-INT(A/4)-INT((A-INT((A+8)/25)+1)/3)+15,30),
C,MOD(32+2*MOD(A,4)+2*INT(MOD(Year,100)/4)-B-MOD(MOD(Year,100),4),7),
D,B+C-7*INT((MOD(Year,19)+11*B+22*C)/451)+22,
E,DATE(Year,IF(D>31,4,3),IF(D-31< 1,D,D-31)),E))(2020)
Best,
Mourad