SVP Calcul heure Excel VBA

takin55 Messages postés 40 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 18 décembre 2006 - 13 déc. 2005 à 11:19
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 15 déc. 2005 à 14:12
Voila ma question svp

j'ai créé mon Userform1 dans Excel et j'ai créé 3 cases

1ère : Heure d'arret ex : 12h15
2ème : Heure de reprise ex : 13h30
3ème : Différence ex : 1h15

Je veux en rentrant les Heures d'arret et heure de reprise, afficher automatiquement la différence et donc le total

Mon programme ne réalise le calcul que si j'ai un compte ronr, ex : 13h00 - 12h00 = 1h00

Voici le code fournit par valtrase
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Date1 As Date: Dim Date2 As Date
If TextBox2 = "" Then
'MsgBox "La deuxième heure doit être entrée !!"
Else
Date1 = Replace(TextBox1, "h", ":")
Date2 = Replace(TextBox2, "h", ":")
If Date2 > Date1 Then
TextBox6 = CDate(Date2 - Date1)
Else
TextBox6 = CDate(Date1 - Date2)
End If

End If


End Sub


Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Date1 As Date: Dim Date2 As Date


If TextBox2 = "" Then
'MsgBox "La première heure doit être entrée !!"
Else
Date1 = Replace(TextBox1, "h", ":")
Date2 = Replace(TextBox2, "h", ":")
If Date2 > Date1 Then
TextBox6 = CDate(Date2 - Date1)
Else
TextBox6 = CDate(Date1 - Date2)
End If
End If


End Sub

Ce code fonctionne correctement si on fait par exemple 20:00 - 18:00 = 02:00

Par contre si on fait 20:00 - 05:00 le resultat est 15:00 au lieu de 09:00

Comment resoudre ce probleme SVP
Autre probleme si je rentre un chiffre >24 le programme bug sur Date2 Replace(TextBox2, "h", ":")

Je ne saisit pas bien

Je voulais également savoir comment mettre le format dans la 3ème case sous forme 00:00 et non 00:00:00 comme fait actuellement

Merci de me repondre

7 réponses

Osiris6880 Messages postés 36 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 7 décembre 2007
13 déc. 2005 à 13:24
"Ce code fonctionne correctement si on fait par exemple 20:00 - 18:00 = 02:00

Par contre si on fait 20:00 - 05:00 le resultat est 15:00 au lieu de 09:00"

Sérieusement je vois pas en quoi 15:00 est un résultat faux ???
La différence est bien de 15, 20-5 15, comme 20-18 2.

Donc donne un exemple plus convaincant si jamais ton code ne fonctionne vraiment pas !!!

Osiris6880
0
takin55 Messages postés 40 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 18 décembre 2006 1
13 déc. 2005 à 13:48
T'as pas compris mon probleme dans 1 journée y'a 24 h

donc si la premiere heure est 20 h (apres midi) et la seconde 5h (matin)

la différence c'est pas 15h mais 9h
20h + 4 h = 24h00 donc minuit et de minuit à 5h y'a 5h

donc 4h + 5h = 9h et non 15h

Voila mon probleme c'est pour passer d'un jour à l'autre en faite

alors si tu peux m'aider .... je t'en remercie d'avance
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
13 déc. 2005 à 15:46
Je crois moi qu'il a très bien compris ton problème ^^

20:00 - 05:00 fera toujours 15:00

C'est 05:00 - 20:00 qui fait 09:00 si tu vois la différence :)

Ton code, à ce niveau là :
"Date1 = Replace(TextBox1, "h", ":")
Date2 = Replace(TextBox2, "h", ":")
If Date2 > Date1 Then"
Si tu regardes bien, il interprète les 2 heures qu'il a récupéré et pour le calcul, il prend toujours l'heure la plus élevée - la moins élevée.
En d'autres termes, tu as une cellule heure de reprise et heure d'arrêt, ce qui ne sert à rien dès que tu réfléchis sur 2 jours différents.


