Additionner des heures

Résolu
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 - 8 août 2005 à 13:58
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 - 6 nov. 2005 à 20:38
Bonjour à tous,

Voila j'ai un petit soucis! J'ai réalisé une petite fonction pour additionner des heures :

Public Function AddHours(h1 As String, h2 As String, operation As Integer) As String
If (h1 <> "" And h2 <> "") Then
somme = Val(Format(h1, "hh")) * 3600 + Val(Format(h1, "nn")) * 60 + Val(Format(h1, "ss")) + Val(Format(h2, "hh")) * 3600 + Val(Format(h2, "nn")) * 60 + Val(Format(h2, "ss"))
AddHours = TimeSerial(Str(somme \ 3600), Str((somme - (somme \ 3600) * 3600) \ 60), Str(somme - ((somme \ 3600) * 3600) - ((somme - (somme \ 3600) * 3600) \ 60) * 60))
End If
End Function

En fait je voudrais qu'en ayant :
745:12:20 + 01:00:05 la fonction m'affiche 746:12:25 !
Mais je n'y arrive pas.
Quand j'utilise des trops grandes valeurs pour les heures il fait un peu n'importe quoi. Moi je veux utiliser des journées de 24h alors je me demande si c'est pas selon le calendrier des années (bisextile) que ca met un peu le bazard !!! ...

Mon utilisation est un peu particulière car je ne veux pas nb de jours + heure + minute + seconde mais bien heure + minute + seconde.

Si quelqu'un à une idée à me proposer, je suis tout ouïe ::
Merci d'avance !

Philippe
A voir également:

25 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
8 août 2005 à 16:38
Salut,
Puisque les variables passées sont du texte (h1 As String, h2 As String) et que le retour est en string, je te propose cette solution :

Function AddHours(h1 As String, h2 As String) As String
Dim t1() As String
Dim t2() As String
Dim t3() As String
Dim tmp As Integer


t1 = Split(h1, ":")
t2 = Split(h2, ":")
t3 = Split("00:00:00", ":")

'addition des secondes
tmp = CInt(t1(2)) + CInt(t2(2))
If tmp < 60 Then
t3(2) = CStr(tmp)
Else
t3(1) = "1"
t3(2) = CStr(tmp - 60)
End If

'addition des minutes
tmp = CInt(t1(1)) + CInt(t2(1))
If tmp < 60 Then
t3(1) = CStr(CInt(t3(1)) + tmp)
Else
t3(0) = "1"
t3(1) = CStr(CInt(t3(1)) + (tmp - 60))
End If

'addition des heures
t3(0) = CStr(CInt(t3(0)) + CInt(t1(0)) + CInt(t2(0)))

AddHours = Join(t3, ":")

End Function

En effet, les fonctions sur les dates n'acceptent que des dates 'valides' et "745:12:20" n'est pas une date valide.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 nov. 2005 à 13:01
D'abord, excuse-moi de ne pas avoir répondu plus tôt (obligation professionnelles assez prenantes).
Ensuite, voici le code corrigé (honte à moi, je n'avais pas fait tous les tests). Le prob vient des histoires de retenues dans les minutes.
En rouge les corrections :

Function SubHours(h1 As String, h2 As String) As String
Dim t1() As String
Dim t2() As String
Dim t3() As String
Dim tmp As Integer
Dim test As Boolean
Dim RetenueMinutes As Integer
Dim RetenueHeures As Integer


t1 = Split(h1, ":")
t2 = Split(h2, ":")
t3 = Split("00:00:00", ":")

'on teste si h1 est inférieur à h2
'si oui, on inverse les tableaux
If CDate(h1) < CDate(h2) Then
test = True
t1 = Split(h2, ":")
t2 = Split(h1, ":")
End If

'soustraction des secondes
tmp = CInt(t1(2)) - CInt(t2(2))
If tmp >= 0 Then
RetenueMinutes = 0
t3(2) = CStr(tmp)
Else
RetenueMinutes = 1
t3(2) = CStr(tmp + 60)
End If

'soustraction des minutes

tmp = CInt(t1(1)) - CInt(t2(1)) - RetenueMinutes
If tmp >= 0 Then
RetenueHeures = 0
t3(1) = CStr(tmp <STRIKE> - RetenueMinutes</STRIKE>)
Else
RetenueHeures = 1
t3(1) = CStr(tmp + 60 <STRIKE> - RetenueMinutes</STRIKE>)
End If


'soustraction des heures
t3(0) = CStr(CInt(t1(0)) - CInt(t2(0)) - RetenueHeures)

'on formate les heures minutes secondes sur 2 cars
If CInt(t3(0)) < 10 Then t3(0) = "0" & t3(0)
If CInt(t3(1)) < 10 Then t3(1) = "0" & t3(1)
If CInt(t3(2)) < 10 Then t3(2) = "0" & t3(2)


If test Then
'si h1 < h2
SubHours = "-" & Join(t3, ":")
Else
'si h1 >= h2
SubHours = Join(t3, ":")
End If

End Function

Voilà, je pense que ça ira mieux.
Dis-moi si de ton côté c'est OK.


Bonne prog



-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
3
florantanplan Messages postés 76 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 8 septembre 2006
8 août 2005 à 14:12
Utilise "Dateadd".
Exemple:
Ajout de 3 jours à la date contenu dans la variable "VarDate":
DateAdd("d",3,VarDate)
Ajout de 5 heurers à la date contenu dans la variable "VarDate":
DateAdd("h",5,Vardate)

Ca devrait t'aider...
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 14:34
Oui cela fonctionne mais comment faire pour obtenir directement le nombre d'heures >24.
Car dés qu'en ajoutant avec DateAdd des heures et que le total fait plus que 24h, il inscrit une date devant du genre : 26/04/1900 14:10:00.

C embêtant !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PtitGrumo Messages postés 205 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 28 novembre 2005 2
8 août 2005 à 14:36
Salut :)
Petite parenthèse il est normal que cela ne marche plus si tu a trop d'heure car dans ton format tu ne met que 2 'h' fait ceci Format(Time,"hhhh")

