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
re
bonjour
pour l'instant les seules qui me font pas defaut c'est des fonctions perso celle de job75 ou la mienne


la mienne
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

et la formule de base pour l'utiliser
=Datediff_AMJ(A2;B2)
 
Dernière édition:

BOUBAOM

XLDnaute Junior
re
bonjour
pour l'instant les seules qui me font pas defaut c'est des fonctions perso celle de job75 ou la mienne


la mienne
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

et la formule de base pour l'utiliser
=Datediff_AMJ(A2;B2)
entre toulonnais tu peux me la traduire en formule svp :) je suis perdu avec le langage informatique VBA et j'utilise Excel 2007 qui a a priori buger sur DATEDIF
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonsoir
ben en formule tu prends celle de job75
attention elle est copieuse
=SUPPRESPACE(REPT(DATEDIF(Feuil1!A3;Feuil1!B3;"y")&" an"&SI(DATEDIF(Feuil1!A3;Feuil1!B3;"y")=1;" ";"s ");DATEDIF(Feuil1!A3;Feuil1!B3;"y")>0)&REPT(DATEDIF(Feuil1!A3;Feuil1!B3;"ym")&" mois ";DATEDIF(Feuil1!A3;Feuil1!B3;"ym")>0)&REPT(Feuil1!B3-DATE(ANNEE(Feuil1!B3);MOIS(Feuil1!B3)-(Feuil1!B3<DATE(ANNEE(Feuil1!B3);MOIS(Feuil1!B3);JOUR(Feuil1!A3)));JOUR(Feuil1!A3))&" jour"&REPT("s";Feuil1!B3-DATE(ANNEE(Feuil1!B3);MOIS(Feuil1!B3)-(Feuil1!B3<DATE(ANNEE(Feuil1!B3);MOIS(Feuil1!B3);JOUR(Feuil1!A3)));JOUR(Feuil1!A3))>1);Feuil1!B3-DATE(ANNEE(Feuil1!B3);MOIS(Feuil1!B3)-(Feuil1!B3<DATE(ANNEE(Feuil1!B3);MOIS(Feuil1!B3);JOUR(Feuil1!A3)));JOUR(Feuil1!A3))>0))

voila le resultat
Capture.JPG
 

Dranreb

XLDnaute Barbatruc
Définition des principaux mot utilisés :
— VBA: Langage de programmation "Visual Basic for Applications" intégré dans une application hôte, ici Excel, et muni d'un VBE (Visual Basic Editor) dans lequel on entre par Alt+F11 depuis Excel.
— Module standard: Depuis VBE, dans l'explorateur de projets (faire Ctrl+R pour l'afficher s'il ne l'est pas) ce sont toutes les unités de programmation de la rubrique "Modules" (Une de n'importe quelle autre rubrique est dite "Module objet")
— Function: Procédure commençant par une instruction "Function", admettant des arguments et renvoyant quelque chose qui en dépend.
 

BOUBAOM

XLDnaute Junior
oui ca j'ai compris, mais je disai pouvez vous m'aider a faire le VBA qui me permettra d'avoir le résultat précis (an, mois, jours & heures),entre une date du 4 mai 2016 a 7heures et maintenant(), je sais je suis chiant mais je me soigne ;)
 

Dranreb

XLDnaute Barbatruc
Vous avez de la chance: je me suis amusé à écrire 3 fonctions qui utilisez une même fonction Décomposé :
VB:
Option Explicit
Function DuréeAMJH(ByVal V As Double) As String
   DuréeAMJH = Décomposé(V, "365,2425: an(s);/12: mois;1: jour(s);/24: heure(s)")
   End Function
Function DuréeAMSJ(ByVal V As Double) As String
   DuréeAMSJ = Décomposé(V, "365,2425: an(s);/12: mois;7: semaine(s);1: jour(s)")
   End Function
Function Monnaie(ByVal V As Double) As String
   Monnaie = Décomposé(V, "500:(n)500€;200:(n)200€;/2:(n)100€;/2:(n)50€;20:(n)20€;/2:(n)10€;" _
      & "/2:(n)5€;2:(n)2€;1:(n)1€;/2:(n)50cts;0,2:(n)20ct(s);/2:(n)10cts;/2:(n)5cts;0,02:(n)2cts;/2:(n)1ct")
   End Function
Function Décomposé(ByVal Valeur As Double, ByVal Fmt As String, Optional ByVal Sép As String = ", ", _
   Optional ByVal DernSép As String = " et ") As String
   Dim TJn() As String, Terme As String, N As Long, TSpl() As String, ZU As String, ZT As String, Unité As Double, Nombre As Long, M As Long
   On Error GoTo Er
   TJn = Split(Fmt, ";")
   Do:
      Terme = TJn(N): TSpl = Split(Terme, ":")
      ZU = TSpl(0): ZT = TSpl(1)
      If Left$(ZU, 1) = "/" Then Unité = Unité / Mid$(ZU, 2) Else Unité = ZU
      Nombre = Int(Valeur / Unité)
      If Nombre = 0 Then
         For M = N To UBound(TJn) - 1: TJn(M) = TJn(M + 1): Next M
         If UBound(TJn) > 0 Then ReDim Preserve TJn(0 To UBound(TJn) - 1)
      Else: ZT = Nombre & Replace$(ZT, "(s)", IIf(Nombre > 1, "s", ""))
         If ZT Like "*(n)*" Then If ZT Like "1(n)*" Then ZT = Mid$(ZT, 5) Else ZT = Replace$(ZT, "(n)", "×")
         TJn(N) = ZT: N = N + 1: End If
      Valeur = Valeur - Nombre * Unité: Loop Until N > UBound(TJn)
   If UBound(TJn) > 0 And DernSép <> Sép Then
      TJn(UBound(TJn) - 1) = TJn(UBound(TJn) - 1) & DernSép & TJn(UBound(TJn))
      ReDim Preserve TJn(0 To UBound(TJn) - 1): End If
   Décomposé = Join(TJn, Sép)
   Exit Function
Er: MsgBox Err.Description: Stop: Resume
   End Function
Mâis j'ai encore un peu de mise au point à faire pour que cette dernière ne plante pas dans certains cas …
 

Discussions similaires

Statistiques des forums

Discussions
311 732
Messages
2 081 995
Membres
101 857
dernier inscrit
mt60400