Amélioration d'une fonction

  • Initiateur de la discussion Initiateur de la discussion libellule85
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

libellule85

XLDnaute Accro
Bonsoir le forum,

Ayant récupéré une fonction qui fait la différence entre les dates, j'aimerais apporter une petite amélioration à celle-ci mais je n'ai pas suffisamment de connaissance en vba pour la faire, et c'est donc pourquoi je me tourne vers vous.
Voici mon "problème" :

si je mets dans la celle A1 la date 15/05/2011 et dans la cellule A2 la date 18/05/2012 cela me donne le résultat 1 an 3 jours et moi ce que j'aimerais avoir comme résultat c'est 1 an et 3 jours.

La fonction est dans le fichier joint.
D'avance merci pour votre aide
 

Pièces jointes

Re : Amélioration d'une fonction

Le seul problème que j'ai avec ma fonction c'est quand il n'y a pas de mois dans la différence (quand il n'y a que le nombre d'années et le nombre de jours),
car quand il y a des mois cela me donne exactement par exemple 1 an 10 mois et 12 jours
et quand il y a que mois et jours cela me donne bien par exemple 5 mois et 2 jours
 
Dernière édition:
Re : Amélioration d'une fonction

Re,

Ne pouvant pas optimiser la fonction comme souhaité (effectivement y'avait un gros bug, merci JC)

Voici le code modifié de la première avec le problème réglé (normalement) de 1 an et x jours
VB:
Function DIFDATE(Dated As Date, Datef As Date) As String
  Dim AN As Integer, MN As Integer, JN As Integer
  Dim AA As Integer, MA As Integer, JA As Integer
  Dim Na As Integer, Nm As Integer, Nj As Integer
  Dim NJMP As Variant
  '
  If Not IsNull(Dated) And Not IsNull(Datef) Then
    AN = Val(Format(Dated, "yyyy")):  MN = Val(Format(Dated, "mm")): JN = Val(Format(Dated, "dd"))
    AA = Val(Format(Datef, "yyyy")): MA = Val(Format(Datef, "mm")): JA = Val(Format(Datef, "dd"))
    '
    NJMP = "01/" & MA & "/" & AA: NJMP = DateValue(NJMP) - 1: NJMP = Val(Format(NJMP, "dd"))
    '
    If JN > JA Then JA = JA + NJMP: MA = MA - 1
    '
    If MN > MA Then MA = MA + 12: AA = AA - 1
    '
    Na = AA - AN: Nm = MA - MN: Nj = JA - JN
    '
    If Na = 0 Then NbAn = "" Else NbAn = Str$(Na) & " an" & IIf(Na > 1, "s", "")
    If Nm = 0 Then Nbm = "" Else Nbm = IIf(Na > 0, ", ", "") & Str$(Nm) & " mois"
    If Nj = 0 Then
      Nbj = ""
    Else
      Nbj = IIf(Nm > 0, " et ", IIf(Na > 0, " et ", "")) & Str$(Nj) & " jour" & IIf(Nj > 1, "s", "")
    End If
    '
    DIFDATE = NbAn & Nbm & Nbj
  Else
    DIFDATE = ""
  End If
End Function

A+
 
Dernière modification par un modérateur:
Re : Amélioration d'une fonction

Bonsoir à tous.

=SI(NON(DATEDIF(A7;B7;"y"));"";DATEDIF(A7;B7;"Y")
&SI( DATEDIF(A7;B7;"Y")>1;" ans ";" an "))
&SI(NON(DATEDIF(A7;B7;"YM"));"";","
&DATEDIF(A7;B7;"YM" ) &" mois ")
&SI(OU(NON(DATEDIF(A7;B7;"MD"));ET(NON(DATEDIF(A7;B7;"Y"));NON(DATEDIF(A7;B7;"YM"))));"";"et ")
&SI(NON(DATEDIF(A7;B7;"MD"));"";DATEDIF(A7;B7;"MD"))
&SI(DATEDIF(A7;B7;"MD")>1;" jours";"")
&SI(DATEDIF(A7;B7;"MD")=1;" jour";"")

Un peu lourd, mais semble fonctionner ...
🙂

Edit : mais comme disait justement JM 🙂:
Pour infos:
DATEDIF a parfois quelque soucis de comportements
(Voir les fils sur XLD traitant de la chose)

Edit 2 : quelques erreurs... voir plutôt ici
 
Dernière édition:
Re : Amélioration d'une fonction

Re,
Je reviens vers vous pour le même problème mais cette fois ci que si la différence est année mois (quand il n'y a pas de jour).
Je m'explique :
Actuellement le résultat du code de BrunoM45 me donne par exemple 1 an 3 mois et j'aimerais avoir 1 an et 3 mois.
D'avance je vous en remercie
 
Re : Amélioration d'une fonction

Bonjour à tous,

Peux-tu essayer :

VB:
Function DIFDATE(Dated As Date, Datef As Date) As String
    Dim AN As Integer, MN As Integer, JN As Integer
    Dim AA As Integer, MA As Integer, JA As Integer
    Dim Na As Integer, Nm As Integer, Nj As Integer
    Dim NJMP As Variant
    If Not IsNull(Dated) And Not IsNull(Datef) Then
        AN = Val(Format(Dated, "yyyy"))
        MN = Val(Format(Dated, "mm"))
        JN = Val(Format(Dated, "dd"))
        AA = Val(Format(Datef, "yyyy"))
        MA = Val(Format(Datef, "mm"))
        JA = Val(Format(Datef, "dd"))
        NJMP = "01/" & MA & "/" & AA
        NJMP = DateValue(NJMP) - 1
        NJMP = Val(Format(NJMP, "dd"))


        If JN > JA Then
            JA = JA + NJMP
            MA = MA - 1
        End If


        If MN > MA Then
            MA = MA + 12
            AA = AA - 1
        End If


        Na = AA - AN
        Nm = MA - MN
        Nj = JA - JN


        If Na = 0 Then
            NbAn = ""
        Else
            NbAn = Str$(Na) & " an" & IIf(Na > 1, "s", "")
        End If
        If Nm = 0 Then
            Nbm = ""
        Else
            Nbm = IIf(Na > 0, " et ", IIf(Nm > 0, " et ", "")) & Str$(Nm) & " mois"
        End If
        If Nj = 0 Then
            Nbj = ""
        Else
            Nbj = IIf(Nm > 0, " et ", IIf(Na > 0, " et ", "")) & Str$(Nj) & " jour" & IIf(Nj > 1, "s", "")
        End If


        DIFDATE = NbAn & Nbm & Nbj
    Else
        DIFDATE = ""
    End If
End Function

A + à tous
 
Re : Amélioration d'une fonction

Re,

Ce qui serait vraiment bien c'est que le "et" se mette avant la dernière indication. Je m'explique :

si on a 1 an 11 mois 10 jours il faut que le résultat apparaisse comme ceci : 1 an 11 mois et 10 jours
si on a 5 ans 10 jours il faut que le résultat apparaisse comme ceci : 5 ans et 10 jours
si on a 3 ans 5 mois il faut que le résultat apparaisse comme ceci : 3 ans et 5 mois
 
Re : Amélioration d'une fonction

Re Pierrejean,

J'ai essayé d'ajouter une date à la suite des tiennes, mais celà ne marche pas ! cela me met 1 an 10 jours !!

Edit : cela marche que si il y a plusieurs années, si le résultat avait été 5 ans 10 jours cela me donne effectivement 5 ans et 10 jours.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Résolu(e)
Microsoft 365 DATEDIF
Réponses
11
Affichages
239
  • Question Question
Microsoft 365 Aide Excel formule
Réponses
4
Affichages
401
  • Question Question
Microsoft 365 Règle de 3
Réponses
11
Affichages
832
Retour