Roberto si chiede se esista un modo semplice per determinare se l’anno di una particolare data è un anno bisestile, ai fini del calcolo del numero di giorni nell’interesse composto.
Sappiamo tutti che se un anno è divisibile per 4, allora è un anno bisestile, giusto? Beh, in realtà, è sbagliato. Quindi, non puoi semplicemente dividere il numero di un anno per 4, come nell’esempio seguente, per determinare se si tratta di un anno bisestile:
=SE(RESTO(ANNO(A1); 4) = 0; "Bisestile"; "Regolare")
La formula funzionerà per tutte le date all’interno di questo secolo (anni dal 2000 al 2099), ma non funzionerà in modo affidabile al di fuori di tale intervallo. Il motivo è perché “divisibile per 4” non è l’unico test per determinare se un anno è bisestile. Se l’anno è un anno secolare (divisibile per 100), allora è un anno bisestile solo se è divisibile per 400. Quindi l’anno 2000 è un anno bisestile, ma il 2100 non lo è.
Se vuoi un modo sicuro per determinare se una data cade in un anno bisestile, allora la tua formula deve essere più complessa:
=SE(O(E(RESTO(ANNO(A1);4)=0;RESTO(ANNO(A1);100)>0);RESTO(ANNO(A1);400)=0);"Bisestile";"Regolare")
La formula verifica tutte e tre le condizioni necessarie per determinare se una data rientra in un anno bisestile.
Ovviamente, un approccio diverso è quello semplicemente di capire se un dato anno ha un 29 febbraio al suo interno. Esistono numerose formule che potrebbero essere utilizzate per eseguire questa operazione:
=SE(GIORNO(FINE.MESE("1Gen"&ANNO(A1);1))=29; "Bisestile"; "Regolare") =SE(MESE(DATA(ANNO(A1);2;29))=2; "Bisestile"; "Regolare") =SE(GIORNO(DATA(ANNO(A1);2;29))=29; "Bisestile"; "Regolare") =SE(GIORNO(DATA(ANNO(A1);3;0))=29; "Bisestile"; "Regolare")
Tutti i metodi descritti finora funzionano correttamente per qualsiasi data supportata da Excel, con un’eccezione. Quelli che usano la funzione DATA (gli ultimi tre mostrati sopra) non funzioneranno se la data nella cella A1 è nell’anno 1900. Quelli restituiranno sempre che il 1900 è un anno bisestile, anche se non lo è (è interessante notare che la funzione FINE.MESE non presenta lo stesso problema della funzione DATA a questo proposito).
Se devi lavorare con date precedenti a quelle supportate da Excel (prima del 1° gennaio 1900), dovrai lavorare direttamente con gli anni invece di estrarre l’anno da una data di Excel. La variazione sulla formula dei tre test funzionerà bene, se la cella A1 contiene solo un anno:
=SE(O(E(RESTO(A1;4)=0;RESTO(A1;100)>0);RESTO(A1;400)=0);"BIsestile";"Regolare")
È inoltre possibile creare una funzione definita dall’utente (UDF) che verifichi la data. Questo approccio funzionerà perfettamente indipendentemente dal fatto che la cella contenga un valore di data o un valore di testo per una data (se si immette un valore di data non supportato in una cella, ad esempio 1/1/1896, Excel considera la voce come un valore di testo anziché tentare di analizzarlo come una data). L’esempio seguente funziona correttamente con tutte le date supportate da VBA, che è compreso tra l’anno 100 e l’anno 9999:
Questo contenuto è riservato agli abbonati
Solo gli utenti con Abbonamento VBA Coder oppure Ultimate possono visionarlo.
Se sei già abbonato Accedi per sbloccare il contenuto!
In caso contrario abbonati qui! L'abbonamento è conveniente.
E puoi interromperlo in ogni momento e in completa autonomia.
(puoi renderti conto di quanti siano i contenuti riservati
raggiungendo questa pagina)
Per utilizzare la funzione nel tuo foglio di lavoro devi inserire una formula come questa:
=SE(IsLeap1(A1);"Bisestile"; "Regolare")
La seguente macro a riga singola funziona usando il trucco di capire se c’è un 29 febbraio nell’anno in questione:
Questo contenuto è riservato agli abbonati
Solo gli utenti con Abbonamento VBA Coder oppure Ultimate possono visionarlo.
Se sei già abbonato Accedi per sbloccare il contenuto!
In caso contrario abbonati qui! L'abbonamento è conveniente.
E puoi interromperlo in ogni momento e in completa autonomia.
(puoi renderti conto di quanti siano i contenuti riservati
raggiungendo questa pagina)
La macro viene referenziata nel foglio di lavoro allo stesso modo della macro precedente:
=SE(IsLeap2(A1);"Bisestile"; "Regolare")