Folgetag ohne Wochenenden und Feiertage
#11
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)
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#12
(02.10.2022, 20: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)))

.
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
#13
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)
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
#14
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.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#15
And here it is:
   


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#)
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
#16
Interessante Verteilung ... ist nicht leicht zu kommentieren, da die Osterformel von so einigem abhängt.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#17
Wenn es die ganzen Stellschrauben nicht gäbe, wäre die Normalverteilung ja so:
   
Kommt der tatsächlichen Verteilung doch recht nahe.
(mit =RUNDEN(D2#/D$2;0) erhalte ich "fast" obiges Ergebnis)
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
#18
(03.10.2022, 10: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!
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
#19
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top


Gehe zu:


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