Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb calcul duree avec datedif

24 réponses
Avatar
tchoiix83
Bonjour
en suivant les conseils de divers posts j'ai voulu utiliser la
fonction datedif mais celle-ci me retourne des r=E9sultats surprenants
ainsi =3Ddatedif("31/1/2008";"1/3/2009";"md") retourne : -2
soit un nombre n=E9gatif
comment est-ce possible; la fonction est elle bugg=E9e?
est-ce que cette fonction est incompatible avec excel 2000??

10 réponses

1 2 3
Avatar
MichDenis
Problématique bien connue :

Énoncé de JE McGimpsey, MVP Excel

'--------------------------------------------
The problem is that DATEDIF() uses the length of the first month to
determine what a "month" is.

This problem (with variations of the given example) has been discussed
here many, many times.

Because "month" is a fuzzy concept, there's simply no definition of
"month" that will allow both algorithmically consistent, and generally
acceptable, results without including this kind of anomaly.
'--------------------------------------------

Il est mieux de ne pas utilisé "MD" mais à toi de décider ....!

Une fonction personnelle parue ici sous la plume de "cervolent"

'----------------------------------------------
Function TEMPSECOULE(Debut, Fin) As String
Dim ValAnnée As Integer, ValMois As Integer
Dim ValJour As Integer, ValJour1 As Integer, ValJour2 As Integer

ValAnnée = Year(Fin) - Year(Debut)
ValMois = Month(Fin) - Month(Debut)
If ValMois < 0 Then
ValAnnée = ValAnnée - 1
ValMois = ValMois + 12
End If
ValJour1 = Day(Debut)
ValJour2 = Day(Fin)
ValJour = ValJour2 - ValJour1
If ValJour < 0 Then
ValJour = Day(DateSerial(Year(Debut), Month(Debut) + 1, 0)) - ValJour1 + ValJour2
If ValMois > 0 Then
ValMois = ValMois - 1
Else
ValAnnée = ValAnnée - 1
ValMois = 11
End If
End If
'les tests qui suivent ne servent qu'aux accrords de pluriel !!
If ValAnnée > 1 Then
antexte = " ans "
Else
antexte = " an "
End If
If ValJour > 1 Then
jrtexte = " jours"
Else
jrtexte = " jour"
End If
TEMPSECOULE = ValAnnée & antexte & ValMois & " mois " & ValJour & jrtexte
End Function
'----------------------------------------------

Est-ce que tout est sous contrôle maintenant ?
Avatar
Misange
hello à tous les deux,
je mettrai de complément d'info en ligne (mais pas tout de suite... je
m'absente un peu)

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Problématique bien connue :

Énoncé de JE McGimpsey, MVP Excel

'--------------------------------------------
The problem is that DATEDIF() uses the length of the first month to
determine what a "month" is.

This problem (with variations of the given example) has been discussed
here many, many times.

Because "month" is a fuzzy concept, there's simply no definition of
"month" that will allow both algorithmically consistent, and generally
acceptable, results without including this kind of anomaly.
'--------------------------------------------

Il est mieux de ne pas utilisé "MD" mais à toi de décider ....!

Une fonction personnelle parue ici sous la plume de "cervolent"

'----------------------------------------------
Function TEMPSECOULE(Debut, Fin) As String
Dim ValAnnée As Integer, ValMois As Integer
Dim ValJour As Integer, ValJour1 As Integer, ValJour2 As Integer

ValAnnée = Year(Fin) - Year(Debut)
ValMois = Month(Fin) - Month(Debut)
If ValMois < 0 Then
ValAnnée = ValAnnée - 1
ValMois = ValMois + 12
End If
ValJour1 = Day(Debut)
ValJour2 = Day(Fin)
ValJour = ValJour2 - ValJour1
If ValJour < 0 Then
ValJour = Day(DateSerial(Year(Debut), Month(Debut) + 1, 0)) - ValJour1 + ValJour2
If ValMois > 0 Then
ValMois = ValMois - 1
Else
ValAnnée = ValAnnée - 1
ValMois = 11
End If
End If
'les tests qui suivent ne servent qu'aux accrords de pluriel !!
If ValAnnée > 1 Then
antexte = " ans "
Else
antexte = " an "
End If
If ValJour > 1 Then
jrtexte = " jours"
Else
jrtexte = " jour"
End If
TEMPSECOULE = ValAnnée & antexte & ValMois & " mois " & ValJour & jrtexte
End Function
'----------------------------------------------

