XL 2016 erreur de calcul entre deux dates

halecs93

XLDnaute Impliqué
Bonjour à toutes et à tous,

Je rencontre une erreur de calcul entre deux dates. Le calcul doit me permettre de calculer le nombre de mois entre deux dates + un delta en nombre de jours et me renvoyer le tout sous forme de nombre avec décimales.

Je mets un classeur exemple.

En vert, la formule me renvoie 11,13 alors qu'elle devrait renvoyer 10,13...

Merci pour vos retours.

1721811334868.png
 

Pièces jointes

  • MOIS EN DECIMALES XLD.xlsx
    12.2 KB · Affichages: 6
Dernière édition:
Solution
Re @halecs93 ,

La différence des deux dates (04/07/20024 - 01/07/2024) est bien égale à 3.
Le nombre de jours entre ces deux dates est 3+1.
C'est le célèbre problème du nombre d'arbres et de leurs intervalles.

Concernant mes formules, si on rajoute 1 à la formule, on rajoute 1 mois de 30 jours.
C'est au nombre de jours qu'il faut rajouter 1.

Voir les formules dans le classeur joint.

nota : Datedif ne considère pas que les mois ont 30 jours. En outre Datedif, (me semble-t-il) peut retourner une valeur erronée dans certains cas (quand des années bissextiles sont présentes).

vgendron

XLDnaute Barbatruc
Hello
en passant, j'ai deux fonctions pour calculer un age..
si ca peut inspirer..

VB:
Public Function CalculAge(d1 As Date, d2 As Date) As String 'fonction qui retourne l'age en yy/mm/dd (fonction récupérée sur le net, pas vérifiée (https://www.developpez.net/forums/d655595/logiciels/microsoft-office/excel/macros-vba-excel/formule-calculer-age-textbox/)
  CalculAge = "une date est manquante"
  If Not IsDate(d1) Or Not IsDate(d2) Then Exit Function
 
  CalculAge = "La 2ème date doit nécessairement être plus grande que la 1ère !"
  If DateValue(d1) > DateValue(d2) Or Not IsDate(d2) Then Exit Function
 
  Dim toto As String, A As Integer, m As Integer, j As Integer
  toto = DateValue(DateSerial(Year(d2) - Year(d1), Month(d2) - Month(d1), Day(d2) - Day(d1)))
 
  A = Val(Format(toto, "yy"))
  m = Val(Format(toto, "mm"))
  j = Val(Format(toto, "dd"))
 
  CalculAge = Str(A) & " an" & IIf(A > 1, "s, ", ", ") & Str(m) & " mois et " & Str(j) & " jour" & IIf(j > 1, "s", "")
End Function

Function Age(d1 As Date, Optional d2) As String

If IsMissing(d2) Then d2 = Now()

Dim A&, m&, s&, j&
    If (d1 > 60) * (d1 <= d2) Then
        Do While DateSerial(Year(d1) + A + 1, Month(d1), Day(d1)) < d2: A = A + 1: Loop
        Do While DateSerial(Year(d1) + A, Month(d1) + m + 1, Day(d1)) < d2: m = m + 1: Loop
        Do While DateSerial(Year(d1) + A, Month(d1) + m, Day(d1) + (s + 1) * 7) < d2: s = s + 1: Loop
        Do While DateSerial(Year(d1) + A, Month(d1) + m, Day(d1) + s * 7 + j + 1) < d2: j = j + 1: Loop
        Age = IIf(A, A & " an" & IIf(A > 1, "s", "") & " ", "") & IIf(m, m & " mois ", "") & IIf(s, s & " semaine" & IIf(s > 1, "s", "") & " ", "") & IIf(j Or (A + m + j = 0), j & " jour" & IIf(j > 1, "s", ""), "")
    End If
End Function
 

halecs93

XLDnaute Impliqué
Bonjour,


Pourquoi ne pas simplement faire =(C7-B7)/30 ? 🤔

DateDif a toujours été réputée buguée et donc à éviter, me semble-t-il.
Bonjour,

Parce que la formule ne renvoie pas le résultat exact.

En fait, du 01/09/2024 au 04/07/2025, on a 10 mois + 4/30 (puisqu'on considère que tous les mois ont 30 jours). Donc j'essaie d'obtenir 10,13 ;)

Votre proposition me renvoie 10,2
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @halecs93 :), @wDog66 ;), @TooFatBoy ;), @Dranreb ;),

