Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
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)
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
03.10.2022, 09:24
(Dieser Beitrag wurde zuletzt bearbeitet: 03.10.2022, 09:25 von RPP63.)
(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)
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
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

)
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)
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
03.10.2022, 10:13
(Dieser Beitrag wurde zuletzt bearbeitet: 03.10.2022, 10:17 von LCohen.)
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.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
03.10.2022, 11:07
(Dieser Beitrag wurde zuletzt bearbeitet: 03.10.2022, 11:07 von RPP63.)
And here it is:
| A | B | C | D |
1 | | Oster_SO | Dat | Anz |
2 | 17.04. | 17.04.2022 | 22.03. | 41 |
3 | 09.04. | 09.04.2023 | 23.03. | 65 |
4 | 31.03. | 31.03.2024 | 24.03. | 107 |
5 | 20.04. | 20.04.2025 | 25.03. | 167 |
6 | 05.04. | 05.04.2026 | 26.03. | 198 |
7 | 28.03. | 28.03.2027 | 27.03. | 220 |
8 | 16.04. | 16.04.2028 | 28.03. | 252 |
9 | 01.04. | 01.04.2029 | 29.03. | 272 |
10 | 21.04. | 21.04.2030 | 30.03. | 281 |
11 | 13.04. | 13.04.2031 | 31.03. | 272 |
12 | 28.03. | 28.03.2032 | 01.04. | 259 |
Zelle | Formel |
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)
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
Interessante Verteilung ... ist nicht leicht zu kommentieren, da die Osterformel von so einigem abhängt.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
03.10.2022, 11:25
(Dieser Beitrag wurde zuletzt bearbeitet: 03.10.2022, 11:30 von RPP63.)
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)
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
03.10.2022, 19:11
(Dieser Beitrag wurde zuletzt bearbeitet: 03.10.2022, 19:11 von RPP63.)
(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!

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)
Registriert seit: 29.09.2015
Version(en): 2030,5
04.10.2022, 10:06
(Dieser Beitrag wurde zuletzt bearbeitet: 04.10.2022, 10:08 von snb.)
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