Pour cette remarque :
"Autre probleme si je rentre un chiffre >24 le programme bug sur Date2 Replace(TextBox2, "h", ":")"
Pourquoi veux tu que ça marche ? Tu rentres une heure d'arrêt et une heure de reprise, on ne peut donc jamais rentrer une heure > 24 !

Pour celle-ci :
"Je voulais également savoir comment mettre le format dans la 3ème case sous forme 00:00 et non 00:00:00 comme fait actuellement"
IL faut utiliser la commande Format (un truc du style format(txtbox.text,"hh:mm"), revérifier la syntaxte.





Pour finir, une petite réflexion toute bête.
Puisque tu es dans Excel, quel besoin de s'embêter avec un userform et du code vb ?
Excel gère de lui même les calculs de date, tu n'as rien à faire.
Tu choisis un format de date/heure pour 3 cellules, la formule de la 3ème est égale à la 2eme cellule moins la première, et c'est magique, tout marche en allez... 5 secondes de saisie !
0
takin55 Messages postés 40 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 18 décembre 2006 1
13 déc. 2005 à 16:27
Merci Molenn de t'etre penché sur mon probleme

voila pourquoi je reflechit sur 2 jours

ce programme sert a des personnes qui travaillent en 3/8 donc il est possible qu'une panne survienne à 22h et que la reprise soit à 4h du matin

donc il faut bien arriver a faire le calcul de 22h à 4h ca fait 6h de pannes ----> c'est ca mon probleme

d'autre part si je gere pas ca dans excel directement c'est que j'ai une bonne raison en effet y'a pas que ca que je gere j'ai tout une base de données qui vient s'incrémenter dans excel mais il me maque juste cette gestion de l'heure voila

si tu as une methode pour debuger mon programme merci de m'aider
0

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

Posez votre question
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
14 déc. 2005 à 06:58
Bonjour
Il suffit d'adapter le code ci-dessous:

Dim WshShell, Saisie, DateEntree, DateSortie, Signe, Msg, n, hh, mn, result, s
Set WshShell = WScript.CreateObject("WScript.Shell")


Saisie = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Saisir votre date sous la forme:"_
&vbCrLf&vbCrLf&"jj/mm/aaaa hh:mm - jj/mm/aaaa hh:mm"&vbCrLf&"Remplacer les 5 derniers caractères hh:mm",_
"Calcul d'intervalle de temps en minutes", Left(Now, 16) & " - " & Left(Now, 10) & " 00:00")


DateEntree = Mid(Saisie, 1, 16) & ":00"
DateSortie = Mid(Saisie, 20, 16) & ":00"
Signe = "-"'Mid(Saisie, 18, 1)


' y = DateDiff("yyyy", DateSortie, DateEntree) ' aaaa
' m = DateDiff("m", DateSortie, DateEntree) ' mm
' d = DateDiff("y", DateSortie, DateEntree) ' jj
' h = DateDiff("h", DateSortie, DateEntree) ' hh
' n = DateDiff("n", DateSortie, DateEntree) ' mn
' s = DateDiff("s", DateSortie, DateEntree) ' ss


n = DateDiff("n" , DateSortie, DateEntree)


Temps = n * 60 'temps en secondes


hh = Temps / 3600
mn = (hh - Int(hh)) * 60


If hh >= 24 Then
jj = Int(hh / 24)
hh = hh - jj * 24
End If


Conversion = Int(jj) & " j " & Int(hh) & " h " & Int(mn) & " mn"
Msg = "Comparaison de dates du " & DateSortie & " au " & DateEntree &vbCrLf&vbCrLf
Msg = Msg & "La différence entre les 2 dates est : " &vbCrLf&vbCrLMsg Msg & "Nombre total en minutes " & n &vbCrLf&vbCrLf
MsgBox s & " " & Msg &vbCrLf& " soit: " & Conversion, vbApplicationModal + vbDefaultButton1 + vbInformation + vbOKOnly, "Résultat"