J'énonce peut-être une bêtise mais pour les besoins de comptabilité avec des mois à 30 jours, Excel dispose de la fonction JOURS360 qui retourne la différence en jours entre deux dates (avec soit la méthode européenne soit la méthode "grand-breton" d'outre-atlantique) et en considérant des mois à 30 jours.

Le nombre de mois à 30 jours devient : NbrMois=ENT(JOURS360(début;fin;VRAI)/30)

Le nombre de jours restant devient : NbrJour=JOURS360(début;fin;VRAI)-30*NbrMois

et en décimal de mois à 30 jours : DecMois=NbrMois+NbrJour/30

En une seule formule :
=ENT(JOURS360(début;fin;VRAI)/30)+(JOURS360(début;fin;VRAI)-30*ENT(JOURS360(début;fin;VRAI)/30))/30

Application dans le classeur joint colonnes I à N.
 

Pièces jointes

  • halecs93- Mois (à 30j) en décimal- v1.xlsx
    13.9 KB · Affichages: 3
Dernière édition:

Dranreb

XLDnaute Barbatruc
Il s'agit de savoir si vous voulez une durée physique exprimée en mois moyens ou un historique administratif de jours compté à partir de mois particuliers d'années particulières. Dans le second cas, normalement DateDif doit convenir.
Remarque: en ajoutant 1 jour aux deux dates vos formules donnent le même résultat.
Avec ces formules aussi mais différent :
En B9 :
Code:
=(ANNEE(C7)-ANNEE(B7))*12+MOIS(C7)-MOIS(B7)+(JOUR(C7)-JOUR(B7))/30
En E9 :
Code:
=(ANNEE(F7)-ANNEE(E7))*12+MOIS(F7)-MOIS(E7)+(JOUR(F7)-JOUR(E7))/30
 
Dernière édition:

halecs93

XLDnaute Impliqué
Bonjour @halecs93 :), @wDog66 ;), @TooFatBoy ;), @Dranreb ;),

J'énonce peut-être une bêtise mais pour les besoins de comptabilité avec des mois à 30 jours, Excel dispose de la fonction JOURS360 qui retourne la différence en jours entre deux dates (avec soit la méthode européenne soit la méthode "grand-breton" d'outre-atlantique) et en considérant des mois à 30 jours.

Le nombre de mois à 30 jours devient : NbrMois=ENT(JOURS360(début;fin;VRAI)/30)

Le nombre de jours restant devient : NbrJour=JOURS360(début;fin;VRAI)-30*NbrMois

et en décimal de mois à 30 jours : DecMois=NbrMois+NbrJour/30

En une seule formule :
=ENT(JOURS360(début;fin;VRAI)/30)+(JOURS360(début;fin;VRAI)-30*ENT(JOURS360(début;fin;VRAI)/30))/30

Application dans le classeur joint colonnes I à N.
Bonjour et merci. Mais mais mais... dans le fichier exemple, la formule ne compte que 3 jours du 1er au 4 juillet... faut-il tout simplement +1 à la formule ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @halecs93 ,

La différence des deux dates (04/07/20024 - 01/07/2024) est bien égale à 3.
Le nombre de jours entre ces deux dates est 3+1.
C'est le célèbre problème du nombre d'arbres et de leurs intervalles.

Concernant mes formules, si on rajoute 1 à la formule, on rajoute 1 mois de 30 jours.
C'est au nombre de jours qu'il faut rajouter 1.

Voir les formules dans le classeur joint.

nota : Datedif ne considère pas que les mois ont 30 jours. En outre Datedif, (me semble-t-il) peut retourner une valeur erronée dans certains cas (quand des années bissextiles sont présentes).
 

Pièces jointes

  • halecs93- Mois (à 30j) en décimal- v2.xlsx
    14.6 KB · Affichages: 3

TooFatBoy

XLDnaute Barbatruc
Parce que la formule ne renvoie pas le résultat exact.
Sans savoir exactement ce que tu veux calculer, difficile de pondre une formule. ;)


[edit]
En fait, du 01/09/2024 au 04/07/2025, on a 10 mois + 4/30 (puisqu'on considère que tous les mois ont 30 jours).
Donc tu ne considères pas que tous les mois font 30 jours, mais tu considères cela uniquement sur les derniers jours.
OK. Je vois ce que tu veux faire comme calcul.
[/edit]
 

Discussions similaires

Réponses
15
Affichages
783

Statistiques des forums

Discussions
313 769
Messages
2 102 234
Membres
108 181
dernier inscrit
Chr1sD