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:

BOUBAOM

XLDnaute Junior
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 …
Tu m'étonnes que j'y arrive pas, faut avoir fait math sup pour comprendre
 

Dranreb

XLDnaute Barbatruc
Avec une formule dans une cellule =DuréeAMSJ(DateFin-DateDéb) par exemple, oui.
Il faut naturellement que la Function Décomposé y soit aussi, puisqu'elle est invoquée par celle ci.
Ben si bizarrement vous ne voulez pas des semaines mais que vous préfèreriez aussi les heures en plus prenez plutôt la DuréeAMJH, bien sûr. Vous voyez bien, tout est déterminer par la codification du second argument :
"365,2425: an(s);/12: mois;1: jour(s);/24: heure(s)"
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Vous pourriez le spécifier en utilisant directement la fonction Décomposé: ça marcherait.
Regardez en C34, propagé sur 7 lignes :
Code:
=Décomposé($B34;"365,2425: an(s);/12: mois;1: jour(s);/24: heure(s)")
 

Pièces jointes

  • Décomposé.xlsm
    21.9 KB · Affichages: 3

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 814
dernier inscrit
JLGalley