Function SecondsAfterDate(Nbsec#, Optional chx As Byte = 1, Optional Date_Depart As Date) As String
'**********************************************************************************
'Converti des secondes en jours | heures | minutes | secondes ou
' années | jours | heures | minutes | secondes ou
' années | mois | jours | heures | minutes | secondes
'Renvoi la date correspondant à une date + x jours
'Magic_Doctor
'**********************************************************************************
'- Nbsec : un nombre de secondes
'- chx : si 1 ou omis --> jours | heures | minutes | secondes
' si 2 --> années | jours | heures | minutes | secondes
' si 3 --> années | mois | jours | heures | minutes | secondes
' si 4 --> Date_Depart + le nombre de jours correspondant à Nbsec
'- Date_Depart : une date de référence (>= 01/01/1900) à partir de laquelle
' s'effectuent tous les calculs
'**********************************************************************************
Dim tj#, J#, A#, M As Byte, H As Byte, Mn As Byte, Sec As Byte
Dim fj#, sfj#, hfj#, fh#, mfh#, sufAns$, sufJours$
Dim MaDate As Date, Date_Fin As Date, fecha As Date
MaDate = IIf(Date_Depart = 0, Date, Date_Depart) 'gracias Marcel32
tj = Nbsec / 86400 'nombre (décimal) total de jours (secondes converties en jours)
J = Int(tj) 'nombre entier de jours dans Nbsec
fj = tj - J 'fraction de jour
sfj = fj * 86400 'nombre de secondes dans la fraction de jour
hfj = sfj / 3600 'nombre (décimal) d'heures dans la fraction de jour
'************* Dans tous les cas, véritables heures, minutes & secondes ************
H = Int(hfj) 'nombre entier d'heures dans la fraction de jour
fh = hfj - H 'fraction d'heure
mfh = fh * 60 'nombre (décimal) de minutes dans la fraction d'heure
Mn = Int(mfh) 'nombre entier de minutes dans la fraction d'heure
Sec = (mfh - Mn) * 60 'nombre de secondes dans la fraction de minute
If Sec = 60 Then Sec = 0: Mn = Mn + 1 'correction des sec & mn au cas où Sec = 60
'***********************************************************************************
Date_Fin = DateAdd("d", J, MaDate) 'date de départ + nb jours
If chx = 1 Then 'jours | heures | minutes | secondes
A = 0 'on ne tient pas compte des années
M = 0 'on ne tient pas compte des mois
ElseIf chx < 4 Then
A = DateDiff("yyyy", MaDate, Date_Fin) 'nb d'années entre les 2 dates
A = IIf(DateAdd("yyyy", A, MaDate) > Date_Fin, A - 1, A) 'nb réel d'années entre les 2 dates
fecha = DateAdd("yyyy", A, MaDate) 'date de départ + nb d'années
If chx = 2 Then 'années | jours | heures | minutes | secondes
M = 0 'on ne tient pas compte des mois
J = Date_Fin - fecha 'nb de jours
ElseIf chx = 3 Then 'années | mois | jours | heures | minutes | secondes
M = DateDiff("m", fecha, Date_Fin) 'nb de mois
fecha = DateAdd("m", M, fecha) 'date de départ + nb d'années + nb de mois
fecha = IIf(Day(fecha) > Day(Date_Fin), DateAdd("m", -1, fecha), fecha) 'date de départ + nb d'années + nb de mois CORRIGÉE
J = Date_Fin - fecha 'nb de jours
End If
Else 'date de départ + nb jours
SecondsAfterDate = Date_Fin: Exit Function
End If
sufAns = IIf(A = 0, "", IIf(A = 1, " an ", " ans "))
sufJours = IIf(J = 0, "", IIf(J = 1, " jour ", " jours "))
SecondsAfterDate = IIf(A = 0, "", A & sufAns) & IIf(M = 0, "", M & " mois ") & IIf(J = 0, "", J & sufJours) & IIf(H < 10, "0", "") & H & ":" & IIf(Mn < 10, "0", "") & Mn & ":" & IIf(Sec < 10, "0", "") & Sec
End Function