Verhalten von (dynamischen) Namen [Abo-Version]
#1
Moin!
Ich erstelle eine Liste der Feiertage wie folgt:
1. mittels fest codiertem Jahr (Name Feiertage):
Code:
=SORTIEREN(EINDEUTIG(
LET(j;2021;
FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1});
OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60};
x;ZEILEN(FFT);
y;ZEILEN(OFT);
z;SEQUENZ(x+y);
WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))))

2. mittels Übergabe des Jahres (LAMBA; zunächst nur im Beta-Kanal, Name: Feier_Tage)
Code:
=Lambda(j;
SORTIEREN(EINDEUTIG(
LET(FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1});
OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60};
x;ZEILEN(FFT);
y;ZEILEN(OFT);
z;SEQUENZ(x+y);
WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x))))))

Dass beide Namen korrekt errechnet werden, zeigt der Eintrag von A1:=Feiertage bzw. D1:=Feier_Tage(E1), wobei in E1 die Jahreszahl steht.

Problem:
=ANZAHL(Feiertage) und =Anzahl(Feier_Tage(E1)) ergibt jeweils 1
hingegen ergibt
=ANZAHL(A1#) sowie =ANZAHL(D1#)
die erwarteten 13 bzw. 12 (2 Feiertage an einem identischen Datum)

Der Hintergrund meiner Anfrage ist, dass ich so mit den Namen nichts anfangen kann, denn ich kann den Namen nicht korrekt in Formeln verwenden.
=NETTOARBEITSTAGE(G2;G3;Feiertage) ergibt #WERT!

ABCDEFG
101.01.202101.01.20082008
202.04.202121.03.200801.04.2021
304.04.2021123.03.2008106.04.2021
405.04.20211324.03.200812#WERT!
501.05.202101.05.2008
613.05.202111.05.2008
723.05.202112.05.2008
824.05.202122.05.2008
903.06.202103.10.2008
1003.10.202101.11.2008
1101.11.202125.12.2008
1225.12.202126.12.2008
1326.12.2021
Formeln der Tabelle
ZelleFormel
A1=Feiertage
D1=Feier_Tage(E1)
B3=ANZAHL(Feiertage)
E3=ANZAHL(Feier_Tage(E1))
B4=ANZAHL(A1#)
E4=ANZAHL(D1#)
G4=NETTOARBEITSTAGE(G2;G3;Feiertage)
Namen in Formeln
ZelleNameBezieht sich auf
A1Feiertage=SORTIEREN(EINDEUTIG( LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))))
D1Feier_Tage=LAMBDA(j; SORTIEREN(EINDEUTIG( LET(FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x))))))
B3Feiertage=SORTIEREN(EINDEUTIG( LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))))
E3Feier_Tage=LAMBDA(j; SORTIEREN(EINDEUTIG( LET(FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x))))))
G4Feiertage=SORTIEREN(EINDEUTIG( LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))))

Frage:
Mache ich irgendwo einen handwerklichen Fehler oder ist dies schlicht (momentan) nicht möglich?
Ich hänge meine Übungsdatei mal an.

Gruß Ralf


Angehängte Dateien
.xlsx   CEF_Namen.xlsx (Größe: 10,09 KB / Downloads: 4)
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)
Antworten Top
#2
Hallo,

vorab, =ANZAHL(--Feiertage) und =ANZAHL(--Feier_Tage(E1)) liefern dann 13 als Ergebnis.
Muss mir noch den Aufbau der Formel anschauen.

Unabhängig davon, kann es vorkommen, dass SORTIEREN und EINDEUTIG mit als Variable dynamisch berechnete Arrays
seltsame Ergebnisse liefern können. Wenn ich mich richtig erinnere, kann das im LET von der Reihenfolge abhängen,
aber so richtig sicher bin ich mir nicht. Da war jedenfalls mal irgendwas.

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
#3
Hallo,

habe mal, basierend auf Deiner Funktion folgende LAMBDAs erstellt und als Feiertage_ML_1 und Feiertage_ML_2 benannt.

