[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
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.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
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
Top
#4
Bei maninweb gibt es schon die Gaussvariante dazu ;)
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
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
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
Top


Gehe zu:


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