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 :
Peut-on "dégraisser ce mammouth" ?
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
Pièces jointes
Dernière édition: