Compter le nombre d'années bissextiles entre 2 dates

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je voudrais connaître le nombre d'années bissextiles entre 2 dates.
J'ai tenté au travers d'une fonction que j'ai rédigée :
VB:
Function NbAnBissext(dat1 As Date, dat2 As Date) As Byte 'dans mon application je ne parcourerai pas plus de 50 années
'Compte le nombre d'années bissextiles entre 2 dates

    Dim año1 As Integer, año2 As Integer, nba As Byte, i As Byte, nbab As Byte

    año1 = Year(dat1): año2 = Year(dat2)
    nba = año2 - año1

    For i = 0 To nba - 1
        If LeapYear(Year(dat1 + i)) Then nbab = nbab + 1
    Next

    NbAnBissext = nbab

End Function
----------------------------------------------------------------------
Function LeapYear(a%) As Boolean
'Vérifie si une année est bissextile ou pas (tient compte des années théoriquement bissextiles et qui ne le sont en fait pas, comme 1800/1900/2100...)
'- a : une année quelconque
'ROGER2327
    LeapYear = ((a Mod 4) = 0) * (1 + ((a Mod 100) = 0) * (1 + (((a \ 100) Mod 4) = 0)))
End Function
mais ça me renvoie toujours le nombre d'années entre les 2 dates.
Merci pour tout coup de main.
 

kjin

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Salut,
Code:
Function NbAnBissext(dat1 As Date, dat2 As Date) As Byte
Dim an1%, an2%, i%
an1 = Year(dat1): an2 = Year(dat2)
For i = an1 To an2 'ou an1+1 To an2-1 si strictement entre les 2 années
    If LeapYear(i) Then NbAnBissext = NbAnBissext + 1
Next
End Function

Function LeapYear(a%) As Boolean
'ROGER2327
   LeapYear = ((a Mod 4) = 0) * (1 + ((a Mod 100) = 0) * (1 + (((a \ 100) Mod 4) = 0)))
End Function
A+
kjin
 
Dernière édition:

R@chid

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Bonjour @ tous,
Salut Kjin, ça fait longtemps :),
Par formule,
A1:B1 contient les 2 dates,
Code:
=SOMMEPROD(N(JOUR(DATE(LIGNE(INDIRECT(ANNEE(A1)&":"&ANNEE(B1)));3;0))=29))

@ + +
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Bonjour à tous.


Une variante :​
VB:
Function NombreDeBissextesEntre%(a As Date, b As Date)
'Cherche le nombre de bissextes dans l'intervalle [a,b], (a<=b).
Dim l%
    For l = Year(a) - (a >= DateSerial(Year(a), 3, 1)) To Year(b) + (b <= DateSerial(Year(b), 2, 28))
        NombreDeBissextesEntre = NombreDeBissextesEntre - (Day(DateSerial(l, 3, 0)) = 29)
    Next
End Function


ℝOGER2327
#6964


Lundi 9 As 141 (Equarrissage pour tous - Vacuation)
21 Brumaire An CCXXII, 0,8378h - bacchante
2013-W46-1T02:00:38Z
 

job75

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Bonjour le fil, le forum,

Une autre solution par formule :

Code:
=("1/"&ANNEE(B1)+1)-("1/"&ANNEE(A1))-365*(1+ANNEE(B1)-ANNEE(A1))
simplement transcrite dans cette fonction VBA :

Code:
Function NBISSEX%(d1 As Date, d2 As Date)
NBISSEX = CDate("1/" & Year(d2) + 1) - CDate("1/" & Year(d1)) - 365 * (1 + Year(d2) - Year(d1))
End Function
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Re,

Juste une remarque si A1 est 01/01/1900 et B1 11/11/2013 :

- la formule renvoie 29

- la fonction VBA renvoie 28.

C'est à cause de ce fameux 29/02/1900 cher à Roger :D

A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Bonjour à tous,

J'ai légèrement modifié la solution de kjin afin de calculer le nombre de "29 février" entre 2 dates, ceci afin de calculer le nombre de jours entre 2 dates comme s'il s'agissait d'années de toujours 365 jours (années dites fiscales) :
VB:
Function Nb29Fev(dat1 As Date, dat2 As Date) As Byte
'Compte le nombre de "29 février" dans l'intervalle [dat1,dat2] (dat1<dat2)
    Dim i%, x As Byte, y As Byte
    If Month(dat1) > 2 Then x = 1
    If Month(dat2) < 2 Then y = 1
    For i = Year(dat1) + x To Year(dat2) - y
        If LeapYear(i) Then Nb29Fev = Nb29Fev + 1
    Next
