• Initiateur de la discussion Initiateur de la discussion David
  • 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 !

David

XLDnaute Occasionnel
Bonjour à tous

Je voulais savoir s'il était possible de calculer un nombre de mois entre 2 dates. J'ai essayé avec DATEDIF, mais ça me donne le nombre de mois rond.

Pour du 08 mars au 30 septembre, ça me renvoi 6 ou 7 (si je met +1), mais je voudrais 6,774, c'est possible ?

Merci
 
Re : Nombre de mois

Re 🙂,
Comme j'ai besoin d'être précis ça serait pieux pour moi. La soluce donné par JPN donne 6,73, donc 0.044 d'écart xD.
Divad, moi c'est JNP 😛...
L'écart vient du ratrapage des années bisextiles 🙄...
Après, logique, ou pas logique ? Le prorata sur 30 ans sera plus juste, sur quelques jours moins, à toi de voir 😀.
Bon courage 😎
 
Re : Nombre de mois

Re

Dans ce cas, voici qui devrait faire l'affaire
Puisque precision il ya , l'année doit etre specifiée (les mois de fevrier n'ayant pas tous le même nombre de jours)

Edit: Salut JBOBO

Moi je ne suis meme pas a 0.001 pres (lol)
 

Pièces jointes

Dernière édition:
Re : Nombre de mois

Re

En controlant , je m'aperçois que mon calcul etait juste par hasard (derniere date correspondante a une fin de mois)
Voici une version corrigée avec fonction personnalisée
J'ai repris la formule de JBOBO et vicieusement testé nos deux fonctions sur des cas epineux
Ps: Je modifie egalement le #9 pour ne pas laisser trainer des sottises
 

Pièces jointes

Re : Nombre de mois

Bonjour à tous
C'est le genre de babiole dont je raffole...
Dans ces histoires d'intervalles, il faut se mettre d'accord. Compte-t-on les bornes ?
Voici une fonction paramétrable pour inclure ou non les bornes :
=nb_mois(A2;B2) (ou =nb_mois(A2;B2;1;1)) prend en compte les bornes.
=nb_mois(A2;B2;0) (ou =nb_mois(A2;B2;0;1)) exclut la borne inférieure.
=nb_mois(A2;B2;;0) (ou =nb_mois(A2;B2;1;0)) exclut la borne supérieure.
=nb_mois(A2;B2;0;0) exclut les bornes.
A2 est toujours supposé inférieur (ou égal) à B2.
Code:
[COLOR="DarkSlateGray"][B]Function nb_mois(rd As Range, rf As Range, Optional dd& = 1, Optional ff& = 1)
Application.Volatile
Dim d&, f&, jd&, jf&
  nb_mois = ""
  If IsDate(rd) And IsDate(rf) Then
    d = rd.Value - dd + 1
    f = rf.Value + ff
    If d <= f Then
      nb_mois = CDbl(Val(nb_mois))
      If d < f Then
        jd = DateSerial(Year(d), 1 + Month(d), 1)
        jf = DateSerial(Year(f), Month(f), 1)
        nb_mois = Round(12 * (Year(jf) - Year(jd)) + Month(jf) - Month(jd) _ 
          + (jd - d) / (jd - DateSerial(Year(d), Month(d), 1)) + (jf - f) _ 
          / (jf - DateSerial(Year(f), 1 + Month(f), 1)), 12)
      End If
    End If
  End If
End Function[/B][/COLOR]