PHP-Code:
=LAMBDA(Jahr;LET(F;DATUM(Jahr;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(Jahr;2;29))=2;{0;1;1;1;1;1});
 
O;RUNDEN((TAG(MINUTE(Jahr/38)/2+55)&".4."&Jahr)/7;)*7-6+{-2;0;1;39;49;50;60};X;ZEILEN(F);Y;ZEILEN(O);S;SEQUENZ(X+Y);
 
A;WENN(S<X+1;INDEX(F;S;1);INDEX(O;S-X;1));B;SEQUENZ(X+Y;1;1;0);SORTIEREN(EINDEUTIG(A*B)))) 

PHP-Code:
=LAMBDA(Jahr;LET(F;DATUM(Jahr;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(Jahr;2;29))=2;{0;1;1;1;1;1});
 
O;RUNDEN((TAG(MINUTE(Jahr/38)/2+55)&".4."&Jahr)/7;)*7-6+{-2;0;1;39;49;50;60};X;ZEILEN(F);Y;ZEILEN(O);S;SEQUENZ(X+Y);
 
A;WENN(S<X+1;INDEX(F;S;1);INDEX(O;S-X;1));--SORTIEREN(EINDEUTIG(A)))) 

Und dann mal in zwei Zellen folgende Formeln geschrieben, die dann 1 ergeben, statt 13!

PHP-Code:
=ANZAHL(Feiertage_ML_1(2021)) > 1 und =ANZAHL(--Feiertage_ML_1(2021)) > 13
=ANZAHL(Feiertage_ML_2(2021)) > 1 und =ANZAHL(--Feiertage_ML_2(2021)) > 13 

Auch hier müsste dann --Feiertage* genommen werden. Ein Summenprodukt verhält sich übrigens korrekt und liefert z.B.
über die Formel SUMMENPRODUKT(--(Feiertage_ML_1(2021)>0)) eben die 13.

Wenn ich allerdings eine LAMBDA mit ANZAHL mache, wie beispielhaft hier ...

PHP-Code:
=LAMBDA(Jahr;LET(
 
fnTest;LAMBDA(Jahr;LET(F;DATUM(Jahr;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(Jahr;2;29))=2;{0;1;1;1;1;1});
 
O;RUNDEN((TAG(MINUTE(Jahr/38)/2+55)&".4."&Jahr)/7;)*7-6+{-2;0;1;39;49;50;60};X;ZEILEN(F);Y;ZEILEN(O);S;SEQUENZ(X+Y);
 
A;SEQUENZ(X+Y;1;1;0)*WENN(S<X+1;INDEX(F;S;1);INDEX(O;S-X;1));SORTIEREN(EINDEUTIG(A))));
 
ANZAHL(fnTest(Jahr))))(2021

dann stimmt das Ergebnis wieder = 13. Innerhalb des LAMBDAs wird es also erkannt. Von daher, eine Erklärung habe ich nicht wirklich.

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
[-] Folgende(r) 1 Nutzer sagt Danke an maninweb für diesen Beitrag:
  • RPP63
Antworten Top
#4
Besten Dank fürs mittesten, Mourad!
Übrigens funktioniert mit der Wertumwandlung --Feiertage oder auch N(Feiertage) auch das NETTOARBEITSTAGE() korrekt.
Empfinde ich schon als "ein wenig" seltsam:
G
201.04.2021
306.04.2021
42
Formeln der Tabelle
ZelleFormel
G4=NETTOARBEITSTAGE(G2;G3;--Feiertage)
Namen in Formeln
ZelleNameBezieht sich auf
G4Feiertage=SORTIEREN(EINDEUTIG( LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))))

Gruß Ralf

Wird noch kurioser, vielleicht aber auch zielführender:
Ich habe jetzt mal EINDEUTIG und SORTIEREN weg gelassen.
Plötzlich erkennt ANZAHL(Feiertage) 6 (also die erste Teilmatrix).
ANZAHL(--Feiertage) ergibt das Richtige 13

Der Knackpunkt scheint also die Verkettung der beiden Teilmatrizen zu sein.

