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:

Dranreb

XLDnaute Barbatruc
Je voulais dire: une fois le classeur équipé de la fonction perso, c'est à dire avec la Function DuréeAMJH programmée dans un module standard de son projet VBA, ainsi que la Function Décomposé à laquelle elle fait appel, on peut l'utiliser dans la formule indiquée de la cellule D225
 

Dranreb

XLDnaute Barbatruc
Un autre calcul, ne faisant pas appel à la fonction Décomposé, un peu mois exact mais qui plaira davantage à certains. Ce serait votre cas si vous souhaiteriez que, malgré leurs durées constantes qui ne sont des nombres entiers de jours, les mois et années n'introduisent pas d'heures dans le résultat :
VB:
Option Explicit
Function DuréeAMJH(ByVal DifJ As Double) As String
   Dim M As Long, A As Long, J As Long, H As Long, P As Long, TJn() As String
   M = Int(1600 * Int(DifJ) / 48699): DifJ = DifJ - (48699 * M + 1599) \ 1600
   A = M \ 12: M = M Mod 12: J = Int(DifJ): H = Int(24 * (DifJ - J) + 0.5)
   ReDim TJn(1 To 4)
   If A > 0 Then P = P + 1: TJn(P) = A & " an" & IIf(A > 1, "s", "")
   If M > 0 Then P = P + 1: TJn(P) = M & " mois"
   If J > 0 Then P = P + 1: TJn(P) = J & " jour" & IIf(J > 1, "s", "")
   If H > 0 Then P = P + 1: TJn(P) = H & " heure" & IIf(H > 1, "s", "")
   If P = 0 Then DuréeAMJH = "0 heure": Exit Function
   If P > 1 Then TJn(P - 1) = TJn(P - 1) & " et " & TJn(P): P = P - 1
   ReDim Preserve TJn(1 To P): DuréeAMJH = Join(TJn, ", ")
   End Function
 

BOUBAOM

XLDnaute Junior
ben je sais pas, je me comprend pas moi meme ;), je voudrais une formule ou un VBA qui me dise le temps passé entre le 26 mai 2016 et aujourdhui ou aujourd’hui a date ultérieur, qui soit facile a faire. la les alea je comprend pas,
Désolé vous vous décarcasser comme le pere DUCROS mais soit je suit débile soit comprend pas, si je pouvais je vous donnerai mon numéro de tel et on ferai ca en direct, mais je pense que c'est interdit, alors trouver moi sur FACEBOOK (CEDRIK KIRDEC) une photo de chat en profil
 

Dranreb

XLDnaute Barbatruc
Mais les ALEA c'était juste pour la démo, pour générer un nombre au hazard. Ça ne fait pas partie de la fonction, elle elle prend ce qu'on lui donne à traduire en texte. Il faut mettre à la place une simple soustraction entre deux dates, ce qui donne le nombre de jours qui les sépare.
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Elucubrations ... ???
autre élucubration ...
mimer DATEDIF ...
- en utilisant des durées moyennes (cf année grégorienne 365.2425 jours et mois =AN/12)
- suppression des bugs et autres anomalies signalées à propos de DATEDIF
- utilisation des arguments US de DATEDIF, mais autorisant également les arguments FR
- abstraction des notions de date début et date fin (la différence est en durée absolue)
- en tenant compte d'une date vide
- intégration de l'objet de la question de ce fil
- ajout des arguments pour restitutions concaténées Années Mois Jours et prise en compte des valeurs 0 et pluriels

1578783036051.png


VB:
Function DATDIF(Date1 As Range, Date2 As Range, arg As String) As String
' https://www.excel-downloads.com/members/modeste-geedee.179815/  Janvier  2020
' ------- année sidérale  :         365,25636567 ..........................révolution véritable de la Terre autour du Soleil
'-------- année julienne :           365.25.......................................cycle 4 ans           365 + 365 + 365 + 366
' ------- année grégorienne : 365.2425....................................cycle de 400 ans     365 jours + 1/4 -1/100 +1/400
' ------- année tropique conventionnelle :         365,2421875............... scientifiquement la plus exacte en astronomie
Application.Volatile
Dim Y As Double, MM As Double
Dim JJJ As Double, A%, M%, J%
'arg = LCase(arg)
Y = 365.2425
MM = Y / 12
JJJ = Abs(Date1 - Date2) '- 1
A = Int(JJJ / Y)
M = (Int(JJJ / MM)) Mod 12
J = JJJ - (MM * (Int(JJJ / MM)))
Select Case Lcase(arg)
            Case "y", "a":             DATDIF = A
            Case "m":            DATDIF = Int(JJJ / MM)
            Case "ym", "am":        DATDIF = M
            Case "d", "j":            DATDIF = Int(JJJ)
            Case "md", "mj":       DATDIF = J
            Case "amj", "ymd":           DATDIF = A & "a " & M & "m " & J & "j"
            Case "xamj", "xymd":           DATDIF = IIf(A > 0, A & IIf(A > 1, " Ans ", " An "), "") & IIf(M > 0, M & " Mois ", "") & IIf(J > 0, J & IIf(J > 1, " Jours", " Jour"), "")
            Case Else
            DATDIF = "=DATDIF(date1 ; date2 ;  arg)"
            MsgBox "DATDIF(Date1;Date2,argument)" _
            & Chr(10) & "arguments  : y, m, ym, m, md, amj, xamj, ? " _
            & Chr(10) & "y  ou a :    " & Chr(9) & "nb périodes AN" _
            & Chr(10) & "m :             " & Chr(9) & "nb périodes MOIS" _
            & Chr(10) & "ym ou am : " & Chr(9) & "nb mois hors période AN" _
            & Chr(10) & "d ou j :       " & Chr(9) & "nb de jours total" _
            & Chr(10) & "md ou mj : " & Chr(9) & "nb de jours hors période MOIS" _
            & Chr(10) & " ymd ou amj :" & Chr(9) & " abrégé AMJ" _
            & Chr(10) & "xymd ou xamj : " & Chr(9) & "étendu compact AMJ" _
            & Chr(10) & " ? : ce message d'aide", vbInformation + vbOKOnly
End Select
End Function
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
285
Réponses
6
Affichages
376

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 098
Messages
2 116 189
Membres
112 679
dernier inscrit
Yupanki