Calcolare il giorno di Pasqua
Hai un problema con Excel? 
Calcolare il giorno di Pasqua
di Thyke data: 28/07/2016 19:13:21
posto un mio algoritmo per calcolare il giorno di pasqua nel periodo 1900/2099
elaborato dal metodo aritmetico di GAUSS
h t t p s://it.wikipedia.org/wiki/Calcolo_della_Pasqua
Sub pasqua()
Dim anno As Long
Dim pas As String
anno = Application.InputBox("inserisci l'anno")
M = 24
N = 5
a = anno Mod 19
b = anno Mod 4
c = anno Mod 7
d = (19 * a + M) Mod 30
e = (2 * b + 4 * c + 6 * d + N) Mod 7
If (d + e) < 10 Then pas = (d + e + 22) & " marzo " & anno
If (d + e) > 10 Then
pas = (d + e - 9) & " aprile " & anno
If (d + e - 9) = 25 Then pas = 25 - 7 & " aprile " & anno
If (d + e - 9) = 26 Then pas = 26 - 7 & " aprile " & anno
End If
MsgBox pas
End Sub |
di Vecchio Frac data: 28/07/2016 19:35:20
A memoria questo è anche l'algoritmo che utilizzo io e che sembra il più provato e affidabile.
C'è qualche differenza in effetti rispetto alla mia soluzione ma sarò più preciso domani, in ufficio, quando avrò i miei file sottomano.
di cromagno data: 29/07/2016 01:36:40
Ciao a tutti,
lato formula, ho sempre usato questa per calcolare la Pasqua (supponendo che l'anno venga scritto in A1):
=ARROTONDA.DIFETTO(GIORNO(MINUTO(A1/38)/2+56)&"/5/"&$A1;7)-34
non l'ho mai "tradotta" in VBA, ma probabilmente otterrei un codice simile a quello già postato....
Ciao
Tore
di Raffaele_53 data: 29/07/2016 02:48:06
Tanto per passare il tempo, ho fatto alcune prove.
Premessa all'interno ci sono due Function, che hanno già inserito in colonna F e J le Pasque. Dopo ho copiato tali valori in colonna G e K.
Rinominato le due Function aggiungendo alla riga _bloccato (motivo dei #NOME?)
Se NON ho fatto cavolate, l'allegato fà la verifica.
Da Internet ho preso la fascia (anni) da 1950 a 2050
Ho evidenziato SI/NO errori, mà non sò quali siano giusti.
Ps Dal 2100 non dovrebbero più funzionare tali codici/formule
Solo un mio pensiero che funzionerà solo questo (tanto non risponderò più a nessuno)
Pps. Vedo un data system 1/1/1904 e qui Vi lascio il problema
Public Function Pasqua(ByVal Anno As Integer) As Date
'Autore: G.Paolo Bizzaro
'Accetta: anno (4 cifre)
'Restituisce: giorno di Pasqua dell'anno scelto
'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
'ossia dal 1583 in poi
Dim a%, b%, c%, p%, q%, r%
a = Anno% Mod 19: b = Anno% 100: c = Anno% Mod 100
p = (19 * a + b - (b 4) - ((b - ((b + 8) 25) + 1) 3) + 15) Mod 30
q = (32 + 2 * ((b Mod 4) + (c 4)) - p - (c Mod 4)) Mod 7
r = (p + q - 7 * ((a + 11 * p + 22 * q) 451) + 114)
'Pasqua = DateSerial(Anno%, r 31, (r Mod 31) + 1) ' data system 1/1/1900
Pasqua = DateSerial(Anno%, r 31, (r Mod 31) + 1) - 1462 ' data system 1/1/1904
End Function |
di Vecchio Frac data: 29/07/2016 08:17:10
Lascio anche io la mia funzione.
Naturalmente non è mia (non so più da dove l'ho presa).
Penso che concettualmente siamo tutti vicini.
@Raffaele
Le annotazioni su "data system" lasciate dall'autore del codice sono delle indicazioni sull'utilizzo, non un problema :)
In pratica ti sta offrendo due alternative: se vuoi utilizzare un sistema di date basato sul 1/1/1900 allora devi togliere il commento alla prima riga "Pasqua" e commentare la seconda, altrimenti lasci com'è, cioè con il sistema date 1904. Dalla guida online, Excel supporta due sistemi di data diversi. Questi sistemi sono il sistema data 1900 e il sistema data 1904. Nell'articolo online vengono descritte i due sistemi data e i problemi che possono verificarsi quando si utilizzano cartelle di lavoro che utilizzano sistemi di data diversi: support.microsoft.com/it-it/kb/214330.
La differenza tra i due sistemi di data è 1.462 giorni, ecco perchè il tuo effettua questa sottrazione: deve allinearsi per tener conto di questa differenza.
Option Explicit
Function easter_day(ByVal yr As Integer) As Date
'affidabile fino all'anno 2499
'esempio utilizzo: debug.print easter_day(2016)
Dim a, b, c, d, e, f, g, h, j, k, m, n, p
a = yr 100: b = yr Mod 100: c = (3 * (a + 25)) 4: d = (3 * (a + 25)) Mod 4
e = (8 * (a + 11)) 25: f = (5 * a + b) Mod 19: g = (19 * f + c - e) Mod 30
h = (f + 11 * g) 319: j = (60 * (5 - d) + b) 4: k = (60 * (5 - d) + b) Mod 4
m = (2 * j - k - g + h) Mod 7
n = (g - h + m + 114) 31: p = (g - h + m + 114) Mod 31
'giorno di pasqua = p + 1, mese = n
'la Pasqua cade g - h + m giorni dopo il 22 marzo
'questa funzione restituisce una data nel formato "giorno/mese/anno"
easter_day = CDate((p + 1) & "/" & n & "/" & yr)
End Function
|
di Vecchio Frac data: 29/07/2016 08:26:45
@Raffaele
Perchè dici "tanto non risponderò più a nessuno" ?
di Marius44 data: 29/07/2016 09:09:17
Buon giorno a tutti
Premetto che io utilizzo una sub che trovai tempo fa in EnniusAltervista.org.
Mi sembra che la function proposta da Raffaele (mi associo alla domanda di VF) dia un errore anticipando di 1 giorno e 4 anni. Quelle di cromagno e VF sono esatte.
Allego il mio file dove ho fatto le prove e dove ho inserito una tabella con le date della Pasqua dal 2001 al 2100 (da Wikipedia).
Ciao,
Mario
di Vecchio Frac data: 29/07/2016 12:02:41
In effetti la formula di Cromagno è bellissima anche se si può usare solo in Excel... in Access non ho a disposizione WorksheetFunction :)
Function easter_day_cromagno(ByVal yr As Integer) As Date
'utilizzo: easter_day_cromagno(2016) --> 27/03/2016
'=ARROTONDA.DIFETTO(GIORNO(MINUTO(A1/38)/2+56) & "/5/" & A1;7)-34
easter_day_cromagno = DateAdd("d", -34, WorksheetFunction.Floor(CDate(Day(Minute(yr / 38) / 2 + 56) & "/5/" & yr), 7))
End Function |
di Raffaele_53 data: 29/07/2016 14:49:31
>>>Perchè dici "tanto non risponderò più a nessuno" ?
Intendevo dire che nel 2100 non potrò verficare e non potrò più rispondere.
Di solito uso la formula in Q simile/uguale a quella di Cromagno
La function allegata nel forum, non l'ho mai usata (dato che l'ho letta mi è sembrato giusto salvarla)
EDIT
@Marius44
Il codice non è mio, però se blocchi l'ultima riga e abiliti la penultima funziona
Funziona sui PC che anno la data di deflault 1900, oppure funziona sui PC che anno la data di deflault 1904
EDIT
di Albatros54 data: 29/07/2016 15:29:35
Spulciando qualche pagina ho trovato questa formula.
Nel caso non va bene , provare ha settare , nelle opzioni di Excel anno 1904.
=VALUTA(("4/"&A1)/7+RESTO(19*RESTO(A1;19)-7;30)*14%;)*7-6 |
Vuoi Approfondire?