Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Magic_Doctor

XLDnaute Barbatruc
Bonjours,

J'ai essayé de résoudre le problème suivant : convertir en année(s) / mois COMPLET(S) / jour(s) le nombre de jours qu'il y a entre 2 dates.
Quelques conditions :
- les années ont toutes 365 jours (on ne tient donc jamais compte des années bissextiles)
- les mois sont toujours complets (fatalement les jours pourront parfois avoir plus de 31 jours suivant les dates)
- le jour de la 1ère date est toujours inclus

J'ai rédigé une fonction obèse-poussive-tordue-spaghetti, mais qui, ma foi, a l'air de marcher :
VB:
Function DissectionTemps(dat1 As Date, dat2 As Date) As String
'Magic_Doctor
Dim nba As Integer, m1 As Integer, m2 As Byte, j1 As Byte, j2 As Byte, x As Byte
Dim mesmois As Variant, i As Byte
Dim nbtjr As Integer, nbjr As Integer
Dim nbjmr As Integer, nbjmr1 As Integer, nbjmr2 As Integer
Dim nbmr As Byte, nbmr1 As Byte, nbmr2 As Byte
Dim sentence1 As String, sentence2 As String, sentence3 As String
Dim suf1 As String, suf2 As String, slash1 As String, slash2 As String

j1 = Day(dat1): j2 = Day(dat2)
m1 = Month(dat1): m2 = Month(dat2)

If m2 < m1 Or m2 = m1 And j2 < j1 Then x = 1
nba = Year(dat2) - Year(dat1) - x 'nombre d'années entre les 2 dates
nbtjr = dat2 - DateSerial(Year(dat1) + nba, m1, j1) 'nombre total de jours restant depuis dat1 + nba jusqu'à dat2
mesmois = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) 'mois d'une année de 365 jours

If Month(dat1) < Month(dat2) Then
    nbmr = Abs(m1 - m2 + 1) 'nombre de mois complets restant
    For i = m1 To m2 - 2
        nbjmr = nbjmr + mesmois(i) 'nombre de jours dans les mois complets restant
    Next
    nbjr = nbtjr - nbjmr + 1 'nombre de jours restant
    
    If Day(dat1) = 1 Then 'si le jour de "dat1" est un 1er du mois
        nbmr = nbmr + 1
        nbjmr = nbjmr + NbJoursDuMois(CInt(m1))
        nbjr = nbtjr - nbjmr + 1
    End If
    
    If Day(dat2) = NbJoursDuMois(m2) Then 'si le jour de "dat2" est une fin de mois
        nbmr = nbmr + 1 'nombre de mois complets restant
        nbjr = nbjr - NbJoursDuMois(m2) 'nombre de jours restant
    End If
End If

If Month(dat1) = Month(dat2) Then
    If Day(dat1) < Day(dat2) Then
        nbmr = IIf(Day(dat1) = 1 And Day(dat2) = NbJoursDuMois(CInt(m1)), 1, 0) 'nombre de mois complets restant
        nbjr = IIf(Day(dat1) = 1 And Day(dat2) = NbJoursDuMois(CInt(m1)), 0, nbtjr) 'nombre de jours restant
    ElseIf Day(dat1) = Day(dat2) Then
        nbjr = 0
    Else
        For i = m1 To 11
            nbjmr1 = nbjmr1 + mesmois(i) '1ère tranche du nombre de jours dans les mois complets restant
        Next
    
        For i = 0 To m2 - 2
            nbjmr2 = nbjmr2 + mesmois(i) '2ème tranche du nombre de jours dans les mois complets restant
        Next
        nbmr = 11 'nombre de mois complets restant
        nbjmr = nbjmr1 + nbjmr2 'nombre de jours dans les mois complets restant
        nbjr = nbtjr - nbjmr 'nombre de jours restant
    End If
End If

