takin55
Messages postés40Date d'inscriptionlundi 22 mars 2004StatutMembreDernière intervention18 décembre 2006
-
13 déc. 2005 à 11:19
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 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
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 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 !
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
' 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
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 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 :))