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:

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,

On peut décréter que le nombre de jours affectés au dernier mois ne doit pas dépasser le nombre de jours de ce mois.

Donc limiter ce mois à son dernier jour, voyez ce fichier (3), en VBA ce n'est pas trop compliqué :
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, dat As Date, 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
dat = DateSerial(Year(dat2), Month(dat2) + test, Day(dat1))
If Month(dat) <> Month(DateSerial(Year(dat2), Month(dat2) + test, 1)) Then dat = DateSerial(Year(dat2), Month(dat2) + test + 1, 0) 'fin de mois
j = dat2 - dat
AnsMoisJours = RTrim(IIf(a, a & " an" & IIf(a = 1, " ", "s "), "") & IIf(m, m & " mois ", "") & IIf(j, j & " jour" & IIf(j = 1, "", "s"), ""))
End Function
Bonne journée.
 

Pièces jointes

  • AnsMoisJours(3).xlsm
    17.5 KB · Affichages: 6

job75

XLDnaute Barbatruc
Par formule dans ce fichier (3) on y arrive avec FIN.MOIS et une définition assez lourde du nom j :
Code:
=B1-MIN(DATE(ANNEE(B1);MOIS(B1)-(B1<DATE(ANNEE(B1);MOIS(B1);JOUR(A1)));JOUR(A1));FIN.MOIS(DATE(ANNEE(B1);MOIS(B1)-(B1<DATE(ANNEE(B1);MOIS(B1);JOUR(A1)));1);0))
 

Pièces jointes

  • DATEDIF(3).xlsx
    10.3 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
bonjour Job75
  1. j'ai shunté le booleen avec ABS
  2. j'ai ajouté l'ordre et le désordre dat1 >dat2 et inversement
  3. j'ai mis la date2 en optional pour age
  4. j'ai ajouté l'identification de l'erreur dans le retour Invalid Argmt (1) ou (2) ou (1)(2)
  5. on injecte une date OU ! le string d'une date

VB:
Function Datediff_AMJ$(ByVal dat1, Optional ByVal dat2 = 0)
    Dim a%, m%, j%, dtemp As Date, Erreur$
    If dat2 = 0 Then dat2 = Date
    Erreur = IIf(Not IsDate(dat1), "(1)", ""): Erreur = Erreur & IIf(Not IsDate(dat2), "(2)", ""): Erreur = IIf(Erreur <> "", "Invalid Argmt(" & Erreur & ")", "")
    If Erreur <> "" Then Datediff_AMJ = Erreur: Exit Function
    dat1 = CDate(dat1): dat2 = CDate(dat2)
    If dat1 > dat2 Then dtemp = dat1: dat1 = dat2: dat2 = dtemp
    a = Evaluate("DATEDIF(" & CDbl(dat1) & "," & CDbl(dat2) & ",""y"")")
    m = Evaluate("DATEDIF(" & CDbl(dat1) & "," & CDbl(dat2) & ",""ym"")")
    j = Abs(DateSerial(Year(dat1) + a, Month(dat1) + m, Day(dat1)) - dat2)
    Datediff_AMJ = RTrim(IIf(a, a & " an" & IIf(a = 1, " ", "s "), "") & IIf(m, m & " mois ", "") & IIf(j, j & " jour" & IIf(j = 1, "", "s"), ""))
End Function

Sub test()
    MsgBox Datediff_AMJ("02/02/2020", "25/01/2017")
    MsgBox Datediff_AMJ("25/01/2017", "02/02/2020")
    MsgBox Datediff_AMJ("04/03/1970")
    MsgBox Datediff_AMJ("toto", "titi")
    MsgBox Datediff_AMJ("25/04/2016", "titi")
End Sub

formule:
=Datediff_AMJ(A2;B2)

Capture.JPG
 

Modeste geedee

XLDnaute Barbatruc
Bonsour® les participants à ce fil...
un classeur récap essayant de montrer les aleas des différentes méthodes proposées. (macro, DATEDIF, Durée moyenne)
je le répète, il n'y a pas de solution exacte au sens mathématique, et comme l'a fait remarquer Gérard, chaque approche est affaire de choix assumé quant au résultat souhaité (compréhension, adaptabilité, mise en oeuvre)
 