Sinon je te propose ceci!

Public function AddHeure(Time1 as string, Time2 as string)



dim h1 as long
dim h2 as long
dim m1 as long
dim m2 as long

h1 = clong(format(cdate(Time1),"hhhh"))
h2 = clong(format(cdate(Time2),"hhhh"))
m1 = clong(format(cdate(Time1),"mmmm"))
m2 = clong(format(cdate(Time2),"mmmm"))

... etc


end function

Ok ya plein de ligne et plein de variable mais au moins l'écriture de ton code est simple et clair et quand on débute c'est toujours bon pour revenir après 1 an sur son code!

++

PtitGrumo
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 14:52
Pour PtitGrumo,

Salut à toi et merci pour ton aide mais ca ne fnctionne pas même avec 'hhhh'. Et avec tes expressions non plus ... ou je comprends peut être rien !!
Mais avec tes expressions comment fais tu pour additionner les deux heuresTime1 et time2?

Merci
Phil
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 14:53
C'est Clng non? (plutôt que Clong)
0
PtitGrumo Messages postés 205 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 28 novembre 2005 2
8 août 2005 à 15:11
Oups !

Bien sur que c'est Clng excuse ca m'a échapé comme quoi phil t'es pas si mauvais que ca lol et moi le codeur de la vieille bin jsuis pas si fort que ca mdr lool


Tu as du coup réussi avec clng ? ou ca marche toujours pas?

Public function AddHeure(Time1 as string, Time2 as string)

dim h1 as long
dim h2 as long
dim m1 as long
dim m2 as long
dim Res as long

if isnull(Time1) or isnull(Time2) then exit function

h1 = clng(format(cdate(Time1),"hhhh"))
h2 = clng(format(cdate(Time2),"hhhh"))
m1 = clng(format(cdate(Time1),"mmmm"))
m2 = clng(format(cdate(Time2),"mmmm"))

m1=m1+m2
res = m1/60
h1 = h1 + h2 + res
m1 = m1 - (res*60)

AddHeure = cstr(h1) & ":" & cstr(m1)

end function


cela marche mieu?
tien moi au courant

PtitGrumo
0
PtitGrumo Messages postés 205 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 28 novembre 2005 2
8 août 2005 à 15:12
Excuse encore un oubli

remplace
Public function AddHeure(Time1 as string, Time2 as string)

par
Public function AddHeure(Time1 as string, Time2 as string) as string

Pfff décidement le lundi ....
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 15:55
J'ai un textBox qui contient 22:10:00 et quand j'apelle ta fonction,
h1 = clong(format(cdate(Time1),"hhhh")) me renvoi 2222 au lieu de 22. Pourkoi??
J'y comprends plus rien !

Et même en précisant 'hhhh' dans le format, si la somme des deux Time est > à 24h il rajoute une date devant. Il ne va jamais plus loin que 23h ...
Snifffff
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 16:39
G trouvé une fonction qui fonctionne apparemment !!

Public Function subaru(h1 As String, h2 As String) As String
h = Val(Mid(h1, 1, InStr(1, h1, ":") - 1)) + Val(Mid(h2, 1, InStr(1, h2, ":") - 1))
m = Val(Mid(h1, InStr(1, h1, ":") + 1, InStr(InStr(1, h1, ":") + 1, h1, ":") - InStr(1, h1, ":"))) + Val(Mid(h2, InStr(1, h2, ":") + 1, InStr(InStr(1, h2, ":") + 1, h2, ":") - InStr(1, h2, ":")))


If m > 60 Then
Hplus = Fix(m / 60)
m = m Mod 60
End If
h = h + Hplus
subaru = Str(h) & " h " & Str(m) & " min"

