Možno ste si všimli, že dátum Veľkej noci (v ďalšom VN) sa každý rok mení. V cirkevnom roku poznáme totiž sviatky nepohyblivé - ich dátum je každý rok ten istý, a pohyblivé - ich dátum sa každý rok mení. Medzi nepohyblivé patrí napríklad Sviatok narodenia Pána, ktorý každý rok oslavujeme 25. decembra. VN patrí medzi pohyblivé sviatky. Dátumy ostatných pohyblivých sviatkov sa potom pohybujú podľa dátumu VN. Ako je to vlastne s VN? Dňom jarnej rovnodennosti je 21. marec. Po dni jarnej rovnodennosti, keď mesiac dosiahne spln (veľkonočný spln-pascha), najbližšia nedeľa, ktorá nasleduje, je Veľkonočná nedeľa. Veľkonočný spln je prvý dátum aproximatívneho astronomického splnu po 20. marci a nazýva sa aj eklektický spln. Pretože Juliánsky kalendár obsahoval chybu 0,0078 dňa, do r. 1500 táto chyba činila okolo 12 dní. Preto už pápež Pavol III. začal pripravovať reformu kalendára. V r. 1576 bratia Luigi a Antonio Lilio navrhli systém, ktorý sa stal základom Gregoriánskeho kalendára a zostrojili tabuľky pre určenie VN. Christopher Clavius modifikoval tieto tabuľky a od r. 1583 sa užívajú pre určenie dátumu VN. Pápež Gregor XIII. v r. 1582 vydal pápežskú bullu INTER GRAVISSIMAS , ktorou sa zaviedla reforma kalendára, ktorú postupne prijal celý západný a pozápadnený svet. Všetky algoritmy pre výpočet Veľkej noci (západná cirkev) sú založené na týchto tabuľkách. Dôležitý je tiež Gaussov algoritmus , ktorý sa používa pre výpočet dátumu VN pre ortodoxnú (východnú) cirkev. V ďalšom uvádzam dva algoitmy pre určenie VN (západná cirkev):
Public Function VelkaNoc(rok As Integer) As String
' Carterov algoritmus
' Platný pre roky 1900-2099
Dim den As Integer
den = (((255 - 11 * (rok Mod 19)) - 21) Mod 30) + 21
VelkaNoc = DateSerial(rok, 3, 1) + den + (den > 48) + _
6 - ((rok + rok \ 4 + _
den + (den > 48) + 1) Mod 7)
VelkaNoc = Format(VelkaNoc, "dddd dd.mm.yyyy")
End Function
Aby ste mohli kedykoľvek Vami vytvorenú funkciu použiť,
uložte súbor, v ktorom máte VBA kód funkcie, ako doplnok
(uložiť ako) pod tým istým menom ako pôvodný súbor a
rozšírením mena súboru XLA. Potom budete mať túto funkciu
vždy k dispozícii, pokiaľ si ju v Exceli v Doplnkoch
začiarknete. V liste potom túto funkciu zadáte
(bude v kategórii definované používateľom)
a ako argument
zadáte rok ktorý Vás zaujíma. Výpočty pre väčší časový
interval, napr. pre celý obor platnosti, t.j.pre
roky 2000 až 2099 si môžete urobiť v
IMMEDIATE WINDOW
pomocou subrutíny MAIN
, ktorú uvádzam nižšie:
Sub Main()
Dim i As Integer
For i = 2003 To 2099
Debug.Print VelkaNoc(i)
Next i
End Sub
Dim mes As Integer, den As Integer
Function oud(rok)
'Oudinova metóda výpočtu
' dátumu Veľkonočnej nedele
storoc = Int(rok / 100)
g = rok Mod 19
k = Int((storoc - 17) / 25)
i = (storoc - Int(storoc / 4) - Int((storoc - k) / 3) + _
19 * g + 15) Mod 30
a = Int(i / 28)
b = Int(29 / (i + 1))
c = Int((21 - g) / 11)
i = i - a * (1 - a * b * c)
d = Int(rok / 4)
j = (rok + d + i + 2 - storoc + Int(storoc / 4)) Mod 7
l = i - j
mes = 3 + Int((l + 40) / 44)
den = l + 28 - 31 * Int(mes / 4)
End Function
V procedúre MAIN môžete výsledky zapísať
do textového súboru s názvom napr.oudin.txt
alebo do IMMEDIATE WINDOW
Sub main()
Dim m As Integer, dtm As Date
'Open "C:\oudin.txt" For Output As #1
For m = 2000 To 2020
rok = m
Call oud(rok)
dtm = Str(den) & Str(mes) & Str(rok)
Debug.Print dtm
'Print #1, dtm
Next m
'Close #1
End Sub
Ďalšie pohyblivé sviatky sa určia vo vzťahu k VN. Nedeľa pred VN sa nazýva
Kvetnou nedeľou. Ak od nej odčítate 40 dní, prídete ku dňu,
ktorý sa nazýva Popolcová streda.
Prestupné roky sú definované ako roky, ktoré sú delitelné číslom 4 bez zbytku s výnimkou storočí. Zo storočí sú prestupné len tie, ktoré sú deliteľné číslom 400. Rok 1800 preto prestupný nie je, hoci je delitelný bez zbytku číslom 4.Vytvorme si kód pre vlastnú funkciu, ktorá vráti odkaz, či zadaný rok je prestupný alebo nie.
Function prest(dtm As Date)
Dim i As Integer, rok As Integer
rok = Year(dtm)
rr = rok Mod 4
rrr = rok Mod 400
If rr = 0 Or rrr = 0 Then
prest = "Prestupný"
Else
prest = "Neprestupný"
End If
End Function
Podrobnosti o vytvorení vlastných funkcií nájdete v článku
Funkce a vlastní funkce (2886)
Funkcia FLOOR je menej známa funkcia a taktiež jej vysvetlenie
v HELP-e nie je práve najvýstižnejšie. Jej syntax je:
FLOOR(number;significance).
Napr. =FLOOR(x;s).