je suis à la recherche de la fonction qui en VBA permet de décomposer l'écart entre deux dates pour présenter cette différence en nombre de :
année(s) puis
jour(s) restant(s) puis
heure(s) restante(s) puis
minute(s) restante(s) puis
seconde(s) restante(s)
J'insiste sur la notion de restant car pour l'instant je n'arrive qu'à convertir l'écart en autant de années ou jour ou heure ou minutes ou seconde mais pas à décomposer les reliquats
Ex entre le 18/03/2014 à 14 : 30 et le 20/03/2015 à 14:30 il y a 1 an et 2 jour et 0 heure et 0 minutes etc
Or, les seules formules que j'arrive à écrire ne font que convertir l'écart exprimé dans l'unité voulue (année, jour, heure, minute ou seconde)
Ainsi pour le même écart, on a 1 année d'écart ou 367 jours ou 8809 heures ou 528450 minutes etc.
Or, j'aurais voulu avoir pour résultat 1 année d'écart + 2 jours et x heures etc.
J'ai vaguement idée que pour exprimer les années, on divise le résultat par 365 et on prend la partie entière puis ce qui est au-dessus de 365 (ici 2) représente le nombre de jours etc.
Le faire à la mano est fastidieux, d'autant que selon les années, on prend 365 ou 366 etc donc pas de règle absolue !
Existe-il une fonction intégrée pour cette décomposition ?
Merci d'avance pour votre aide
Sebastien
VB:
[/
Sub Ecart()
Dim Debut As Date
Dim Fin As Date
Dim DeltaAnnee
Dim DeltaJour
Dim DeltaHeure
Dim DeltaMinute
Dim DeltaSeconde
With Sheets("Exemple")
Debut = Range("B3").Value
Fin = Range("C3").Value
DeltaAnnee = DateDiff("yyyy", Debut, Fin)
.Range("D3") = DeltaAnnee
DeltaJour = DateDiff("d", Debut, Fin)
.Range("E3") = DeltaJour
DeltaHeure = DateDiff("h", Debut, Fin)
.Range("F3") = DeltaHeure
DeltaMinute = DateDiff("n", Debut, Fin)
.Range("G3") = DeltaMinute
DeltaSeconde = DateDiff("s", Debut, Fin)
.Range("H3") = DeltaSeconde
End With
MsgBox "L'écart entre le " & Debut & " le " & Fin & " s'élève à " & DeltaAnnee & " an(s)" & " et " & DeltaJour & " jour(s)"
End Sub
code]
Vous parlez d'année, mais pourriez-vous préciser ?
- Année anomalistique ?
- Année calendaire ?
- Année civile ?
- Année grégorienne ?
- Année julienne ?
- Année sidérale ?
- Année tropique ?
- ...
Faut-il également tenir compte des passages de l'heure d'hiver à l'heure d'été, et inversement, ainsi que du lieu du début et de celui de la fin de la période considérée ?
Car lorsqu'on veut une précision de l'ordre de la seconde, il faut bien savoir de quoi qu'on cause...
merci pour tes formules. Tu as raison, j'avais oublié le mois …
Dans ta formule concernant le jour, je ne vois pas à quoi correspond le critère"MD" :
=DATEDIF($B$3;$C$3;"MD")-(MOD(B3;1)>MOD(C3;1))
Vu les formules, j'en déduis que la réponse à ma question de savoir s'il existe une fonction
intégrée trouve vite sa réponse : manifestement, non !
Encore merci, je vais adapter ça en VBA
Bonsoir Patrick,
non non, rien que du normal, juste pouvoir décomposer la différence entre deux dates, en Occident …
Je me suis dit qu'à demander si quelqu'un connaissait une fonction intégrée, autant pousser la précision et en examiner tous les composants (année, mois, jour, heure, minute etc.).
Mais apparemment, Microsoft semble ne pas avoir créé une telle fonction intégrée …
argument Intervalle :
"y" : différence en années
"m" : différence en mois
"d" : différence en jours
"ym" : différence en mois, une fois les années soustraites
"yd" : différence en jours, une fois les années soustraites
"md" : différence en jours, une fois les années et les mois soustraits
Salut Eriiic,
merci pour ces précisions très pratiques.
Mais pourquoi, pour les jours utilises-tu
=DATEDIF($B$3;$C$3;"MD")-(MOD(B3;1)>MOD(C3;1))
je ne comprends pas le deuxième membre (MOD(B3;1)>MOD(C3;1))
Par ailleurs, j'ouvre un nouveau fil pour le passage des formules au VBA
pour une date sur excel la partie entière est le jour, la partie décimale une fraction de jour (donc l'heure).
MOD(B3;1) retourne la partie décimale
Code:
-(MOD(B3;1)>MOD(C3;1)
soustrait donc 1 jour si heure de B3 est > heure de C3
De aujourd'hui 15:00 à demain 14:00 datedif() te dira 1 jour. Qu'il faut corriger en 0 jours + 23 heures.
eric
effectivement, expliqué avec l'exemple c'est limpide.
Cependant, je ne comprends pas la syntaxe de MOD(B3;1)>MOD(C3;1)
car il n'y a pas de condition du type si a>b (où est le si ?)
MOD(B3;1)>MOD(C3;1) est un test qui renvoi VRAI/FAUX
Pour excel vrai =1 et faux=0, il converti dans ces valeurs si on l'utilise dans une opération.
=1-VRAI => 0
Bonjour Eriiiic,
désolé pour ma réponse tardive, passé le vendredi, je n'avais plus de PC ...
J'ai compris le sens de ta formule, je n'avais pas envisagé les choses sous cet angle mais c'est plutôt sioux !