Autres inclure des si dans une formule datedif

patricktoulon

XLDnaute Barbatruc
Bonjour a tous

je voudrais inclure des si dans une formule datedif
en effet j'ai une formule qui peut me donner comme résultat
0 ans 0 mois 15 jours

je voudrais inclure des si si les valeurs an et mois et jour donne zero
l'exemple précédemment donné devrait donner par exemple simplement 15 jours
et pour parfaire la chose je voudrais aussi des si >1 mettre les "s"

la formule
=DATEDIF(A1;B1;"y")&" Ans "
&DATEDIF(A1;B1;"ym")&" mois "
&DATEDIF(DATE(ANNEE(B1);MOIS(B1);JOUR(A1));B1;"d")&" jours"
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bon j'espere ne pas encore tomber sur des dates qui vont planter

la formule sans name
=SUPPRESPACE(REPT(DATEDIF(Feuil1!A2;Feuil1!B2;"y")&" an"&SI(DATEDIF(Feuil1!A2;Feuil1!B2;"y")=1;" ";"s ");DATEDIF(Feuil1!A2;Feuil1!B2;"y")>0)&REPT(DATEDIF(Feuil1!A2;Feuil1!B2;"ym")&" mois ";DATEDIF(Feuil1!A2;Feuil1!B2;"ym")>0)&REPT(Feuil1!B2-DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2)-(Feuil1!B2<DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2);JOUR(Feuil1!A2)));JOUR(Feuil1!A2))&" jour"&REPT("s";Feuil1!B2-DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2)-(Feuil1!B2<DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2);JOUR(Feuil1!A2)));JOUR(Feuil1!A2))>1);Feuil1!B2-DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2)-(Feuil1!B2<DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2);JOUR(Feuil1!A2)));JOUR(Feuil1!A2))>0))

pour l'ecrire car ca devient difficile de voir une erreur vu la longueur

VB:
Sub test()
    f = "=SUPPRESPACE(REPT(fan&"" an""&SI(fan=1;"" "";""s "");fan>0)&REPT(fmois&"" mois "";fmois>0)&REPT(fjour&"" jour""&REPT(""s"";fjour>1);fjour>0))"
    fan = "DATEDIF(Feuil1!A2;Feuil1!B2;""y"")"
    fmois = "DATEDIF(Feuil1!A2;Feuil1!B2;""ym"")"
    fjour = "Feuil1!B2-DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2)-(Feuil1!B2<DATE(ANNEE(Feuil1!B2);MOIS(Feuil1!B2);JOUR(Feuil1!A2)));JOUR(Feuil1!A2))"

    f = Replace(Replace(Replace(f, "fan", fan), "fmois", fmois), "fjour", fjour)
    Debug.Print f
End Sub
 

patricktoulon

XLDnaute Barbatruc
résultat pour la méthode de Job75
Capture.JPG

ça me parait correct
 

job75

XLDnaute Barbatruc
En VBA cette fonction semble bien convenir :
VB:
Function AnsMoisJours$(dat1, dat2)
If Not IsDate(dat1) Or Not IsDate(dat2) Then Exit Function
If dat2 < dat1 Then Exit Function
Dim test As Boolean, a%, m%, j%
test = dat2 < DateSerial(Year(dat2), Month(dat2), Day(dat1)) 'True = -1
a = Year(dat2) - Year(dat1) + test
m = Month(dat2) - Month(dat1) + test
If m < 0 Then m = m + 12
j = dat2 - DateSerial(Year(dat2), Month(dat2) + test, Day(dat1))
AnsMoisJours = RTrim(IIf(a, a & " an" & IIf(a = 1, " ", "s "), "") & IIf(m, m & " mois ", "") & IIf(j, j & " jour" & IIf(j = 1, "", "s"), ""))
End Function
 

Pièces jointes

  • AnsMoisJours(1).xlsm
    16.9 KB · Affichages: 10
Dernière édition:

job75