If Month(dat1) > Month(dat2) Then
    For i = m1 To 11
        nbjmr1 = nbjmr1 + mesmois(i) '1ère tranche du nombre de jours dans les mois complets restant
    Next
    nbmr1 = 12 - m1
    
    If Day(dat1) = 1 Then 'si le jour de "dat1" est un 1er du mois
        nbmr1 = nbmr1 + 1
        nbjmr1 = nbjmr1 + NbJoursDuMois(CInt(m1))
    End If
    
    If Month(dat2) = 1 Then 'le mois de "dat2" est janvier
        If Day(dat1) = 1 Then 'si le jour de "dat1" est un 1er du mois
            nbmr = 13 - Month(dat1)
            nbjr = Day(dat2)
        Else
            nbmr = nbmr1
            nbjr = nbtjr - nbjmr1 + 1
        End If
        GoTo after
    End If
    
    For i = 0 To m2 - 2
        nbjmr2 = nbjmr2 + mesmois(i) '2ème tranche du nombre de jours dans les mois complets restant
    Next
    nbmr2 = Month(dat2) - 1 '2ème tranche du nombre de jours dans les mois complets restant
    nbmr = nbmr1 + nbmr2 'nombre de mois complets restant
    nbjmr = nbjmr1 + nbjmr2 'nombre de jours dans les mois complets restant
    nbjr = nbtjr - nbjmr 'nombre de jours restant
after:
    If Day(dat2) = NbJoursDuMois(m2) Then 'si le jour de "dat2" est une fin de mois
        nbmr = nbmr + 1 'nombre de mois complets restant
        nbjr = nbjr - NbJoursDuMois(m2) 'nombre de jours restant
    End If
    If Day(dat1) = 1 And Day(dat2) = NbJoursDuMois(m2) Then 'si le jour de "dat1" est le 1er d'un mois et le jour de "dat2" est une fin de mois
        If nbmr = 12 Then nbmr = 11: nbjr = NbJoursDuMois(m2)
    End If
End If
    
'*************************** Éléments de la chaîne ***************************
    suf1 = IIf(nba > 1, "s", "")
    suf2 = IIf(nbjr > 1, "s", "")
    sentence1 = IIf(nba = 0, "", nba & " an" & suf1)
    sentence2 = IIf(nbmr = 0, "", nbmr & " mois")
    sentence3 = IIf(nbjr = 0, "", nbjr & " jour" & suf2)
    slash1 = IIf(sentence1 = "" Or sentence2 = "", "", " / ")
    slash2 = IIf(sentence1 = "" And sentence2 = "" Or sentence2 = "" And sentence3 = "" Or sentence2 <> "" And sentence3 = "", "", " / ")
