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

XL 2013 décomposer l'écart entre deux dates en année/jour restant/heure restant/minute restant/seconde resta

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

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]
 

Pièces jointes

  • Question_Forum_02112017.xlsm
    19.7 KB · Affichages: 29

eriiic

XLDnaute Barbatruc
Bonjour,

par formule, pas dur à adapter en vba si besoin.
eric

edit : j'ai ajouté Mois pensant à un oubli de ta part.
Remplacer F1 par
Code:
=DATEDIF($B$3;$C$3;"YD")-(MOD(B3;1)>MOD(C3;1))
 

Pièces jointes

  • Question_Forum_02112017.xlsm
    18.8 KB · Affichages: 44

Victor21

XLDnaute Barbatruc
Bonjour Sebast, eriiiic.

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...
 

Sebast

XLDnaute Impliqué
Bonsoir Eric,

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 …

Bonne soirée
 

Pièces jointes

  • upload_2017-11-2_21-33-35.png
    5.7 KB · Affichages: 96

eriiic

XLDnaute Barbatruc
Re,

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
 

Sebast

XLDnaute Impliqué
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

Merci
 

eriiic

XLDnaute Barbatruc
Bonjour,

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
 

Sebast

XLDnaute Impliqué
Bonsoir,

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 ?)

Seb
 

Sebast

XLDnaute Impliqué
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 !

Encore merci
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…