Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Bonsoir le fil

Sinon en légèrement optimisé, preuve à l'appuie 😱
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, IIf(Nj = 0, " et", ""), "") & 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", "")
      
    DIFDATE = NbAn & Nbm & Nbj
  Else
    DIFDATE = ""
  End If
End Function

A+
 

Pièces jointes

  • ScreenShot112.jpg
    45.2 KB · Affichages: 38
Re : Amélioration d'une fonction

Bonsoir à tous 🙂

Je me suis pris au jeu, et je vous livre la dernière mouture de la formule avec DATEDIF :
Code:
=SI(NON(DATEDIF(A3;B3;"Y"));"";SI(DATEDIF(A3;B3;"Y")=1;DATEDIF(A3;B3;"Y")&" an";DATEDIF(A3;B3;"Y")&" ans"))
&SI(ET(DATEDIF(A3;B3;"Y");DATEDIF(A3;B3;"YM");DATEDIF(A3;B3;"MD"));" ";"")
&SI(ET(DATEDIF(A3;B3;"Y");DATEDIF(A3;B3;"YM");NON(DATEDIF(A3;B3;"MD")));" et ";"")
&SI(NON(DATEDIF(A3;B3;"YM"));"";SI(DATEDIF(A3;B3;"YM")>0;DATEDIF(A3;B3;"YM")&" mois"))
&SI(ET(OU(DATEDIF(A3;B3;"Y");DATEDIF(A3;B3;"YM"));DATEDIF(A3;B3;"MD"));" ";"")
&SI(OU(ET(DATEDIF(A3;B3;"YM");DATEDIF(A3;B3;"MD"));ET(DATEDIF(A3;B3;"Y");DATEDIF(A3;B3;"MD")));"et ";"")
&SI(NON(DATEDIF(A3;B3;"MD"));"";SI(DATEDIF(A3;B3;"MD")=1;DATEDIF(A3;B3;"MD")&" jour";DATEDIF(A3;B3;"MD")&" jours"))
La formule "économise" 😛 un caractère par rapport aux fonctions (avant le nombre de jours), mais je n'ai pas trouvé pourquoi 😕

En PJ, le comparatif des trois propositions :

Edit : Cette horreur peut très largement être simplifiée, notamment avec la suppression des conditions ne renvoyant jamais rien, et l'intégration de supprespace pour la gestion des "";" ".
Mais si vous dites que DATEDIF génère des incongruités, je ne vais pas me casser la nénette plus avant 😛
D'autant moins qu'en relisant la demande initiale, il est bien question d'une fonction ...😱
Enfin... ça aura au moins eu l'avantage de me faire réviser les opérateurs logiques 😉
 

Pièces jointes

Dernière édition:
Re : Amélioration d'une fonction

Bonjour Victor21, le forum,

J'ai essayé la formule proposée et il me semble qu'il reste un soucis.
Date de départ 02/01/2000
Date de fin 01/01/2012
Résultat: 11 ans 11 mois et 143 jours
au lieu de 11 ans 11 mois et 30 jours
mais peut être ai je fait une erreur?

JHA
 
Re : Amélioration d'une fonction

Re

@ Victor
De notoriété publique la fonction DATEDIF est suspecte (faire une recherche avec DATEDIF et ROGER2327 )
@ l'ami Bruno:
Histoire d'avoir le dernier mot !!!

Code:
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 Integer
  '
 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"))
    NJMP = Format(CDate("01/" & MA & "/" & AA) - 1, 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 Na = 0 Then NbAn = "" Else NbAn = Na & " an" & IIf(Na > 1, "s", "")
    'If Nm = 0 Then Nbm = "" Else Nbm = IIf(Na > 0, IIf(Nj = 0, " et", ""), "") & Str$(Nm) & " mois"
    If Nm = 0 Then Nbm = "" Else Nbm = IIf(Na > 0, IIf(Nj = 0, " et", ""), "") & Nm & " mois"
    If Nj = 0 Then Nbj = "" Else _
      'Nbj = IIf(Nm > 0, " et", IIf(Na > 0, " et", "")) & Str$(Nj) & " jour" & IIf(Nj > 1, "s", "")
      Nbj = IIf(Nm > 0, " et", IIf(Na > 0, " et", "")) & Nj & " jour" & IIf(Nj > 1, "s", "")
    DIFDATE = NbAn & Nbm & Nbj
  Else
    DIFDATE = ""
  End If
End Function
 
Dernière édition:
Re : Amélioration d'une fonction

Re

Salut JC 🙂

Curieux !!!
Moi aussi avec Excel 2007 il m'arrive (mais pas toujours !!!) d'avoir les 143 jours
 

Pièces jointes

Dernière édition:
Re : Amélioration d'une fonction

salut tous

(fonction testée avec 2010)
Attention, Si... on a Option Explicit, il faut déclarer toutes les variables !
Autre code (sans passer par des Formats)
Code:
Option Explicit
Function DIFDATE(Dated, Datef)
  Application.Volatile
  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 Nban, Nbm, Nbj 'les 3, as Variant
  If Not IsDate(Dated) Or Not IsDate(Datef) Then DIFDATE = "x-x-x-x": Exit Function
  AN = Year(Dated): MN = Month(Dated): JN = Day(Dated)
  AA = Year(Datef): MA = Month(Datef): JA = Day(Datef)
  If JN > JA Then JA = JA + Day(CDate("01/" & MA & "/" & AA) - 1): MA = MA - 1
  If MN > MA Then MA = MA + 12: AA = AA - 1
  Na = AA - AN: Nm = MA - MN: Nj = JA - JN
  Nban = IIf(Na = 0, "", Na & IIf(Na > 1, " ans ", " an "))
  Nbm = IIf(Nm = 0, "", IIf(Na > 0, IIf(Nj = 0, "et ", ""), "") & Nm & " mois ")
  Nbj = IIf(Nj = 0, "", IIf(Nm > 0, "et ", IIf(Na > 0, "et ", "")) & Nj & IIf(Nj > 1, " jours", " jour"))
  DIFDATE = Nban & Nbm & Nbj
End Function
 
Re : Amélioration d'une fonction

re

Salut Si...

Ne pourrais-tu pas nous dire ce que tu as fais pour que ça fonctionne ?

A+

😕, je ne comprends pas ta demande !

Si... tu veux voir le test, continue à remplir la colonne "noire" (fichier de pierrejean complété avec la fonction dont j'ai donné le code).
 

Pièces jointes

- 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
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…