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] JSON.FROMRANGE
#1
Moin,

eine LAMBDA-Funktion, die aus einem Bereich JSON-Daten erstellt.

Code:
Header : Kopfzeile, also Überschriften
Data   : Datentabelle, also unterhalb der Kopfzeile
Types  : optionale Angabe von Datentypen pro Spalte, als einzeiliger Bereich mit selben Ausmass wie die Kopfzeile.
         Ohne Angabe erfolgt eine automatische Erkennung aus erster Datenzeile. Mögliche Werte:
         1 = String
         2 = Zahl
         3 = Boolean
IsArray: JSON als Array mit [] drum herum

LAMBDA-Funktion ...

Code:
=LAMBDA(Header;Data;Types;IsArray;
        LET(C;MIN(SPALTEN(Header);SPALTEN(Data));
            R;ZEILEN(Data);
            X;SEQUENZ(1;C);
            Y;SEQUENZ(R);
            F;LAMBDA(F;T;V;C;LET(R;WECHSELN(T;INDEX(V;C;1);INDEX(V;C;2));WENN(C<2;R;F(F;R;INDEX(V;SEQUENZ(C-1);{1.2});C-1))));
            A;WENN(WENNFEHLER(--IsArray;0)>0;1;0);
            T;WENN(ISTFEHLER(INDEX(Types;1;X));WENN(ISTTEXT(INDEX(Data;1;X));1;
                                               WENN(ISTZAHL(INDEX(Data;1;X));2;
                                               WENN(ODER(""&INDEX(Data;1;X)=""&(0>1);""&INDEX(Data;1;X)=""&(0<1));3;1)));
                                               INDEX(Types;1;X));
              WENN(A>0;"["&"{";"{")&
              TEXTKETTE(ZEICHEN(34)&""&INDEX(Header;1;X)&ZEICHEN(34)&":"&" "&
              WENN(ISTLEER(INDEX(Data;Y;X));"null";
              WAHL(INDEX(T;1;X);ZEICHEN(34)&
                   F(F;INDEX(Data;Y;X);WAHL(SEQUENZ(4;2);"""";"\""";ZEICHEN(9);"\t";ZEICHEN(10);"\n";ZEICHEN(13);"\r");4)&ZEICHEN(34);
                   WECHSELN(""&WENNFEHLER(--INDEX(Data;Y;X);0);",";".");
                   WENN(WENNFEHLER(--INDEX(Data;Y;X);0);"true";"false")))&
              WENN(X<C;",";WENN(Y<R;"}"&","&"{";"")))&
              WENN(A>0;"}"&"]";"}")))

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
Das ist ja dann gleich ein Beispiel für ein LAMBDA im LAMBDA. Somit kann man auf Modularität mittels zweier unabhängiger LAMBDAs auch mal verzichten. Auch wenn der Code im aufrufenden LAMBDA dann natürlich länger wird.

Beispiel von verschachtelten LAMBDAs (wo man das Aufgerufene auch im Aufrufenden integrieren könnte). Allerdings wird SORTBY.KEYRANGE dort nicht 1mal, sondern 2mal aufgerufen. Dann ist die Auslagerung auf jeden Fall besser.
Antworten Top
#3
Ich weiß, das ist hier ein wenig off topic.

Aber ich habe heute erstmalig LAMBDA() "geübt" und bin ob der Möglichkeiten fasziniert.
Aufgabe:
Erstelle eine Liste aller Ostersonntage im Bereich 2000-2025, sortiert nach Zeitpunkt im jeweiligen Jahr.

Geht ratz-fatz mit einer LAMBDA() und einer LET() und ist kürzer und einfacher zu verstehen als das VBA-Pendant:

H
123.03.2008
227.03.2005
327.03.2016
431.03.2002
531.03.2013
631.03.2024
701.04.2018
804.04.2010
904.04.2021
1005.04.2015
1108.04.2007
1208.04.2012
1309.04.2023
1411.04.2004
1512.04.2009
1612.04.2020
1715.04.2001
1816.04.2006
1916.04.2017
2017.04.2022
2120.04.2003
2220.04.2014
2320.04.2025
2421.04.2019
2523.04.2000
2624.04.2011

NameBezug
Ostern=LAMBDA(Jahr;RUNDEN((TAG(MINUTE(Jahr/38)/2+55)&".4."&Jahr)/7;0)*7-6)

ZelleFormel
H1=LET(o;Ostern(SEQUENZ(26;;2000));SORTIERENNACH(o;TEXT(o;"MTT")))

Sorry fürs off topic!

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • maninweb
Antworten Top
#4
Bei maninweb gibt es schon die Gaussvariante dazu ;)
Antworten Top
#5
Aha, spart mir ja etwas Arbeit.
Zu Excelformeln:
Die Ermittlung des Datums im letzten Schritt ist unnötig kompliziert, denn schließlich ist für Excel der 32.3. automatisch der 1.4.
ABC
12020
2
3
4
53223
601.04.202023.03.2020Excelformeln
701.04.202023.03.2020meine

ZelleFormel
A6=DATUM($A1;WENN(A5>31;4;3);WENN(A5-31< 1;A5;A5-31))
B6=DATUM($A1;WENN(B5>31;4;3);WENN(B5-31< 1;B5;B5-31))
A7=DATUM($A1;3;A5)
B7=DATUM($A1;3;B5)

Zu Gauss:
Das Gleichungssystem hat ja durchaus ein paar Schwächen, ich würde da eher die überarbeitete Version von Lichtenberg nehmen, die allerdings 10 Variablen hat:
http://de.wikipedia.org/wiki/Gau%C3%9Fsc...sterformel

In VBA habe ich das vor Jahren mal umgesetzt, die Umsetzung für LAMBDA() werde ich mal am Wochenende angehen.
Function Ostersonntag(ByVal j As Integer) As Date
' Ergänzte Gauß-Formel nach Heiner Lichtenberg (1997) 
' http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Osterformel#Eine_erg.C3.A4nzte_Osterformel 
' VBA-Umsetzung durch RalfP 

' Variablenbedeutung 
' x(0) = Säkularzahl 
' x(1) = säkulare Mondschaltung 
' x(2) = säkulare Sonnenschaltung 
' x(3) = Mondparameter 
' x(4) = Keim für ersten Frühlingsvollmond 
' x(5) = kalendarische Korrekturgröße 
' x(6) = Ostergrenze 
' x(7) = erster Sonntag im März 
' x(8) = Osterentfernung in Tagen 
' x(9) = Datum des Ostersonntags als Märzdatum (32. März = 1. April usw.) 

Dim x(9) As Long
  x(0) = j \ 100
  x(1) = 15 + (3 * x(0) + 3) \ 4 - (8 * x(0) + 13) \ 25
  x(2) = 2 - (3 * x(0) + 3) \ 4
  x(3) = j Mod 19
  x(4) = (19 * x(3) + x(1)) Mod 30
  x(5) = (x(4) + x(3) \ 11) \ 29
  x(6) = 21 + x(4) - x(5)
  x(7) = 7 - (j + j \ 4 + x(2)) Mod 7
  x(8) = 7 - (x(6) - x(7)) Mod 7
  x(9) = x(6) + x(8)
Ostersonntag = DateSerial(j, 3, x(9))
'denn der 32.3. ist automatisch der 1.4. 
End Function
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • maninweb
Antworten Top
#6
Moin,

Hey Ralf, sehr coool :-)

Nebenbei, meine LAMBDA da oben ist etwas veraltet, eine bessere Version: http://www.excel-ticker.de/json-fromrange/
Und noch meine Einführung, auch mit OSTERN: 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


Gehe zu:


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