XLDnaute Barbatruc
Bon dans ce fichier (2) je reprends exactement en VBA ce que j'ai fait par formule :
VB:
Function AnsMoisJours$(dat1, dat2)
If Not IsDate(dat1) Or Not IsDate(dat2) Then Exit Function
If dat2 < dat1 Then Exit Function
Dim a%, m%, test As Boolean, j%
a = Evaluate("DATEDIF(" & CDbl(dat1) & "," & CDbl(dat2) & ",""y"")")
m = Evaluate("DATEDIF(" & CDbl(dat1) & "," & CDbl(dat2) & ",""ym"")")
test = dat2 < DateSerial(Year(dat2), Month(dat2), Day(dat1)) 'True = -1
j = dat2 - DateSerial(Year(dat2), Month(dat2) + test, Day(dat1))
AnsMoisJours = RTrim(IIf(a, a & " an" & IIf(a = 1, " ", "s "), "") & IIf(m, m & " mois ", "") & IIf(j, j & " jour" & IIf(j = 1, "", "s"), ""))
End Function
 

Pièces jointes

  • AnsMoisJours(2).xlsm
    17.1 KB · Affichages: 8

Modeste geedee

XLDnaute Barbatruc
Bonjour®
Bon dans ce fichier (2) je reprends exactement en VBA ce que j'ai fait par formule :
les durées de mois et années n'étant pas des constantes mathématiques,
les habitués savent ici ce que je pense de la représentation d'un âge en année mois jours:cool:
[MODE o_O ]
1571943990846.png

il y a 2 jours jusque fin de mois janvier 2016
il y a 22 jours en début mars 2020 soit 24 jours (22 si l'on exclu les bornes)
si l'on considère 4 années entières et 1 mois complets
comment expliquer le 21 jours obtenu ??
[/MODE o_O ]

;);););)
 

patricktoulon

XLDnaute Barbatruc
re
si on considère la date 2 à 22/03/2020 00:00:00 le 22 jour ne peut pas être compté
et pareil pour le jour date 1 on considere quoi? 00:00:00 ou 23:59:59
je pense que la on peut simplement ajouter une option true/false a la fonction vba et laisser le choix a l'utilisateur de borner -1/+1
 

Modeste geedee

XLDnaute Barbatruc
Bonjour®
Avec la méthode que j'ai utilisée, 1 mois après le 30/01/2020 nous amène au 01/03/2020 (29 + 1).
Il faut bien se donner une méthode, qui ne fait rien n'a rien :cool:
:) je ne remet pas en cause la méthode...

le problème est biaisé dès qu'on le pose !!!
"les durées de mois et années ne sont pas des constantes mathématiques"
:) il faut manger 5 fruits ou légumes par jour !! (cerises ou pastèques ???)

l'anomalie signalée #25 devient kafkaïenne si le nombre de jour cumulés (jusque fin mois début + jours début mois fin) dépasse 29jr
dans ce cas on doit ajouter un mois entier et réduire la fraction de jours résiduels...
Quelle durée de mois choisir ???
  • durée de mois début ou bien durée de mois fin
  • ou encore durée de mois la plus ou la moins représentée dans la décomposition en mois
  • ou autre durée.
:cool:la méthode qui me semble la plus satisfaisante (vue de l'esprit)
est celle des durées moyennes: 365.25 et 365.25/12
bien que inconsistante, elle est réversible .
et qui pour une même durée totale en jours donne toujours le même résultat AMJ indépendamment des dates de début et de fin.

:rolleyes: Par curiosité connaîtrais-tu d'autres applications intégrant l'équivalent de DATEDIF ou cette représentation AMJ et éventuellement les anomalies ou bugs y attachés ??
dès l'origine d'Excel les anomalies de DATEDIF ont été signalées, à mettre relation avec le fait que cette fonction ne soit plus documentée depuis plus de bientôt 20 ans !!!
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
re
si on considère la date 2 à 22/03/2020 00:00:00 le 22 jour ne peut pas être compté
et pareil pour le jour date 1 on considere quoi? 00:00:00 ou 23:59:59
je pense que la on peut simplement ajouter une option true/false a la fonction vba et laisser le choix a l'utilisateur de borner -1/+1
:rolleyes: l'utilisateur n'a bien souvent simplement pas conscience de la complexité de la gestion des dates et calendriers.
 

Discussions similaires

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 206
dernier inscrit
diambote