If n =0 Then
MsgBox "Les dates à comparer sont identhiques"
InputBox Saisie , "Calcul d'intervalle de temps en minutes", Left(Now, 16) &" - " & Left(Now, 11) & " 00:00"', Left(Now, 16) & " - " & Left(Now, 10) & " 00:00", "Calcul d'intervalle de temps en minutes", Left(Now, 16) & " - " & Left(Now, 11) & " 00:00"
Else
Msg = "Comparaison de dates du " & DateSortie & " au " & DateEntree &vbCrLf&vbCrLf
Msg = Msg & "La différence entre les 2 dates est : " &vbCrLf&vbCrLf Msg Msg & "Nombre total en minutes " & n &vbCrLf&vbCrLf Msg Msg & "Nombre de jours " & Int(jj)&vbCrLf&vbCrLf Msg Msg & "Nombre de heures " & Int(hh)&vbCrLf&vbCrLf Msg Msg & "Nombre de minutes " & Int(mn)
MsgBox Msg '& "La différence entre les 2 dates est : " &vbCrLf&vbCrLf& Msg
End If


Set WshShell = Nothing
WScript.Quit
0
takin55 Messages postés 40 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 18 décembre 2006 1
14 déc. 2005 à 08:09
La vache merci mais tu sais moi je suis pas un pro du VB

Le code c'est du VB pas du VBA car il me met plein d'erreur

Comment l'adapter pour ma feuille excel avec des textbox

Si tu peux m'aider je t'en remercie d'avance
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
15 déc. 2005 à 14:12
Repartons de là :
"ce programme sert a des personnes qui travaillent en 3/8 donc il est possible qu'une panne survienne à 22h et que la reprise soit à 4h du matin

donc il faut bien arriver a faire le calcul de 22h à 4h ca fait 6h de pannes ----> c'est ca mon probleme"

C'est ce que je t'expliquais dans mon premier post (premier point), la formule de ton calcul est fausse. Il faut donc la modifier. Je détaille (excuse moi si je détaille trop hein ^^) :

Dim Date1 As Date: Dim Date2 As Date
'=> Définition des variables. Ok

If TextBox2 = "" Then
'MsgBox "La première heure doit être entrée !!"
'=> Message qui prévient que la zone est vide et donc, qu'il n'y a pas de calculs (au passage, la présence de la cotte fait que ce message ne s'affichera jamais)
Else
Date1 = Replace(TextBox1, "h", ":")
Date2 = Replace(TextBox2, "h", ":")
'Remplacement des "h" par ":" qui donnera l'heure dans un format exploitable.
If Date2 > Date1 Then
TextBox6 = CDate(Date2 - Date1)
Else
TextBox6 = CDate(Date1 - Date2)
End If
'Le problème, c'est cette boucle là : Elle dit textuellement :
'Si date2 (qui est donc l'heure de reprise) est supérieure à Date1 (heure d'arrêt), alors la différence au format heure sera Reprise - arrêt => Ce qui nous donnera la bonne réponse ( Arrêt 10:00, reprise 15:00 => durée = 5:00)
'Sinon (sous entendu donc, si date 1 supérieure à date 2, alors
'la différence au format heure sera Arrêt - Reprise => Ce qui sera donc faux dans ton cas ( arrêt 21:00, reprise 03:00 => durée = 18:00)
'Il faut donc virer cette condition pour la remplacer par le calcul qui t'intéresse.
End If

En résumé, ton code devrait être :

Dim Date1 As Date: Dim Date2 As Date

If TextBox2 = "" Then
'MsgBox "La première heure doit être entrée !!"
Else
Date1 = Replace(TextBox1, "h", ":")
Date2 = Replace(TextBox2, "h", ":")
TextBox6 = CDate(Date2 - Date1)
End If

Et le tour est joué ( à condition bien entendu que Date 2 soit bien ton heure de reprise et date1 ton heure d'arrêt :))

Molenn
0
Rejoignez-nous