AB
101.01.2021
201.05.2021
303.10.20216
401.11.202113
525.12.2021
626.12.2021
702.04.2021
804.04.2021
905.04.2021
1013.05.2021
1123.05.2021
1224.05.2021
1303.06.2021
Formeln der Tabelle
ZelleFormel
A1=Feiertage
B3=ANZAHL(Feiertage)
B4=ANZAHL(--Feiertage)
Namen in Formeln
ZelleNameBezieht sich auf
A1Feiertage=LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))
B3Feiertage=LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))
B4Feiertage=LET(j;2021; FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1}); OFT;RUNDEN((TAG(MINUTE(j/38)/2+55)&".4."&j)/7;)*7-6+{-2;0;1;39;49;50;60}; x;ZEILEN(FFT); y;ZEILEN(OFT); z;SEQUENZ(x+y); WENN(z<x+1;INDEX(FFT;z);INDEX(OFT;z-x)))

Off topic:
Jetzt weiß ich auch, warum auf dem Dropdown -- Excel steht.
Sicher ist sicher! Wink
   
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)
Antworten Top
#5
Hallo Ralf,

in der Tat, das Problem scheint das Verketten der Teilmatrizen zu sein. Beispielweise nehme ich mal folgende LAMBDAs:

PHP-Code:
Alpha = LAMBDA(Dummy;LET(A;{90;80;70;60;50};B;{40;30;20;10};S;SEQUENZ(ZEILEN(A)+ZEILEN(B));WENN(S<ZEILEN(A)+1;INDEX(A;S;1);INDEX(B;S-ZEILEN(A);1))))
Beta  = LAMBDA(Dummy;LET(A;SEQUENZ(5;1;90;-10);B;SEQUENZ(4;1;40;-10);S;SEQUENZ(ZEILEN(A)+ZEILEN(B));WENN(S<ZEILEN(A)+1;INDEX(A;S;1);INDEX(B;S-ZEILEN(A);1))))
Delta LAMBDA(Dummy;LET(A;ZEICHEN(SEQUENZ(5;1;65));B;ZEICHEN(SEQUENZ(4;1;70));S;SEQUENZ(ZEILEN(A)+ZEILEN(B));WENN(S<ZEILEN(A)+1;INDEX(A;S;1);INDEX(B;S-ZEILEN(A);1)))) 

Dann erhalte ich:

PHP-Code:
=ANZAHL(Alpha(1))  5 statt 9
=ANZAHL(Beta(1))   5 statt 9
=ANZAHL(Delta(1))  1 statt 0 

ANZAHL2 liefert bei Text ebenfalls ein abweichendes Ergebnis.

PHP-Code:
=ANZAHL2(Alpha(1))  9 Ok
=ANZAHL2(Beta(1))   9 Ok
=ANZAHL2(Delta(1))  1 statt 9 

Wenn ich jetzt die LAMBDAs in LET packe, also z.B. wie folgt, erhalte ich wieder die korrekten Ergebnisse 9,9 und 0.

PHP-Code:
=LET(fnAlpha;LAMBDA(Dummy;LET(A;{90;80;70;60;50};B;{40;30;20;10};S;SEQUENZ(ZEILEN(A)+ZEILEN(B));WENN(S<ZEILEN(A)+1;INDEX(A;S;1);INDEX(B;S-ZEILEN(A);1))));ANZAHL(fnAlpha(1)))
=
LET(fnBeta ;LAMBDA(Dummy;LET(A;SEQUENZ(5;1;90;-10);B;SEQUENZ(4;1;40;-10);S;SEQUENZ(ZEILEN(A)+ZEILEN(B));WENN(S<ZEILEN(A)+1;INDEX(A;S;1);INDEX(B;S-ZEILEN(A);1))));ANZAHL(fnBeta(1)))
=
LET(fnDelta;LAMBDA(Dummy;LET(A;ZEICHEN(SEQUENZ(5;1;65));B;ZEICHEN(SEQUENZ(4;1;70));S;SEQUENZ(ZEILEN(A)+ZEILEN(B));WENN(S<ZEILEN(A)+1;INDEX(A;S;1);INDEX(B;S-ZEILEN(A);1))));ANZAHL(fnDelta(1))) 

Vom Gefühl her würde ich das als Bug im Zusammenhang Bereichsname <-> LAMBDA einschätzen. Mal gucken, was MS dazu sagt.

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