End Function
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 16:48
Merci à toi CanisLupus ca fnctionne comme je le voulais. Intéressant ton code, je ne conaissais pas les fonctions Split et join ! Je vais essayer de comprendre comment tu as fais.

Je vais juste essayer (avec un TimeSerial je pense) d'aficher par exemple:
220:05:03 plutôt que 220:5:3 pour le côté ésthétique ... je sais je chipotte !

En tout cas merci à toi et à tous ceux qui m'ont aidé !
0
PtitGrumo Messages postés 205 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 28 novembre 2005 2
8 août 2005 à 16:48
OK alors fait cela!

Public Function AddHeure(Time1 As String, Time2 As String) As String
Dim h1 As Long
Dim h2 As Long
Dim m1 As Long
Dim m2 As Long


Dim Res As Long
Dim i1 As Integer
Dim i2 As Integer


Time1 = "0256:25:60"
Time2 = "6:05:10"


If IsNull(Time1) Or IsNull(Time2) Then Exit Function


If InStr(1, Time1, ":") = 0 Then Exit Function


i1 = InStr(1, Time1, ":")
h1 = CLng(Left(Time1, i1 - 1))
i2 = InStr(i1 + 1, Time1, ":")
m1 = CLng(Mid(Time1, i1 + 1, i2 - i1 - 1))


i1 = InStr(1, Time2, ":")
h2 = CLng(Left(Time2, i1 - 1))
i2 = InStr(i1 + 1, Time2, ":")
m2 = CLng(Mid(Time2, i1 + 1, i2 - i1 - 1))


m1 = m1 + m2
Res = m1 / 60
h1 = h1 + h2 + Res
m1 = m1 - (Res * 60)


AddHeure = CStr(h1) & ":" & CStr(m1)

End Function

++ et tien moi au courant merci


0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
8 août 2005 à 17:23
La fonction split() permet de transformer une chaine en tableau en spécifiant un car de séparation (ici ':').
La fonction join() fait l'inverse, elles reconstitue une chaine à partir d'un tableau.


Pour ton problème de format sur 2 caractères, je te suggère de mettre :
If CInt(t3(1)) < 10 Then t3(1) = "0" & t3(1)
If CInt(t3(2)) < 10 Then t3(2) = "0" & t3(2)
avant
AddHours = Join(t3, ":")

Je n'ai pas trouver de méthode plus simple.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 août 2005 à 23:43
Vraiment merci à tous les deux !!! Tout fonctionne comme je le voulais.
J'essairai ta solut demain (canislupus) !

Bye
Phil
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
9 août 2005 à 22:28
J'ai testé ta fonction PtitGrumo et ca fonctionne aussi.
Sur ta fonction (CanisLupus) j'ai remplacé les CInt par des Clng dans l'optique ou j'additionnerais 10000:10:00 avec 1000:00:00

Merci à tous les 2 !!!
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
12 août 2005 à 08:31
C'est encore moi .....
Une question CanisLupus:
Si je veux maintenant réaliser une soustraction d'heures avec toujours ce fameux format étendu pour les heures, me suffit t'il de remplacer les + dans la fonction par des - ??

Merci d'avance !

Phil
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
12 août 2005 à 13:09
Non, ça ne suffit pas mais les transformations ne sont pas compliquées. En rouge les modifs :

Function SubHours(h1 As String, h2 As String) As String
Dim t1() As String
Dim t2() As String
Dim t3() As String
Dim tmp As Integer


t1 = Split(h1, ":")
t2 = Split(h2, ":")
t3 = Split("00:00:00", ":")

'soustraction des secondes
tmp = CInt(t1(2)) - CInt(t2(2))
If tmp >= 0 Then
t3(2) = CStr(tmp)
Else
t3(1) = "-1"
t3(2) = CStr(tmp + 60)
End If

'soustraction des minutes
tmp = CInt(t1(1)) - CInt(t2(1))
If tmp >= 0 Then
t3(1) = CStr(CInt(t3(1)) + tmp)
Else
t3(0) = "-1"
t3(1) = CStr(CInt(t3(1)) + (tmp + 60))
End If

'soustraction des heures
t3(0) = CStr(CInt(t3(0)) + CInt(t1(0)) - CInt(t2(0)))

If CInt(t3(0)) < 10 Then t3(0) = "0" & t3(1)
If CInt(t3(1)) < 10 Then t3(1) = "0" & t3(1)
If CInt(t3(2)) < 10 Then t3(2) = "0" & t3(2)


SubHours = Join(t3, ":")

End Function

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
16 août 2005 à 16:40
Merci à toi, je vais essayer ca et chercher à comprendre !!!
Bye

Phil
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
16 août 2005 à 17:01
Je suis sùr que tu vas comprendre mais si tu as besoin d'une précision, je reste à l'écoute.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Rejoignez-nous