Magic_Doctor
XLDnaute Barbatruc
Bonsoir,
J'ai rédigé une petite fonction me permettant de récupérer la même date (jour et mois) des années après une date donnée, mais sous certaines conditions.
Il y a 2 dates "stratégiques" : le premier janvier et le dernier jour du mois de février.
La fonction s'appelle : DateSortie ---> DateSortie(madate As Date, nbyears As Byte)
Exemples :
DateSortie(15 mars 2004, 6) <=> 6 ans après le 15 mars 2004 --> 15 mars 2010
Dates "stratégiques" :
1/ 1er janvier : DateSortie(1er janvier 2004, 6) <=> 6 ans après le 1 janvier 2004 --> 31 décembre 2009
2/ dernier jour du mois de février :
a) c'est un 28 : DateSortie(28 février 2004, 6) <=> 6 ans après le 28 février 2004 --> 28 février 2010
b) c'est un 29 : DateSortie(29 février 2004, 6) <=> 6 ans après le 29 février 2004 --> 28 février 2010 (2004 est une année bissextile et pas 2010)
c'est toujours un 29 : DateSortie(29 février 2004, 8) <=> 8 ans après le 29 février 2004 --> 29 février 2012 (2012 est encore une année bissextile)
La fonction :
Pour gérer les années bissextiles j'ai rédigé ceci :
Et bien, contre toute attente, ça plante mais uniquement quand on choisit un 29 février et que le le nombre d'années rajoutées ne soit pas un multiple de 4, autrement dit quand on ne tombe pas sur une année bissextile.
Si parmi vous quelqu'un pouvait m'aider à solutionner ce problème.
Merci d'avance.
J'ai rédigé une petite fonction me permettant de récupérer la même date (jour et mois) des années après une date donnée, mais sous certaines conditions.
Il y a 2 dates "stratégiques" : le premier janvier et le dernier jour du mois de février.
La fonction s'appelle : DateSortie ---> DateSortie(madate As Date, nbyears As Byte)
Exemples :
DateSortie(15 mars 2004, 6) <=> 6 ans après le 15 mars 2004 --> 15 mars 2010
Dates "stratégiques" :
1/ 1er janvier : DateSortie(1er janvier 2004, 6) <=> 6 ans après le 1 janvier 2004 --> 31 décembre 2009
2/ dernier jour du mois de février :
a) c'est un 28 : DateSortie(28 février 2004, 6) <=> 6 ans après le 28 février 2004 --> 28 février 2010
b) c'est un 29 : DateSortie(29 février 2004, 6) <=> 6 ans après le 29 février 2004 --> 28 février 2010 (2004 est une année bissextile et pas 2010)
c'est toujours un 29 : DateSortie(29 février 2004, 8) <=> 8 ans après le 29 février 2004 --> 29 février 2012 (2012 est encore une année bissextile)
La fonction :
VB:
Function DateSortie2(madate As Date, nbyears As Byte) As Date
'Renvoie la date correspondant à une date donnée + un nombre d'années donné.
'Si la date de départ commence un 1er janvier, la date résultante s'achèvera le 31/12 de l'année [a + duration - 1]
'Magic_Doctor
Dim j As Byte, m As Byte, a As Integer, x As Byte
j = Day(madate): m = Month(madate): a = Year(madate)
If j = 1 And m = 1 Then 'la 1ère annuité sera complète (non proratisée)
j = 31: m = 12: x = 1 '31 décembre
ElseIf j = 29 And m = 2 Then 'dernier jour de février d'une année bissextile
j = IIf(IsBissextile(madate) = True, 29, 28)
End If
DateSortie2 = CDate(j & "/" & m & "/" & a + nbyears - x)
End Function
VB:
Function IsBissextile(fecha As Date) As Boolean
'Vérifie si, dans une date, l'années est bissextile ou pas (tient compte des années théoriquement bissextiles et qui ne le sont en fait pas, ex. 1900 / 2100...)
If Year(fecha) Mod 4 = 0 And Year(fecha) Mod 100 = 0 And Year(fecha) Mod 400 = 0 Then
IsBissextile = True
ElseIf Year(fecha) Mod 4 = 0 And Year(fecha) Mod 100 = 0 And Year(fecha) Mod 400 <> 0 Then
IsBissextile = False
ElseIf Year(fecha) Mod 4 = 0 Then
IsBissextile = True
End If
End Function
Si parmi vous quelqu'un pouvait m'aider à solutionner ce problème.
Merci d'avance.
Dernière édition: