Anno bisestile



  • Anno bisestile
    di Riccardo (utente non iscritto) data: 11/12/2008

    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



  • di Big ronnie (utente non iscritto) data: 11/12/2008

    Ciao riccardo,

    non credo che ci sia una funzione in excel che indichi se un anno sia bisestile o no, comunque se vuoi una funzione da inserire in una cella che funzioni come una di excel eccola qui.la devi inserire in un modulo e dopo la trovi nelle funzioni definite dall'utente.

    ciao big
     
    Function Bisestile(target)
    If target Mod 4 = 0 Then Bisestile = "Bisestile" Else Bisestile = "No Bisestile"
    End Function
    



  • di Ricky53 data: 11/12/2008

    Ciao a tutti,
    solo per precisione (direi pignoleria ma simpatica) visto che l'utilizzo di quanto scriverò sarà improbabile:
    la soluzione di big fornisce come bisestili tutti i secoli mentre sono bisestili solo i secoli divisibili per 400 quindi il 1700, 1800, 1900, 2100, 2200, 2300, ecc non sono bisestili.
    il 1600, 2000, 2400 sono bisestili.

    ciao da ricky53


  • Bisestile
    di Riccardo (utente non iscritto) data: 11/12/2008

    Ok, ma la mia funzione era già così strutturata da fornire il bisestile esatto, escluso il secolo e compreso l'anno divisibile per 400;
    ho trovato un altro help più preciso che mi ha indicato la segente funzione, che è decisamente migliore.
    grazie comunque a tutti per gli interventi alla discussione.
    allego il mio codice con la funzione isdate.
    riccardo
     
    Function Bisestile(Anno) ' Restituisce VERO (1) se è bisestile, FALSO (0) se non è bisestile
      If IsDate("29/02/" & Anno) Then ' Funzione IsDate() suggerita da Forum WinTriks "Office"
        Bisestile = 1   ' IsDate() restituisce Vero/Falso (1/0) se data è valida o no
      Else              ' Quindi se 29/02/Anno è/non è valido, cioè Bisestile restituisce 1 o 0
        Bisestile = 0
      End If
    End Function



  • di Big ronnie (utente non iscritto) data: 11/12/2008

    Ciao ricky,

    potresti spiegarmi il perchè? nel mio calendario - (non mi và oltre il 2099) -il febbraio 2096 è bisestile e quindi come mai il 2100 non dovrebbe esserlo?

    ciao big



  • di Ricky53 data: 12/12/2008

    Ciao big,
    come sai l'anno bisestile serve a compensare la durata dell'anno solare rispetto all’anno civile: infatti l'anno solare non è di 365 giorni ma di 365 giorni più 5 ore 48 minuti x secondi y centesimi
    questo comporta che ogni 4 anni avremmo, con il calendario solare, poco meno di un giorno in più rispetto all'anno civile (che è di 365 giorni).

    adesso c’è da spiegare una particolarità (non a tutti nota, introdotta con il calendario gregoriano che è quello attualmente adottato da tutto il mondo tranne alcune nazioni): per compensare i minuti mancanti alle 6 ore, ogni 400 anni dal 1600 in poi si ha un secolo bisestile (1600, 2000, 2400, 2800), tutti gli altri secoli non lo sono. andando avanti si dovrebbe considerare che il 4000, l’8000, il 12000, ecc saranno bisestili.
    spero di essere stato chiaro.
    ciao da ricky53


  • Bisestile
    di Riccardo (utente non iscritto) data: 12/12/2008

    Sulla base di tutti i contributi, per i quali ringrazio tutti, in questo e in altri forum, ho elaborato l'ultima versione della funzione bisestile:
    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 a tutti: è stata una discussione molto interessante!
    riccardo

     
    Function Bisestile(Anno) ' Restituisce Resto divisione se è bisestile, oppure 0 (zero) se non è bisestile
      Bisestile = ((Anno Mod 4) = 0 And (Anno Mod 100)) Or (Anno Mod 400) = 0
    End Function



  • di Ricky53 data: 12/12/2008

    Ciao,

    controlla come hai scritto la funzione.
    comunque no nmi torna la logica.

    con
    1900 (non bisestile)
    1901 (non bisestile)
    1904 (bisestile)
    2000 (bisestile)
    2001 (non bisestile)
    2004 (bisestile)
    2100 (non bisestile)
    2101 (non bisestile)
    2104 (bisestile)

    tu, con la tua soluzione, cosa ottieni?
    prova e fai sapere

    ciao da ricky53


  • Bisestile
    di Riccardo (utente non iscritto) data: 12/12/2008

    Aggiungendo "as boolean" alla dichiarazione di funzione si ottiene il valore vero/falso che è più elegante.
    tuttavia i risultati sono perfetti, assunto che vero = bisestile e falso = non bisestile, si ottiene:

    1900 falso
    1901 falso
    1904 vero
    2000 vero
    2001 falso
    2004 vero
    2100 falso
    2101 falso
    2104 vero

    che corrisponde a verità: infatti i secoli interi (1900, 2100, ecc) non sono bisestili come è stato spiegato sopra, mentre gli anni divisibili per 400 (come 2000, 2400, ecc) sono bisestili. per tutti gli altri anni vale la semplice divisibilità per 4 (cioè: anno mod 4 = 0 ?)
    spero di avere chiarito.
    riccardo
     
    Public Function Bisestile(Anno As Integer) As Boolean 'Restituisce: Vero/Falso se l'anno è/non è bisestile
    Bisestile = ((Anno Mod 4) = 0 And (Anno Mod 100)) Or (Anno Mod 400) = 0
    End Function



  • di Ricky53 data: 12/12/2008

    Ciao,
    mi torna tutto ed i risultati combaciano con le regole.
    anche la prima soluzione che avevi inserito dava gli stessi risultati.

    buon proseguimento
    ciao da ricky53




  • di Riccardo (utente non iscritto) data: 12/12/2008

    Ok, è sempre un piacere incontrarsi, con nuovi interessanti quesiti.
    grazie a tutti, riccardo.



  • di Big ronnie (utente non iscritto) data: 13/12/2008

    Ciao ricky,

    si, sei stato molto chiaro.grazie della spiegazione ed alla prossima(........prima del 4000).

    ciao big