PDA

Visualizza versione completa : Anno Bisestile in EXCEL


riccardonard
11-12-2008, 12.50.45
Esiste una funzione in excel (e/o la corrispondente in vba), per determinare se un anno, passato come parametro alla funzione, è bisestile?
io me ne sono costruita una con alcuni artifici, ma mi piacerebbe sapere se esiste già integrata nel set di istruzioni.
se può interessare a qualcuno allego anche il codice della mia funzione.
grazie se qualcuno risponderà.


Function Bisestile(Anno) ' Restituisec VERO (1) se è bisestile, FALSO (0) se non è bisestile
Data = "29/02/" & Anno
If StrComp(Data, DateSerial(Anno, 2, 29)) = 0 Then ' DateSerial restituisce una data valida,
Bisestile = 1 ' perciò se non esiste il 29 Febbraio allora restituisce 1 Marzo dell'anno passato
Else
Bisestile = 0
End If
End Function


Saluti - Riccardo

miciomao
11-12-2008, 14.52.25
mi sembra ben fatta
potresti limitarla così

MyDate = "29/02/2012" 'come hai scritto tu la costante cmq sarà 29/02
If IsDate(MyDate) Then
MsgBox "E' bisestile"
Else
MsgBox "Non è bisestile"
End If


Ciao
Alex

riccardonard
11-12-2008, 16.17.19
Effettivamente con l'istruzione suggerita da te, la funzione diventa più diretta, senza comparazioni artificiose; in pratica il programma prevede già che la data sia o non sia valida, che corrisponde a dire che l'anno è bisestile o no. La funzione assume questo aspetto più immediato ed elegante:

Function Bisestile(Anno) ' Restituisce VERO (1) se è bisestile, FALSO (0) se non è bisestile
If IsDate("29/02/" & Anno) Then
Bisestile = 1
Else
Bisestile = 0
End If
End Function


Ti ringrazio per il tuo utile intervento. Per la cronaca: la funzione mi è servita per costruire un calendario annuale perpetuo in F.to A4, dove finalmente riesco a leggere i giorni; sui calendarietti tascabili non si legge niente!
Basta cambiare l'anno e si ottiene automaticamente il calendario, senza la pretesa dei santi e delle lune che a me non interessano.

Grazie ancora, ciao
Riccardo

miciomao
11-12-2008, 16.32.25
Una volta DateSerial IsDate DateDiff DateAdd e tante altre non esistevano.
Guarda questa che Sciccheria :D

Public Function Bisestile(Anno As Integer) As Boolean
'Restituisce: true se l'anno è bisestile
Bisestile = ((Anno Mod 4) = 0 And (Anno Mod 100)) Or (Anno Mod 400) = 0
End Function

Ciao
Alex

riccardonard
12-12-2008, 09.57.33
In realtà non restituisce Vero o Falso ma restituisce il resto della divisione al secolo intero, cioè: Bisestile(1996) restituisce 96, Bisestile(2052) restituisce 52, Bisestile(2008) restituisce 8, e così via; in tutti gli altri casi di anni non bisestili ovviamente restituisce 0; quindi con questa distinzione si intercetta l'anno bisestile (esattamente come Vero/Falso).
Questa ultima è sicuramente la funzione più elegante e di più "BASSO LIVELLO", dato che non ricorre ad alcun artificio, ma sfrutta la primaria definizione aritmetica di anno bisestile.
GRAZIE: è stata una discussione molto interessante!
Riccardo

riccardonard
12-12-2008, 10.37.13
In realtà non restituisce Vero o Falso ma restituisce il resto della divisione al secolo intero, cioè: Bisestile(1996) restituisce 96, Bisestile(2052) restituisce 52, Bisestile(2008) restituisce 8, e così via; in tutti gli altri casi di anni non bisestili ovviamente restituisce 0; quindi con questa distinzione si intercetta l'anno bisestile (esattamente come Vero/Falso).
Questa ultima è sicuramente la funzione più elegante e di più "BASSO LIVELLO", dato che non ricorre ad alcun artificio, ma sfrutta la primaria definizione aritmetica di anno bisestile.
GRAZIE: è stata una discussione molto interessante!
Riccardo

Mi correggo: ho detto una sciocchezza perché avevo dimenticato di scrivere "As Boolean"; con questa precisazione in valore restituito è effettivamente Vero/Falso, e non il resto della divisione. Restano inalterate tutte le altre considerazioni.
Riccardo

riccardonard
12-12-2008, 11.48.09
Mi correggo: ho detto una sciocchezza perché avevo dimenticato di scrivere "As Boolean"; con questa precisazione in valore restituito è effettivamente Vero/Falso, e non il resto della divisione. Restano inalterate tutte le altre considerazioni.
Riccardo
Debbo ancora precisare per correttezza che io faccio tesoro dei suggerimenti interessanti e, non solo li applico ai miei programmi, ma li ri-suggerisco anche ad altri, in altri forum ai quali partecipo, quando ho qualche cosa di interessante da dire.
Quindi ho condiviso in altro forum di Excel/Vba questa soluzione, dichiarando onestamente che non era farina del mio sacco, ma un suggerimento recepito in questo forum.
La logica e l'interesse è quello di condividere col massimo numero di utenti possibile, la cultura acquisita.
Spero che questo appartenga ad un comportamento etico e generoso; comunque è con questo spirito che io agisco e non con la volontà di "rubare" ad alcuno gli interessanti suggerimenti che riesco a "fare miei".
Grazie ancora a tutti.
Riccardo