Clever-Excel-Forum

Normale Version: Folgetag ohne Wochenenden und Feiertage
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
RPP63:

  • meine Formel wollte nicht als Argument in den ARBEITSTAG(); warum, weiß ich nicht :(
  • noch ist die Excelformeln-Osterformel aus dem Formelverkürzungswettbewerb ok, da das Jahr 2079 noch ein Weilchen entfernt ist (wo sie angeblich als nächstes nicht funktioniert)
(02.10.2022, 19:43)LCohen schrieb: [ -> ]
  • da das Jahr 2079 noch ein Weilchen entfernt ist

Und da ich nicht mit Methusalem konkurrieren möchte, interessiert es mich (exceltechnisch) denkbar wenig was dann passiert …
(die 63 im Nick ist mein Geburtsjahr)

Selbst Gauß hat ja noch ein paar Fehler in seiner Formel.
Ich hatte vor etlichen Jahren mal das Gleichungssystem von Lichtenberg in VBA umgesetzt und dies bei Einführung von LET() in Excel übersetzt:
=LET(j;SEQUENZ(;15;JAHR(HEUTE()));
    FFT;DATUM(j;1;{1;121;276;305;359;360})+WENN(MONAT(DATUM(j;2;29))=2;{0;1;1;1;1;1});
    A;GANZZAHL(j/100);
    B;15+GANZZAHL((3*A+3)/4)-GANZZAHL((8*A+13)/25);
    C;2-GANZZAHL((3*A+3)/4);
    D;REST(j;19);
    E;REST(19*D+B;30);
    F;GANZZAHL((E+GANZZAHL(D/11))/29);
    G;21+E-F;
    H;7-REST(j+GANZZAHL(j/4)+C;7);
    I;7-REST(G-H;7);
    OS;G+I;
    K; DATUM(j;3;OS);
    OFT;K+{-2;0;1;39;49;50;60};
    SORTIEREN(VSTAPELN(FFT;OFT)))

.
Und wer meint, dass so ein Gleichungssystem doch ziemlich langsam sein müsste, darf gerne mal folgendes ausprobieren:
Aufgabe:
Ermittle alle Ostersonntage ab diesem Jahr bis zum Ende der Excel-Zeitrechnung (Jahr 9999)
die auf den letztmöglichen Termin 25.04. fallen.
Spalte A als Datum formatieren.
In A1:
=LET(j;SEQUENZ(9999-JAHR(HEUTE())+1;;JAHR(HEUTE()));
    A;GANZZAHL(j/100);
    B;15+GANZZAHL((3*A+3)/4)-GANZZAHL((8*A+13)/25);
    C;2-GANZZAHL((3*A+3)/4);
    D;REST(j;19);
    E;REST(19*D+B;30);
    F;GANZZAHL((E+GANZZAHL(D/11))/29);
    G;21+E-F;
    H;7-REST(j+GANZZAHL(j/4)+C;7);
    I;7-REST(G-H;7);
    OS;G+I;
    K; DATUM(j;3;OS);
    FILTER(K;TEXT(K;"TTMM")="2504"))


Die 63 Treffer aus 7.978 Jahren werden in einem Wimpernschlag ermittelt.
(zugegeben, ich hab gerade ein wenig Langeweile Wink)
Eine schöne Aufgabe, um das mit VBA zu vergleichen!

(wohlgemerkt: Nicht als Sub, sondern als herunterkopierte Function mit Einzelermittlung. Die Sub wäre mit einem Variant-Array - vermutlich - genauso schnell, wie die RPP63-Tabellenfunktion).

Vielleicht kannst Du ja mit Deiner Funktion auch noch einmal die relativen Häufigkeiten der einzelnen Osterdatümer in einer Kurve darstellen. Ob die wohl "digital" normalverteilt ist? Ich habe es vergessen. Wenn der 25.4. der spätestmögliche ist, wäre die Randhäufigkeit ja fast 1%. Somit wäre bei knapp 30 möglichen Osterdatümern eine Normalverteilung ziemlich flach.
And here it is:
[attachment=45267]


ABCD
1Oster_SODatAnz
217.04.17.04.202222.03.41
309.04.09.04.202323.03.65
431.03.31.03.202424.03.107
520.04.20.04.202525.03.167
605.04.05.04.202626.03.198
728.03.28.03.202727.03.220
816.04.16.04.202828.03.252
901.04.01.04.202929.03.272
1021.04.21.04.203030.03.281
1113.04.13.04.203131.03.272
1228.03.28.03.203201.04.259

ZelleFormel
A2=TEXT(B2#;"TT.MM.")
B2=LET(j;SEQUENZ(9999-JAHR(HEUTE())+1;;JAHR(HEUTE()));
    A;GANZZAHL
(j/100);
    B;15+GANZZAHL
((3*A+3)/4)-GANZZAHL((8*A+13)/25);
    C;2-GANZZAHL
((3*A+3)/4);
    D;REST
(j;19);
    E;REST
(19*D+B;30);
    F;GANZZAHL
((E+GANZZAHL(D/11))/29);
    G;21+E-F;
    H;7-REST
(j+GANZZAHL(j/4)+C;7);
    I;7-REST
(G-H;7);
    OS;G+I;
    K; DATUM
(j;3;OS);
    K)
C2=EINDEUTIG(SORTIERENNACH(A2#;--TEXT(B2#;"MMTT")))
D2=ZÄHLENWENN(A2#;C2#)
Interessante Verteilung ... ist nicht leicht zu kommentieren, da die Osterformel von so einigem abhängt.
Wenn es die ganzen Stellschrauben nicht gäbe, wäre die Normalverteilung ja so:
[attachment=45268]
Kommt der tatsächlichen Verteilung doch recht nahe.
(mit =RUNDEN(D2#/D$2;0) erhalte ich "fast" obiges Ergebnis)
(03.10.2022, 09:13)LCohen schrieb: [ -> ]Eine schöne Aufgabe, um das mit VBA zu vergleichen!

(wohlgemerkt: Nicht als Sub, sondern als herunterkopierte Function mit Einzelermittlung. […]).
Machs Dir selbst!  19

Allgemeines Modul:
Function Ostersonntag(j&) As Variant
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

Jetzt füllst Du Spalte A mit den Oster-Daten 25.4.:
Sub OS25_4()
Dim j&, z&, OS As Date
Dim Start#
Application.ScreenUpdating = False
Start = Timer
z = 1
For j = 2022 To 9999
  OS = Ostersonntag(j)
  If Format(OS, "ddmm") = "2504" Then
    Cells(z, 1) = OS
    z = z + 1
  End If
Next
Debug.Print Timer - Start
End Sub

Dauert bei mir auch nur schlappe 0,125 Sekunden!
Etwas geschwindiger:

Code:
Sub M_snb()
  ReDim sn(7977)
  t1 = Timer

  For j = 0 To UBound(sn)
    sn(j) = Format(F_Ost(j + 2022), "dd-mm-yyyy")
  Next

  sp = Filter(sn, "25-04")
  Cells(1).Resize(UBound(sp) + 1) = Application.Transpose(sp)
 
   MsgBox Timer - t1
End Sub

0,0625 s
Seiten: 1 2