Est-ce que tout est sous contrôle maintenant ?






Avatar
Misange
salut mon ange
C'est vrai !
cela dit, ceci n'esplique vraiment pas comment avec la formule datedif,
le demandeur a trouvé -2 !

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

bonjour florence,

avec ces dates :
2008-01-31
2009-03-01

et la formule :

=SUPPRESPACE(SI(A2-A1;TEXTE(DATEDIF(A1;A2;"y");"[>1]0"" ans"";[>]""1
an"";")&TEXTE(DATEDIF(A1;A2;"ym");"[>] 0"" mois
"";")&TEXTE(DATEDIF(A1;A2;"md");"[>1]0"" jours"";[>]""1 jour"";");"0
jour"))

le résultat est :

1 an 1 mois -

mais le résultat reste le même si je modifie la première date pour
2008-01-30 ou 2008-01-29

petit test:

2008-01-31 résultat : 1 an 1 mois -
2009-03-01

2008-01-30 résultat : 1 an 1 mois -
2009-03-01

2008-01-29 résultat : 1 an 1 mois
2009-03-01

2008-01-28 résultat : 1 an 1 mois 1 jour
2009-03-01

j'ai parcouru plusieurs sites et on ne fait mention nul part de ce
problème ?

isabelle

Bonjour
Je n'obtiens pas ce résultat...
datedif("31/1/2008";"1/3/2009";"md") renvoie 1
si tu relis l'aide (rappelée ici :
http://www.excelabo.net/excel/lexique.php#datedif)
tu voies que MD renvoie le nombre de jours SANS TENIR COMPTE du nombre
de mois. Ca ne renvoie pas le nombre de mois + le nombre de jours.
MAis de toutes façons tu ne dois pas récupérer un nombre négatif !
as tu réessayé dans un classeur tout neuf ?

pour récupérer une durée en année et en joursn datedif n'est pas ce
qu'il te faut.
Je te conseille d'utiliser effectivement la fonction de Frédéric
Sigonneau
http://www.excelabo.net/excel/tempomesurer.php#diffdates

ou, pour éviter l'utilisation de VBA, cette formule à mettre sur une
seuleme ligne de Laurent pour calculer l'age d'une personne à la date
d'aujourd'hui (à toi d'adapter)
En nommant (insertion/nom/définir) D la cellule contenant la date de
naissance

=SUPPRESPACE(SI(AUJOURDHUI()-D;TEXTE(DATEDIF(D;AUJOURDHUI();"y");"[>1]0""
ans"";[>]""1 an"";")&TEXTE(DATEDIF(D;AUJOURDHUI();"ym");"[>] 0"" mois
"";")&TEXTE(DATEDIF(D;AUJOURDHUI();"md");"[>1]0"" jours"";[>]""1
jour"";");"0 jour"))


Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour
en suivant les conseils de divers posts j'ai voulu utiliser la
fonction datedif mais celle-ci me retourne des résultats surprenants
ainsi Útedif("31/1/2008";"1/3/2009";"md") retourne : -2
soit un nombre négatif
comment est-ce possible; la fonction est elle buggée?
est-ce que cette fonction est incompatible avec excel 2000??






Avatar
MichDenis
| comment avec la formule datedif, le demandeur a trouvé -2 !


ÚTEDIF(Déb;Fin;"md")
Si Déb = 31/01/2008 et Fin = 01/03/2008
Résultat = -1

ÚTEDIF(Déb;Fin;"md")
Si Déb = 31/01/2008 et Fin = 01/03/2009
Résultat = -2
Avatar
tchoiix83
On 2 mai, 17:22, "MichDenis" wrote:
Problématique bien connue :

Énoncé de JE McGimpsey, MVP Excel

'--------------------------------------------
The problem is that DATEDIF() uses the length of the first month to
determine what a "month" is.

This problem (with variations of the given example) has been discussed
here many, many times.

Because "month" is a fuzzy concept, there's simply no definition of
"month" that will allow both algorithmically consistent, and generally
acceptable, results without including this kind of anomaly.
'--------------------------------------------

Il est mieux de ne pas utilisé "MD" mais à toi de décider ....!

Une fonction personnelle parue ici sous la plume de "cervolent"

'----------------------------------------------
Function TEMPSECOULE(Debut, Fin) As String
Dim ValAnnée As Integer, ValMois As Integer
Dim ValJour As Integer, ValJour1 As Integer, ValJour2 As Integer

ValAnnée = Year(Fin) - Year(Debut)
ValMois = Month(Fin) - Month(Debut)
If ValMois < 0 Then
ValAnnée = ValAnnée - 1
ValMois = ValMois + 12
End If
ValJour1 = Day(Debut)
ValJour2 = Day(Fin)
ValJour = ValJour2 - ValJour1
If ValJour < 0 Then
ValJour = Day(DateSerial(Year(Debut), Month(Debut) + 1, 0)) - ValJou r1 + ValJour2
If ValMois > 0 Then
ValMois = ValMois - 1
Else
ValAnnée = ValAnnée - 1
ValMois = 11
End If
End If
'les tests qui suivent ne servent qu'aux accrords de pluriel !!
If ValAnnée > 1 Then
antexte = " ans "
Else
antexte = " an "
End If
If ValJour > 1 Then
jrtexte = " jours"
Else
jrtexte = " jour"
End If
TEMPSECOULE = ValAnnée & antexte & ValMois & " mois " & ValJour & jrte xte
End Function
'----------------------------------------------

Est-ce que tout est sous contrôle maintenant ?


Bonjour
et merci beaucoup pour toutes ces précisions
et merci pour cette macro
a bientot

Avatar
Modeste
Bonsour® MichDenis avec ferveur ;o))) vous nous disiez :


Énoncé de JE McGimpsey, MVP Excel
Because "month" is a fuzzy concept, there's simply no definition of
"month" that will allow both algorithmically consistent, and generally
acceptable, results without including this kind of anomaly.

Une fonction personnelle parue ici sous la plume de "cervolent"


Function TEMPSECOULE(Debut, Fin) As String

;o)))
debut(/02/2008
fin/03/2008
resultat : 0 an 0 mois 2 jours

:-(
ma formule perso avec des années de 365,25j et des mois de 30,4375j
ne fait hélas pas mieux :
=ENT((fin-debut)/365,25)&"a "&ENT(MOD((fin-debut)/(365,25/12);12))&"m
"&ENT(MOD((fin-debut);365,25/12))&"j"

;o)))
tant que l'on s'acharnera à melanger des mois de 31, 30, 28 ou 29 jours....