'*****************************************************************************
DissectionTemps = sentence1 & slash1 & sentence2 & slash2 & sentence3
End Function
'-----------------------------------------------------------------------------------------------
Function NbJoursDuMois(m As Byte, Optional année As Integer = 0) As Byte
'Renvoie le nombre de jours d'un mois en fonction de son Nº
'- m : un Nº de mois (janvier --> 1 ... décembre --> 12)
'- année : si omis, ne tiendra pas compte des années bissextiles (février -2- aura toujours 28 jours)
'Magic_Doctor
    Dim mesmois As Variant, x As Byte, nbjoursmois As Byte
    
    x = IIf(année = 0, 28, IIf(LeapYear(année), 29, 28))
    mesmois = Array(31, x, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    
    NbJoursDuMois = mesmois(m - 1)
End Function
'-----------------------------------------------------------------------------------------------
Function LeapYear(a%) As Boolean
'Vérifie si une année est bissextile ou pas (tient compte des années théoriquement bissextiles et qui ne le sont en fait pas, comme 1800/1900/2100...)
'- a : une année quelconque
'ROGER2327
    LeapYear = ((a Mod 4) = 0) * (1 + ((a Mod 100) = 0) * (1 + (((a \ 100) Mod 4) = 0)))
End Function
Peut-on "dégraisser ce mammouth" ?
 

Pièces jointes

  • DissectionTemps.xlsm
    22.6 KB · Affichages: 89
  • DissectionTemps.xlsm
    22.6 KB · Affichages: 99
  • DissectionTemps.xlsm
    22.6 KB · Affichages: 101
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re...


(...)
Roger, si vous me lisez, il peut y avoir discordance entre vos résultats et les miens. Par exemple, pour :
02/01/2000 -- 13/01/2007
M_D : 7 ans / 12 jours
ROGER : 6 ans / 11 mois / 42 jours
Je vous lis...
Et j'explique ma réponse :


  • du 2/01/2000 inclus au 31/01/2000 inclus : 30 jours ;
  • du 1/02/2000 inclus au 31/01/2006 inclus : 6 ans ;
  • du 1/02/2006 inclus au 31/12/2006 inclus : 11 mois ;
  • du 1/01/2007 inclus au 13/01/2007 exclu : 12 jours.

Bilan : 6 ans 11 mois 30 + 12 = 42 jours.


Autre exemple, du 1/01/2000 inclus au 13/01/2007 exclu :


  • du 1/01/2000 inclus au 31/12/2006 inclus : 7 ans ;
  • du 1/01/2007 inclus au 13/01/2007 exclu : 12 jours.

Bilan : 7 ans 12 jours.

Mais je n'ai peut-être pas compris le problème réel...


Bonne soirée.


ℝOGER2327
#6970


Jeudi 12 As 141 (Dispute du signe + et du signe - - fête Suprême Tierce)
24 Brumaire An CCXXII, 6,8842h - orange
2013-W46-4T16:31:20Z
 

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsoir Magic_Doctor, salut les autres,

Par formule, avec des noms définis correctement, ça ne paraît pas très compliqué.

Voir le fichier joint.

Edit 1 : j'ai ajouté un contrôle d'erreur sur mois et annéees.

Edit 2 : je n'ai pas les mêmes résultats que toi Magic_Doctor.

Tu as bien dit : mois complets, non ?

Bonne soirée et A+
 

Pièces jointes

  • DissectionTemps(1).xls
    59 KB · Affichages: 62
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsoir job,

Ton exemple est le suivant : 01/03/2000 --> 28/02/2008
Tu obtiens 8 ans.

Je raisonne de la sorte :
01/03/2000 --> 01/03/2007 : 7 années complètes
01/03/2007 --> 28/02/2008 :
- 11 mois complets (en y incluant le mois de mars, puisque la 1ère date commence un 1er)
- 28 jours du dernier mois
Bilan : 7 ans / 11 mois / 28 jours
 

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re,

Perso je dirai que du 01/02/2008 au 29/02/2008 inclus on a un mois complet.

Idem du 01/02/2008 au 28/02/2008 puisqu'on ne tient pas compte des années bissextiles.

A+
 

KenDev

XLDnaute Impliqué
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Je raisonne de la sorte :
01/03/2000 --> 01/03/2007 : 7 années complètes
01/03/2007 --> 28/02/2008 :
- 11 mois complets (en y incluant le mois de mars, puisque la 1ère date commence un 1er)
- 28 jours du dernier mois
Bilan : 7 ans / 11 mois / 28 jours

Bonsoir à tous,

A chouette, une première partie de l'énoncé du problème au post 19... :) Si vous ajouter + 1 à la fonction que j'ai proposé vous devriez donc avoir les résultats attendus (En devinant le raisonement dans les cas moins triviaux...).

nouveau code (1 ligne de plus : If d3 + m3 > 0 Then d3 = d3 + 1)

Cordialement

KD

VB:
Function DateDifString(ByVal Dt1 As Date, Dt2 As Date) As String
    Dim Dt3 As Date, c&, sy$, sj$, y1&, y2&, m1&, m2, d1&, d2&, d3&, m3&, y3&
    If Dt2 < Dt1 Then Dt3 = Dt1: Dt1 = Dt2: Dt2 = Dt3
    y1 = Year(Dt1): m1 = Month(Dt1): d1 = Day(Dt1): y2 = Year(Dt2): m2 = Month(Dt2): d2 = Day(Dt2)
    Do: c = c + 1: Loop Until IsPost(y1 + c, m1, d1, y2, m2, d2)
    y3 = c - 1: y1 = y2: c = 0: m1 = m1 + 12 * (m1 > m2) - 12 * (m1 = m2) * (d1 > d2)
    Do: c = c + 1: Loop Until IsPost(y1, m1 + c, d1, y2, m2, d2)
    m3 = c - 1: d3 = d2 - d1
    If d3 < 0 Then
        c = 28
        If m2 = 3 Then c = c - (y2 Mod 4 = 0 And ((y2 Mod 400 = 0) Or (y2 Mod 100 > 0))) Else _
            c = c + 2 - (Not Abs(m2 - 6) = 1 And Not Abs(m2 - 11) = 1)
        y1 = c - d1: d3 = d2 - y1 * (y1 > 0)
    End If
    If d3 + m3 > 0 Then d3 = d3 + 1
    If y3 > 1 Then sy = "s"
    If d3 > 1 Then sj = "s"
    DateDifString = y3 & " an" & sy & " / " & m3 & " mois / " & d3 & " jour" & sj
End Function
Function IsPost(ByVal y1&, ByVal m1&, ByVal d1&, ByVal y2&, ByVal m2&, ByVal d2&) As Boolean
    If y1 > y2 Then
        IsPost = True
    ElseIf y1 = y2 Then
        If m1 > m2 Then
            IsPost = True
        ElseIf m1 = m2 Then
            IsPost = (d1 > d2)
        End If
    End If
End Function

Edit : @Victor, je suis d'accord le raisonement de M_D n'est pas cohérent avec lui même mais c'est son droit de vouloir des cas particuliers... Et on ne sait toujours pas le résultat attendu pour des cas comme 12/01/2000 - 03/03/2003 par exemple...
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsoir Victor,

Vous avez tout à fait raison, 01/03/2000 --> 01/03/2007 fait bien 1 an et 1 jour quand on raisonne avec ces histoire de dates de mise en service. Pour faire simple, évitons les années bissextiles.
Je fais marcher une machine le 1er mars 2001 (dat1). Un an après, autrement dit le 1er mars 2002 (dat2) se seront écoulés exactement 365 jours : Day(dat2) - Day(dat2) = 365. Mais en fait, le 1er mars 2002, nous aurons utilisé cette machine pendant 365 jours + le jour de sa mise en marche, donc pendant 366 jours.
C'est la raison pour laquelle, dans les plans d'amortissement bien faits, la date de sortie de l'immobilisation est la veille de la date de mise en service + le nombre d'années d'amortissement. Supposons que nous amortissons un actif, mis en service le 15/07/2012, pendant 5 ans, la date de sortie ne sera pas le 15/07/2017 mais le 14/07/2017.
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsoir KenDev,

Je pense, depuis mon 1er post, avoir été cohérent. Si vous n'avez pas compris exactement ce que je voulais obtenir, c'est autre chose. Mais peut-être que je m'exprime mal...
Votre fonction m'intéresse (la mienne, je le reconnais est très lourde, même si le résultat est lui aussi instantané), seulement il demeure des discordances. Je prends un exemple :
15/01/2000 --> 16/11/2008
J'obtiens : 8 ans / 9 mois / 33 jours
Vous obtenez : 8 ans / 10 mois / 2 jours

Je pense qu'à un moment donné ces 33 jours vous les transformez en mois. On se retrouve avec 1 mois supplémentaire et des jours en moins.
Je précisais bien dans mon 1er post que je ne voulais que des mois complets. Les jours restant étant en fait répartis entre le 1er mois de la 1ère date et le dernier mois de la 2ème date. Au maximum, dans un cas extrême (par ex. 02/01/2000 --> 30/12/2005) on aura 60 jours restant. On peut effectivement les transformer en mois ; mais alors les diviserez-vous par 30 ou par 31 ? Sachant qu'il y a, dans n'importe quelle année, presque 2 fois plus de mois de 31 jours que de mois de 30 jours.
Je désirais un résultat qui réponde à une certaine logique. Quand on obtient, suivant cette logique, 8 ans / 9 mois / 33 jours, nul besoin d'être polytechnicien pour immédiatement traduire inconsciemment dans son hémisphère gauche que c'est à peu près 8 ans / 10 mois.

Enfin, je choisis un 2ème exemple, celui que m'avait adressé ROGER et qui m'a conduit à corriger ma fonction :
02/02/1980 --> 31/03/2013
J'obtiens : 33 ans / 1 mois / 28 jours (comme ROGER)
Vous obtenez : 33 ans / 1 mois / 30 jours
 

Pièces jointes

  • DissectionTemps(6).xlsm
    28 KB · Affichages: 46
Dernière édition:

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re,

J'ai revu les formules des noms deb et fin, ainsi que celle en C8, assez compliquée :

Code:
=REPT(années&" an(s) / ";SIGNE(années))&REPT(mois&" mois / ";SIGNE(mois))&SI(ET(MOIS(deb)=MOIS(fin);ANNEE(deb)=ANNEE(fin);NON(mois));fin-deb+OU(JOUR(deb)=29;JOUR(fin)<>29;MOIS(fin)<>2);joursdeb+joursfin)&" jour(s)"
Fichier (2).

A+
 

Pièces jointes

  • DissectionTemps(2).xls
    59 KB · Affichages: 51

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsoir job,

J'ai fait des essais comparatifs entre ta formule (un peu compliquée... j'ai pas trop l'habitude des formules) et ma fonction (je te signale au passage que dans ton classeur il y a une version non actualisée de ma fonction) et les résultats semblent être parfaitement identiques, sauf, dans mes essais, pour ce fameux 02/01/2000 --> 13/01/2007
Comme ROGER tu obtiens 6 ans / 11 mois / 43 jours
J'obtiens : 7 ans / 12 jours
Pourtant, du 02/01/2000 au 02/01/2007 il y a bien 7 ans, et du 02/01/2007 inclus au 13/01/2007 inclus il y a bien 12 jours.
Mais, je ne veux pas paraître idiot, où déclares-tu "deb, fin..." ?

Mais bravo pour ta formule.
 

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re,

deb fin etc... sont des noms définis : onglet Formules => Gestionnaire de noms.

Et avant d'aller dormir une correction de la formule en C8 :

Code:
=SI(ESTERR(années);"";REPT(années&" an(s) / ";SIGNE(années)))&SI(ESTERR(mois);"";REPT(mois&" mois / ";SIGNE(mois)))&SI(ET(MOIS(deb)=MOIS(fin);ANNEE(deb)=ANNEE(fin);ESTERR(LN(mois)));fin-deb+OU(JOUR(deb)=29;JOUR(fin)<>29;MOIS(fin)<>2);joursdeb+joursfin)&" jour(s)"
Fichier (3).

A+
 

Pièces jointes

  • DissectionTemps(3).xls
    59.5 KB · Affichages: 56

KenDev

XLDnaute Impliqué
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Quand on obtient, suivant cette logique, 8 ans / 9 mois / 33 jours, nul besoin d'être polytechnicien pour immédiatement traduire inconsciemment dans son hémisphère gauche que c'est à peu près 8 ans / 10 mois.

Bonsoir à tous, M_D,

Tout d'abord merci de prendre la peine d'un long post juste pour moi alors que vous avez déjà un certains nombre de réponses de personnes bien plus compétentes que moi.

J'ai relu le premier post et celui ci et j'avoue ne pas comprendre ce que vous appellez un mois complet, ni pourquoi 8 ans / 9 mois / 33 jours est mieux que 8 ans / 10 mois / 2 jours ??

Si
Quand on obtient, suivant cette logique, 8 ans / 9 mois / 33 jours, nul besoin d'être polytechnicien pour immédiatement traduire inconsciemment dans son hémisphère gauche que c'est à peu près 8 ans / 10 mois.
est inattaquable, vous ne m'empêcherez pas de pensez que c'est travailler un peu "à l'arrache".

Les deux hypothèses que vous avancez me semblent équiprobables : problème de compréhension de ma part (j'ajouterai mauvaise volonté) et/ou problème d'énoncé.

J'accepte complètement que les résultats de ma fonction ne vous satisfasse pas.

Pour info la logique de ma fonction pour l'exemple cité (02/02/1980 --> 31/03/2013) :
02/02/1980 --> 02/02/2013 = 33 ans complet (?)
02/02/2013 --> 02/03/2013 = 1 mois complet (?)
02/03/2013 --> 31/03/2013 = 29 jours + 1(date à date) = 30 jours
Cette fonction a peut-être l'ambition de vouloir une rigueur mathématique à une problématique d'ingénieur.

Du coup une autre et dernière proposition qui n'aura sans doute pas plus votre aval mais avec une logique, il me semble, plus en accord avec votre façon de penser (ce que j'en comprends). Elle se base sur le nombre moyen de jours d'une année moyenne et d'un mois moyen selon un cycle complet de notre calendrier (soit 400 ans). Courte et simple, résultats comparables (ex 33 ans / 1 mois / 29 jours pour notre exemple ou 7 ans 12 jours pour le dernier discuté sur le fil). La plus grosse partie du code est pour l'écriture...

VB:
Function DateDiffMoy(ByVal Dt1 As Date, Dt2 As Date) As String
    Dim d&, dt3 As Date, y&, m&
    If Dt2 < Dt1 Then dt3 = Dt1: Dt1 = Dt2: Dt2 = dt3
    d = Dt2 - Dt1 + 1: y = Int(d / 365.2425): d = d - 365.2425 * y: m = Int(d / 30.436875): d = d - 30.436875 * m
    If y > 1 Then sy = "s"
    If d > 1 Then sj = "s"
    DateDiffMoy = y & " an" & sy & " / " & m & " mois / " & d & " jour" & sj
End Function

Cordialement

KD
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonjour à tous.


Ça bouillonne !
Quant à moi, je m'y perds... Quand je lis mois complet, je comprends bêtement du premier au dernier jour du mois. Par conséquent, du 15 mars 2013 inclus au 20 avril 2013 exclu, je ne vois pas de mois complet, ni mars, ni avril. Je vois 17 jours en mars et 19 jours en avril.
De même, du 1[SUP]er[/SUP] juin 2013 inclus au 30 juin 2013 exclu, je ne vois pas un mois complet ; tout au plus 29 jours. Il est vrai que je suis grave miraud...

Mais comme j'ai fait des choses, je livre. En pièce jointe :
  1. Ce que j'ai compris.
  2. La version "VBA" des formules que j'ai proposées hier.
VB:
Function AMJ$(Inf, Sup, Optional ei As Boolean = True, Optional es As Boolean = True)
Dim J%, M%, A%, i As Date, s As Date, ti As Date, ts As Date, e$
  If Not (IsEmpty(Inf) Or IsEmpty(Sup)) Then
    If IsDate(Inf) And IsDate(Sup) Then
      i = Inf - Not ei
      s = Sup + Not es
      If i > s Then
        e = "Ø"
      Else
        If Month(i) = Month(s) And Year(i) = Year(s) Then
          J = CInt(s - i) + 1
        Else
          ti = DateSerial(Year(i), Month(i) + 1, 1)
          ts = DateSerial(Year(s), Month(s), 1)
          If Month(i - 1) = Month(i) Then J = CInt(ti - i) Else M = 1
          If Month(s + 1) = Month(s) Then J = J + CInt(s - ts) + 1 Else M = M + 1
          M = M + Month(ts) - 12 * (Month(ts) < Month(ti)) - Month(ti)
          A = Year(ts) - Year(ti) + (Month(ts) < Month(ti)) + M \ 12
          M = M Mod 12
        End If
        e = IIf(A, A & " an" & IIf(A > 1, "s ", " "), "") & _
          IIf(M, M & " mois ", "") & _
          IIf(J, J & " jour" & IIf(J > 1, "s", ""), "")
      End If
    End If
  End If
  AMJ = e
End Function
Cette fonction traite les différents cas d'inclusion ou d'exclusion des bornes.
=AMJ(date1;date2) inclut les dates extrêmes ;
=AMJ(date1;date2;;FAUX) inclut d1 et exclut d2 ;
=AMJ(date1;date2;FAUX) exclut d1 et inclut d2 ;
=AMJ(date1;date2;FAUX;FAUX) exclut les dates extrêmes.

Voilà, voilà... ...et tant pis si c'est tout faux.​


Bonne nuit.


ℝOGER2327
#6971


Vendredi 13 As 141 (Moustaches du Dr Faustroll - fête Suprême Tierce)
25 Brumaire An CCXXII, 1,0781h - faisan
2013-W46-5T02:35:15Z
 

Pièces jointes

  • Années_Mois_Jours.xlsm
    31.5 KB · Affichages: 52

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonjour Magic_Doctor, le fil, le forum,

(...) sauf, dans mes essais, pour ce fameux 02/01/2000 --> 13/01/2007
Comme ROGER tu obtiens 6 ans / 11 mois / 43 jours
J'obtiens : 7 ans / 12 jours

C'est toi qui a fixé la règle des mois complets et tu ne l'applique pas ???

Janvier 2000 => mois incomplet => 30 jours du 02/01/2000 au 31/01/2000

Janvier 2007 => mois incomplet => 13 jours du 01/01/2007 au 13/01/2007

Mois complets => 6 ans 11 mois du 01/02/2000 au 31/12/2006.

Par ailleurs j'ai revu le calcul des mois et années avec JOURS360 au lieu de DATEDIF.

Et nouvelle formule en C8, en peaufinant la restitution :

Code:
=REPT(REPT(années&" an"&REPT("s";années>1)&" ";SIGNE(années))&REPT(mois&" mois ";SIGNE(mois))&REPT(jours&" jour"&REPT("s";jours>1);SIGNE(jours));deb<=fin)
Fichier (4)

A+
 

Pièces jointes

  • DissectionTemps(4).xls
    59.5 KB · Affichages: 54

Membres actuellement en ligne

Statistiques des forums

Discussions
291 501
Messages
1 915 830
Membres
178 990
dernier inscrit
shadowtheone
Haut Bas