Une autre fonction (paramétrée comme la précédente) :
Code:
[COLOR="DarkSlateGray"][B]Function nb_mois_jours(rd, rf, Optional dd& = 1, Optional ff& = 1)
Application.Volatile
Dim d&, f&, jd&, jf&
  nb_mois_jours = ""
  If IsDate(rd) And IsDate(rf) Then
    d = rd.Value - dd + 1
    f = rf.Value + ff
    If d <= f Then
      nb_mois_jours = CDbl(Val(nb_mois_jours))
      If d < f Then
        jd = DateSerial(Year(d), 1 + Month(d), 1)
        jf = DateSerial(Year(f), Month(f), 1)
        If Month(f - ff) = Month(d) And 12 * (Year(jf) - Year(jd)) + Month(jf) - Month(jd) - (d = DateSerial(Year(d), Month(d), 1)) <= 0 Then
          nb_mois_jours = f - d & "/" & CInt(jd - DateSerial(Year(d), Month(d), 1))
        Else
          nb_mois_jours = IIf((d - jd) * (d <> DateSerial(Year(d), Month(d), 1)), (d - jd) * (d <> DateSerial(Year(d), Month(d), 1)) & "/" & _
            CInt(jd - DateSerial(Year(d), Month(d), 1)), "") & _
            IIf(Round(12 * (Year(jf) - Year(jd)) + Month(jf) - Month(jd) - (d = DateSerial(Year(d), Month(d), 1)), 12), _
            IIf((d - jd) * (d <> DateSerial(Year(d), Month(d), 1)), " + ", "") & Round(12 * (Year(jf) - Year(jd)) + Month(jf) - Month(jd) - (d = DateSerial(Year(d), Month(d), 1)), 12), "") & _
            IIf(f - jf, " + " & f - jf & "/" & CInt(DateSerial(Year(f), 1 + Month(f), 1) - jf), "")
        End If
      Else
        nb_mois_jours = CStr(nb_mois_jours)
      End If
    End If
  End If
End Function[/B][/COLOR]
Avec 25/05/2010 en A2, 24/11/2010 en B2,
=nb_mois_jours(A2;B2)
renvoie 7/31 + 5 + 24/30, i.e. 7 jours en mai, 5 mois, 24 jours en novembre.

J'ai fait des essais, mais il reste peut-être encore des pièges...
Comparatif des différentes propositions dans le classeur joint. (À pierrejean : il reste des problèmes avec le mois de décembre et les changements d'année.)
ROGER2327
#4239


Mercredi 25 Absolu 138 (Nativité de Sainta Magnificence Opach, SQ)
11 Vendémiaire An CCXIX
2010-W39-6T02:11:16Z
 

Pièces jointes

Dernière édition:
Re : Nombre de mois

Suite...
Je suis allé un peu trop vite, cette nuit. Je viens de corriger le code.

Et maintenant, en route pour la manif !​
ROGER2327
#4240


Mercredi 25 Absolu 138 (Nativité de Sainta Magnificence Opach, SQ)
11 Vendémiaire An CCXIX
2010-W39-6T07:16:45Z
 
Dernière édition:
Re : Nombre de mois

Re

J'eusse été fort etonné que notre noctambule specialiste des dates (j'ai nommé ROGER) ne se soit pas interessé au probleme !

Voici un fichier dans lequel j'ai corrigé ma macro initiale et auquel j'en ai ajouté une autre (pierrejean2)
Je ne doute pas que David y trouve son bonheur
Je lui conseille d'ailleurs d'opter pour une de cellles de ROGER
Et quant à moi je vais tenter de comprendre ce qu'a fait ROGER
 

Pièces jointes

Re : Nombre de mois

Re...
(...)
Et quant à moi je vais tenter de comprendre ce qu'a fait ROGER
Pas très difficile, j'ai transcrit la formule
Code:
[COLOR="DarkSlateGray"][B]=(DATE(ANNEE(A2);MOIS(A2)+1;1)-A2)/(DATE(ANNEE(A2);MOIS(A2)+1;1)-DATE(ANNEE(A2);MOIS(A2);1))
+12*(ANNEE(B2)-ANNEE(DATE(ANNEE(A2);MOIS(A2)+1;1)))+MOIS(B2)-MOIS(DATE(ANNEE(A2);MOIS(A2)+1;1))
+(B2-DATE(ANNEE(B2);MOIS(B2);1))/(DATE(ANNEE(B2);MOIS(B2)+1;1)-DATE(ANNEE(B2);MOIS(B2);1))[/B][/COLOR]
valable pour les intervalles que j'ai nommé [ A ; B [ dans le classeur (borne inf. inclue, borne sup. exclue), en l'adaptant aux différents types d'intervalle.
En pièce jointe, une justification de cette formule...
Bonne soirée.

ROGER2327
#4244


Jeudi 26 Absolu 138 (Saint Joseb, notaire à la mode de Bretagne, SQ)
12 Vendémiaire An CCXIX
2010-W39-7T15:56:03Z
 

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
5
Affichages
388
  • Résolu(e)
Microsoft 365 DATEDIF
Réponses
11
Affichages
416
Réponses
3
Affichages
211
Retour