si en plus on tient compte de la journée sidérale :
la durée exacte du jour sidéral est de : 365,2422/(365,2422+1) = 0,9972696 jour
solaire, soit 23h 56m 4,09s.
et que par ailleurs :
La durée du jour augmente au rythme d'environ 2 millisecondes par siècle.

essayons de trouver une formule perenne ....
;o)))





--
--
@+
;o)))

Avatar
MichDenis
Voici quelques exemples de différence entre des dates et le résultat obtenu à l'aide de la fonction
de Cervolent.

La fonction : Function TEMPSECOULE(Debut, Fin) As String de Cervolent
est constante dans la manière d'évaluer la différence entre ces dates. Elle est
inclue toujours dans le résultat une des deux bornes.

Il me semble qu'en mathématique, lorsque l'on effectue une différence, une
des deux bornes est inclue dans le résultat. Si tu désires exclure les 2 bornes
tu enlèves 1 au résultat de la fonction.

Entre 01/01/2008 et 02/01/2008
Résultat : 0 an 0 mois 1 jour

Entre 28/01/2008 et 01/03/2011
Résultat : 3 ans 1 mois 4 jours

Entre 29/02/2008 et 01/03/2008
Résultat : 0 an 0 mois 1 jour

Entre 27/02/2008 et 01/03/2011
Résultat : 3 ans 0 mois 3 jours

