(C) 2009 - 2021 by Mourad Louha · Alle Rechte vorbehalten

ARRAY.REVERSE

Nach meinem gestrigen Artikel mit einer Einführung zur LAMBDA-Funktion hat es mich gepackt, ein paar eigene benutzerdefinierte Funktionen in Excel zu entwickeln, die auf der LAMBDA-Funktion in Excel basieren.

Dieser Artikel läutet eine Reihe von Artikeln ein, wo ich meine im Laufe der Zeit entwickelten Funktionen vorstellen werde. Den Anfang werden hierbei Array-Funktionen machen, um Arrays zu manipulieren oder zu generieren.

Die erste Array-Funktion, die ich hier vorstellen möchte, ist ARRAY.REVERSE , die dazu dient, ein Array bzw. einen Bereich zu invertieren.

ARRAY.REVERSE

ARRAY.REVERSE

Die Funktion ARRAY.REVERSE invertiert ein Array beliebiger Größe – das heißt die letzte Zeile des Bereichs wird zur ersten Zeile, die vorletzte Zeile zur zweiten Zeile usw. Um dies zu erreichen sind die Höhe und Breite des Array zu ermitteln sowie das Array von unten nach oben zu durchlaufen. Kurz und knapp, so sieht die Formel bei Verwendung der Excel-Funktion LET aus, die uns ermöglicht, Teilberechnungen als Variablen abzulegen.

=LET(Array;$A$2:$C$9;
     X;SEQUENZ(1;SPALTEN(Array));
     Y;SEQUENZ(ZEILEN(Array);1;ZEILEN(Array);-1);
       INDEX(Array;Y;X))

Was passiert in der Formel?

Neben der Angabe des Bereichs, also dem Array, werden die zwei Variablen X und Y angelegt. X erzeugt mit Hilfe der Funktion SEQUENZ ein Array bestehend aus einer Zeile und in diesem Fall drei Spalten, da der Bereich drei Spalten beinhaltet. X beinhaltet somit den Wert {1.2.3}. Y erzeugt ebenfalls mit Hilfe von SEQUENZ ein Array bestehend aus einer Spalte und hier mit acht Zeilen. Allerdings ist bei Y die Reihenfolge der Indizes invertiert. So startet die Reihe mit 8 und endet mit 1. Das erzeugte Array für Y erhält somit die Werte {8;7;6;5;4;3;2;1}.

Sind einmal die Indizes in horizontaler und vertikaler Richtung definiert, ist es recht einfach mit Hilfe der Excel-Funktion INDEX die einzelnen Werte aus dem übergebenen Bereich zu extrahieren.

Um eine benutzerdefinierte Funktion aus der Formel zu erstellen, kapseln wir die Formel in die LAMBDA-Funktion. Dies sieht dann wie folgt aus:

=LAMBDA(Array;
 LET(X;SEQUENZ(1;SPALTEN(Array));
     Y;SEQUENZ(ZEILEN(Array);1;ZEILEN(Array);-1);
       INDEX(Array;Y;X)))

Wie in meinem Artikel zur Einführung der LAMBDA-Funktion geschrieben, liefert die Formel kein Ergebnis, wenn sie so geschrieben wird, wie hier oben aufgeführt. Zum Testen der Funktion muss der Bereich übergeben werden. Das sähe beispielhaft so aus.

=LAMBDA(Array;
 LET(X;SEQUENZ(1;SPALTEN(Array));
     Y;SEQUENZ(ZEILEN(Array);1;ZEILEN(Array);-1);
       INDEX(Array;Y;X)))($A$2:$C$9)

Klappt alles, verbleibt noch einen Namen in Excel anzulegen. Genau diesen Namen benennen wir als ARRAY.REVERSE und geben als Formel für den Namen die Lambda-Funktion an – ohne den Eingangsbereich.

Namensmanager mit ARRAY.REVERSE

Anschließend lässt sich die neue benutzerdefinierte Funktion in der Arbeitsmappe verwenden. Die Funktion wird auch in der IntelliSense-Liste aufgeführt.

IntelliSense mit ARRAY.REVERSE

Die Formel lautet nun:

=ARRAY.REVERSE($A$2:$C$9)

Ein Hinweis am Rande: ein Doppelklick auf den Eintrag in der IntelliSense-Liste fügt zwar die Funktion in die Zelle ein, setzt aber nicht automatisch eine öffnende Klammer nach dem Funktionsnamen. Die Klammer muss dann manuell eingetippt werden. Ausserdem erkennt Excel noch nicht die definierten Argumente der benutzerdefinierten Funktion. Man muss also wissen, wieviele Argumente die Funktion hat. Ich denke, das wird sich aber noch ändern, da ja die aktuelle Version von LAMBDA die Erstveröffentlichung ist.

Fazit

Cool – mehr braucht man nicht zu sagen.

Nachtrag (06.12.2020)

Es gibt eine einfachere Methode, ein Array zu invertieren. Darauf bin ich erst durch den Kommentar von Wim gekommen, der mich fragte, warum ich eigentlich X und Y verwende. Das wäre gar nicht nötig. Wim hat recht. Vielen Dank an dieser Stelle. Eine vereinfachte Version sieht dann z.B. so aus:

=LAMBDA(Array;
 INDEX(Array;SEQUENZ(ZEILEN(Array);1;ZEILEN(Array);-1);
             SEQUENZ(1;SPALTEN(Array))))

Happy Exceling :-)

 

 
Comments

Good article, Mourad. But why do you use X for the columns and Y for the rows ? I would do it the other way round.

Hi Wim

thanks for pointing out that. I did not initially think about X and Y, as I was creating more functions.
So, this one works too:

INDEX(Array,SEQUENCE(ROWS(Array),1,ROWS(Array),-1),SEQUENCE(1,COLUMNS(Array)))

Thanks,
Mourad