une fonction qui renvoie parfois une date erronée

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 :
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
Pour gérer les années bissextiles j'ai rédigé ceci :
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
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.
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : une fonction qui renvoie parfois une date erronée

Re...


(...)

Il n'y a pas de question bête, seules les réponses peuvent l'être...
C'est agréable...

Pour votre gouverne, j'ai pris le temps de comparer votre proposition du message #27, qui vous donne satisfaction, et ma proposition (bête ?) du message #20.

Résultat : il semble qu'elles donnent rigoureusement les mêmes résultats sauf dans les deux cas suivants :


    • 1[SUP]er[/SUP] mars, année A bissextile ;
    • NbAnnées tel que NbAnnées modulo 40 ;
    • MoisClôture = 2.

    Exemple : 1/03/2000, NbAnnées = 1, MoisClôture = 2.
    Vous obtenez 1/03/2001, j'obtiens 28/02/2001.

    • 1[SUP]er[/SUP] mars, année A commune ;
    • NbAnnées tel que l'année (A + NbAnnées) est bissextile ;
    • MoisClôture = 2.

    Exemple : 1/03/2001, NbAnnées = 3, MoisClôture = 2.
    Vous obtenez 28/02/2004, j'obtiens 29/02/2004.

À vous de voir ce qui est le plus conforme à votre attente.


Bonne nuit.


ℝOGER2327
#6950


Mercredi 4 As 141 (Saint Cravan, boxeur - fête Suprême Quarte)
16 Brumaire An CCXXII, 0,8884h - chervis
2013-W45-3T02:07:55Z
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : une fonction qui renvoie parfois une date erronée

Re,

Ma foi, Roger, je ne pense pas que mon commentaire fut plus déplacé que celui qui l'engendra, à savoir :
Code:
Pourquoi en revenez vous toujours à vos conneries...
En aucun cas mon commentaire vous était destiné. Je vous avais même répondu avec un clin d'œil "thorézien".
Je signale, au passage, qu'un forum, aussi sérieux soit-il, est avant tout destiné pour le fun (en l'occurrence ici de l'esprit) et pas pour se faire rabrouer, même par plus fortiche que soi. Vous en conviendrez, il existe l'art et la manière de répondre. Ne croyez-vous pas que ça commence à bien faire de se faire engueuler par le flic psycho-rigide, le douanier, les gros connards-bac-moins-trois qui voient des terroristes partout, et j'en passe... ? Mais, il est vrai, que nous vivons une époque où il faut la fermer de plus en plus, à moins d'être un "marginal"...
Passons, pour moi c'est oublié. Toujours est-il, je n'ai jamais réussi à obtenir ce que je voulais avec la solution de Dranreb (je dois vraiment être lent !).
Croyez-moi j'ai essayé votre solution du post #20 (même si je n'en saisis pas toutes les subtilités), et si elle avait marché je l'aurais ipso facto adoptée plutôt que ma lourde fonction (j'aime bien les trucs brefs, c'est comme ça qu'on progresse). Vous êtes très bon, et entre autres choses dans les dates qui rapidement peuvent faire disjoncter le pecus vulgum. Au départ, j'ai tenté de rédiger cette fonction pour des année fiscales, disons normales, qui aillent du 01/01/N au 31/12/N. J'ai ensuite voulu généraliser le problème en pouvant choisir n'importe quel type d'année fiscale (01/x/N au dernier jour du mois x - 1/N + 1), et maintenant, en comparant nos 2 fonctions, je constate que nous arrivons aux mêmes résultats.
Dans mon post #24, je prends comme exemple : "=DateSortie(01/12/2000;5;11)". Raisonnant comme si l'année fiscale se clôturait en décembre, je voulais obtenir le 30/11/2004 et votre fonction renvoyait le 30/11/2005. Et vous aviez raison ! J'avais tout simplement oublié que quand l'année fiscale ne commençait pas un 1er janvier, elle s'achevait en N + 1 !

Dans votre post #25, vous signaliez une curiosité avec "=DateSortie(01/12/2000;1;11)" qui renvoyait bizarrement le 30/11/2000 au lieu du 30/11/2001.
Maintenant, que ce soit avec votre fonction du post #20 ou ma fonction que j'avais corrigée suite à cette remarque, le bon résultat est renvoyé.

Enfin, dans votre dernier post, vos exemples sont pertinents, car vous démontrez sans appel que ma fonction beugue (¡mierda!).

En tout cas, cet exercice de dates fut un bon remède pour retarder la "germanisation" du cerveau.

Bonne soirée et merci pour votre fonction.

PS : comment fait-on pour mettre des bulles avec des commentaires ?
 

Discussions similaires

Réponses
2
Affichages
654