Entre 01/06/2008 et 02/01/2012
Résultat : 3 ans 7 mois 1 jour

| La durée du jour augmente au rythme d'environ 2 millisecondes par siècle.
*** Es-tu en train de me dire que les entreprises en tiennent compte dans
le taux horaire versé à leur employé ?
En Amérique, c'est une marge d'erreur acceptable lorsqu'il s'agit
d'activité humaine. Avec ta permission, je ne vais pas ajuster ma montre !
;-)))

J'avoue ne pas comprendre ton propos... ou serait-ce que
j'ai le cerveau lent ce soir !




"Modeste" a écrit dans le message de news:
ecNJ$
Bonsour® MichDenis avec ferveur ;o))) vous nous disiez :


Énoncé de JE McGimpsey, MVP Excel
Because "month" is a fuzzy concept, there's simply no definition of
"month" that will allow both algorithmically consistent, and generally
acceptable, results without including this kind of anomaly.

Une fonction personnelle parue ici sous la plume de "cervolent"


Function TEMPSECOULE(Debut, Fin) As String

;o)))
debut(/02/2008
fin/03/2008
resultat : 0 an 0 mois 2 jours

:-(
ma formule perso avec des années de 365,25j et des mois de 30,4375j
ne fait hélas pas mieux :
=ENT((fin-debut)/365,25)&"a "&ENT(MOD((fin-debut)/(365,25/12);12))&"m
"&ENT(MOD((fin-debut);365,25/12))&"j"

;o)))
tant que l'on s'acharnera à melanger des mois de 31, 30, 28 ou 29 jours....

si en plus on tient compte de la journée sidérale :
la durée exacte du jour sidéral est de : 365,2422/(365,2422+1) = 0,9972696 jour
solaire, soit 23h 56m 4,09s.
et que par ailleurs :
La durée du jour augmente au rythme d'environ 2 millisecondes par siècle.

essayons de trouver une formule perenne ....
;o)))





--
--
@+
;o)))

Avatar
MichDenis
| quand la réponse optimale (DateDif) a été fournie.

Est-ce microsoft te paie pour dire cela ?

Quand une fonction te retourne ce type de résultat, il me
semble que cela devrait poser problème nécessitant un correctif.
'---------------------------------
ÚTEDIF(Déb;Fin;"md")
Si Déb = 31/01/2008 et Fin = 01/03/2008
Résultat = -1

ÚTEDIF(Déb;Fin;"md")
Si Déb = 31/01/2008 et Fin = 01/03/2009
Résultat = -2
'---------------------------------

Je peux comprendre certains MVP de vouloir défendre leur "employeur"
en tentant de camoufler la connerie et le mépris que microsoft démontre
envers les utilisateurs, avec des explications pour le moins tendencieuse !

Si la fonction de Cervolent (optimale puisque c'est la seule qui fait le boulot proprement)
tient la route, difficile de croire que microsoft ne puisse pas en faire autant !

Vous aurez compris que ce n'est pas avec ce type d'interventions que microsoft
engrangera les millions !!!
Avatar
Mais qui est Paul
Bonsour® MichDenis avec ferveur ;o))) vous nous disiez :

Quand une fonction te retourne ce type de résultat, il me
semble que cela devrait poser problème nécessitant un correctif.

Si la fonction de Cervolent (optimale puisque c'est la seule qui fait
le boulot proprement) tient la route, difficile de croire que
microsoft ne puisse pas en faire autant !


;o)))
je me plaçais à un autre niveau ;o)))
toutes sont faillibles,
tant que l'on s'acharnera à melanger des mois de 31, 30, 28 ou 29 jours....
quand à dire laquelle est le plus perenne ???
;o)))

http://cjoint.com/?fdn4RKpieV



--
--
@+
;o)))

Avatar
MichDenis
Toute une réussite de la part de Cervolent !
;-)


;o)))
je me plaçais à un autre niveau ;o)))
toutes sont faillibles,
tant que l'on s'acharnera à melanger des mois de 31, 30, 28 ou 29 jours....
quand à dire laquelle est le plus perenne ???
;o)))

http://cjoint.com/?fdn4RKpieV



--
--
@+
;o)))
1 2 3