Pièces jointes

  • AnsMoisJours(recap).xlsm
    47.7 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
re
bonsoir Modeste geedee
perso comme une date ne précise pas l'heure je part du principe que c'est la date+heure 00:00:01 pour le debut et la date de fin -1 jour + heure 23:59:59
ce qui fait que le jour de la date de fin n'est pas compté celui du jour debut oui
 

Dranreb

XLDnaute Barbatruc
il n'y a pas de solution exacte au sens mathématique
S'il s'agit de décomposer de vraies durées, physiques je veux dire, pour des calculs de vieillissement par exemple, et non des nombre de jours, mois et années calendaires comptabilisés depuis une certaine date, je ne suis pas d'accord avec cette déclaration. Mais une telle solution exacte doit se détacher complètement de la durée en jours entiers purement conventionnelle et arbitraire de chaque année particulière, parce que c'est celle ci qui est systématiquement fausse, pas l'autre quand même ! Chaque année pouvant se définir comme la durée de révolution de la terre autour du soleil, elle à bien une durée à peu près constante de 365,2425 jours. En prenant un douzième de cela pour la durée du mois, on calcule facilement une véritable durée entre deux dates exprimée en jours, mois et années pour faciliter son appréciation. Mais il ne faudrait pas s’amuser à vérifier en recomptant tout ça dans un calendrier, parce que celui ci est faux ! Et ce n'est pas une histoire de moyenne de ce qu'il y a dans le calendrier, il ne faut pas inverser les rôles: c'est le calendrier qui arrange sa sauce pour coller à la longue avec des choses constantes et non dont il faudrait calculer des moyennes parce qu'elle seraient variables.
 
Dernière édition:

Maxime 59

XLDnaute Nouveau
Bonjour patricktoulon,

Si j'ai bien compris ce que tu souhaites faire en formule, tu peux utiliser ceci:

en A1 (date de départ)
en B1 (date de fin)

formule:
=SI(DATEDIF(A1;B1;"y")=0;"";SI(DATEDIF(A1;B1;"y")=1;DATEDIF(A1;B1;"y")&" an ";DATEDIF(A1;B1;"y")&" ans ")) & SI(DATEDIF(A1;B1;"ym")=0;"";DATEDIF(A1;B1;"ym")&" mois ") & SI(DATEDIF(A1;B1;"md")=0;"";SI(DATEDIF(A1;B1;"md")=1;DATEDIF(A1;B1;"md")&" jour";DATEDIF(A1;B1;"md")&" jours"))

Cordialement,
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Maxime 59
Bonjour patricktoulon,

Si j'ai bien compris ce que tu souhaites faire en formule, tu peux utiliser ceci:

en A1 (date de départ)
en B1 (date de fin)

formule:
=SI(DATEDIF(A1;B1;"y")=0;"";SI(DATEDIF(A1;B1;"y")=1;DATEDIF(A1;B1;"y")&" an ";DATEDIF(A1;B1;"y")&" ans ")) & SI(DATEDIF(A1;B1;"ym")=0;"";DATEDIF(A1;B1;"ym")&" mois ") & SI(DATEDIF(A1;B1;"md")=0;"";SI(DATEDIF(A1;B1;"md")=1;DATEDIF(A1;B1;"md")&" jour";DATEDIF(A1;B1;"md")&" jours"))

Cordialement,
la constante md bug sur 2007 c'est pour ça que je l'ai éliminé de l’équation sinon tu pense bien que je m'en serais servi ;)
je répète je travaille sur 2007 ou 2013
 

Dranreb

XLDnaute Barbatruc
Heu … seule celle de la colonne D est de moi, celle de la colonne C je l'ai simplement repompée du poste #38 de Maxime 59 pour montrer qu'elle donnait des résultats variables allant de "6 mois 16 jours" à "6 mois 19 jours" alors qu'il y a partout 200 jours d'écart, tandis que ma fonction perso dit toujours "6 mois, 2 sem. et 3 jours"
 

Discussions similaires

Statistiques des forums

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