End Function
----------------------------------------------------------
Function LeapYear(a%) As Boolean
'Vérifie si une année est bissextile ou pas (tient compte des années théoriquement bissextiles et qui ne le sont en fait pas, comme 1800/1900/2100...)
'- a : une année quelconque
'ROGER2327
    LeapYear = ((a Mod 4) = 0) * (1 + ((a Mod 100) = 0) * (1 + (((a \ 100) Mod 4) = 0)))
End Function
Si les années ont toutes 365 jours, le nombre de jours entre dat1 et dat2 sera : dat2 - dat1 - Nb29Fev(dat1, dat2)
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Re,

Bon si l'on veut le nombre de 29 février entre deux dates on peut continuer ainsi :

Code:
=("1/"&ANNEE(B1)+1)-("1/"&ANNEE(A1))-365*(1+ANNEE(B1)-ANNEE(A1))-SI(ESTNUM(-("29/2/"&ANNEE(A1)));A1>--("29/2/"&ANNEE(A1)))-SI(ESTNUM(-("29/2/"&ANNEE(B1)));B1<--("29/2/"&ANNEE(B1)))
Edit : en simplifié mais plus difficile à comprendre :

Code:
=("1/"&ANNEE(B1)+1)-("1/"&ANNEE(A1))-365*(1+ANNEE(B1)-ANNEE(A1))-NB(LN(A1-("29/2/"&ANNEE(A1)));LN(("29/2/"&ANNEE(B1))-B1))
transcrite en VBA :

Code:
Function Nb29Fev%(d1 As Date, d2 As Date)
Nb29Fev = CDate("1/" & Year(d2) + 1) - CDate("1/" & Year(d1)) - 365 * (1 + Year(d2) - Year(d1))
If IsDate("29/2/" & Year(d1)) Then If d1 > CDate("29/2/" & Year(d1)) Then Nb29Fev = Nb29Fev - 1
If IsDate("29/2/" & Year(d2)) Then If d2 < CDate("29/2/" & Year(d2)) Then Nb29Fev = Nb29Fev - 1
End Function
A+
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Bonjour à tous.


(...)
J'ai légèrement modifié la solution de kjin afin de calculer le nombre de "29 février" entre 2 dates (...)
Problème traité dès le message #5...​


ℝOGER2327
#6965


Lundi 9 As 141 (Equarrissage pour tous - Vacuation)
21 Brumaire An CCXXII, 6,5843h - bacchante
2013-W46-1T15:48:08Z
 

job75

XLDnaute Barbatruc
Re : Compter le nombre d'années bissextiles entre 2 dates

Re,

Une solution bien moins performante que celle du post #9 :

Code:
=SOMMEPROD(N(TEXTE(A1+LIGNE(INDIRECT("1:"&1+B1-A1))-1;"jjmm")="2902"))
Code:
Function Nb29Fev%(d1 As Long, d2 As Long)
Nb29Fev = Evaluate("SUM(N(TEXT(" & d1 & "+ROW(1:" & 1 + d2 - d1 & ")-1,""ddmm"")=""2902""))")
End Function
Le nombre de jours entre les 2 dates ne peut dépasser 65536 (179 ans) sur Excel 2003 et 1048576 (2870 ans) sur Excel 2007/2010.

Le calcul peut prendre du temps...

Et bien sûr avec Evaluate la fonction VBA considèrera que le 29/02/1900 existe.

Edit : bien noter que les dates d1 et d2 sont déclarées As Long.

On peut les déclarer As Date en ajoutant un CDbl :

Code:
Function Nb29Fev%(d1 As Date, d2 As Date)
Nb29Fev = Evaluate("SUM(N(TEXT(" & CDbl(d1) & "+ROW(1:" & 1 + d2 - d1 & ")-1,""ddmm"")=""2902""))")
End Function
A+
 
Dernière édition:

Regueiro

XLDnaute Impliqué
Re : Compter le nombre d'années bissextiles entre 2 dates

Bonsoir à Tous.
Sujet passionnant
Avec un formule
en A1 = 01.01.2000 au format date
en B1 = 02.02.2008 au format date
en C1 la formule suivante :

Code:
=SI(MOD(ENT((B1-A1)/365.25);4)=0;ENT((B1-C1)/365.25)/4+1&" Ans";"")
 

Discussions similaires

Réponses
9
Affichages
511