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";"")
 

R@chid

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

Bonsoir @ tous,
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";"")
Est-ce que tu as bien lu la question ???


@ + +
 

Regueiro

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

Re
En effet j'ai une erreur.
Autant pour moi ?
Avec les mes 2 valeurs en A1 et B1 ok
Si je change la date A1 ex : 01.01.1999 ne marche plus.
Merci.
 

R@chid

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

Re,
La question c'est : compter le nombre d’années bissextiles entre 2 dates données

@ + +
 

Regueiro

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

Re R@chid

C'est juste j'ai mal compris la question.

Voilà un code identique au tien

Code:
=SOMMEPROD(N(MOIS(DATE(LIGNE(INDIRECT(ANNEE(B119)&":"&ANNEE(C119)));2;29))=2))&" Ans"
MErci

Bonne soirée
 

Regueiro

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

Bonsoir à Tous
Magic Doctor

Je reviens sur le problème des années Bissextiles.

Sub nombredejours()
Dim NbrJour As Long
Dim NbrAnnée As Long
Dim NbrAnnéeBisex

Dim Date1 As Date

Date2 = Sheets("Hoja1").Range("C4").Value
Date1 = Sheets("Hoja1").Range("C3").Value

Temp1 = DateSerial(Year(Date2), 12, 31) - DateSerial(Year(Date1), 1, 1) + 1
Temp11 = Format(Temp1, "###")

MsgBox "Il y a " & Temp11 & " Jours"

NbrJour = DateDiff("d", Date1, Date2)


MsgBox NbrJour & " Jours"

NbrAnnée = DateDiff("yyyy", Date1, Date2)
MsgBox NbrAnnée & " Ans"

NbrAnnéeBisex = Temp11 - ((NbrAnnée + 1) * 365)
MsgBox "Il y a " & NbrAnnéeBisex & " Années Bissextiles dans cette Période"



End Sub
Il suffira de créer une fonction avec ??
Je regarde demain.
A+
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas