Problème de calcul d'heures ! me please
Bonjour,
Je suis un jeune rookie qui se débrouille comme il peut en VBA pour aider la communauté de mes collègues à améliorer leur quotidien en terme de saisi sous Excel.
Je suis en train de créer un programme où dans un UserForm je rentre une valeur en heures/centièmes dans un objet Text et dans celui d'à côté, ces Heures/Centièmes se transforment automatiquement en Heures/Minutes/Secondes.
Voici le code.
Private Sub txtHHC_Change ' TextBox des heures/Centièmes
txtHHC.Value = Replace(txtHHC.Value, ".", ",") ' Je remplace les points par des virgules.
If txtHHC <> "" Then
If Mid(txtHHC, 1, 1) = "," then txtHHC = "0," ' Je demande à ce que lorsque je rentre une virgule sans le zéro, un zéro s'affiche.
txtHHM.Value = Format((txtHHC.Value / 24), "hh:mm:ss") ' je mets ma TextBox Heures/Minutes au format Voulu
Else
txtHHM.Value = Format(0, "hh:mm:ss")
End IfBon tout cela fonctionne à merveille sur le UserForm mais lorsque je clique sur le bouton "Enregistrer", mes heures dans les cellules de ma base de données prennent bien le format "hh:mm:ss" mais lorsqu'en fin de ligne je veux toutes les additionner, et bien le résultat est le suivant: 00:00:00.
Pourquoi l'addition ne se fait-elle pas ? J'ai même essayer de passer toutes mes cellules de mon tableau Excel au format heure mais rien n'y fait. Pouvez-vous làaider sil vous plait ?
Cordialement.
Bonjour,
Je n'y connais pas grans chose en VBAn mais a mon avis
txtHHM.Value = Format((txtHHC.Value / 24), "hh:mm:ss") te donne un format texte, et tu auras beau formater tes cellules, ça restera du texte
essaye
txtHHM.Value = Format((txtHHC.Value / 24), "hh:mm:ss") *1, pour passer en nombre
Ça n'engage que moi ........
Crdmt
Ok Djidji,
Je te remercie pour ce petit conseil et j'essaierai donc cela demain.
Je te tiens au courant.
Mais en même temps je me pose la question suivante. Des heures dans une cellule ne sont-elles pas au format texte logiquement ?
Re
non, c'est un nombre que tu formates
42816, c'est le 22 mars, 42817, c'est le 23 mars
42816,375 c'est le 22 mars a 09:00. la partie decimale correspond aux heures. Une heure=1/24 de jour
Crdmt
Bonsoir,
et un salut vespéral à DjiDji !!
Les dates et heures sont des nombres dans Excel, et dans VBA aussi, mais constituent un type de données un peu particulier (surtout s'agissant des dates, pour les heures moins de problèmes).
Si j'ai bien compris tu saisis des heures en heure et centièmes, soit un nombre décimal, dans une TextBox. Et si j'ai bien compris encore ta saisie se fait avec un point comme séparateur décimal.
Il y déjà 2 choses à bien comprendre tout de suite : une TextBox ne contient que du texte, quoique tu y mettes, une fois que c'est dedans, c'est du texte.
Si tu affectes le contenu de la TextBox à une cellule, si c'est composé de chiffres, et que le séparateur décimal est la virgule (pour Excel FR), Excel convertira automatiquement en nombre. Mais s'il y a un point, pour Excel ce sera du texte...
D'un autre côté VBA ne connait que le point comme séparateur décimal...
Pour convertir un nombre décimal d'heures en valeur horaire, on divise par 24...
Dans ton cas, tu pourrais ne pas toucher au contenu de la TextBox, et convertir lors de la validation :
.Cells(x, x) = Val(txtHHC.Value) / 24Val est une fonction VBA qui récupère toute valeur numérique en début de chaîne et la convertit en nombre, mais qui ne reconnaît que le point comme séparateur décimal.
La ligne ci-dessus, il faudra la doubler par une mise au format de la cellule qui n'est pas automatique dans ce cas...
.Cells(x, x).NumberFormat = "hh:mm"ou "hh:mm:ss" selon choix.
Si tu veux afficher l'horaire dans la TextBox ou une autre comme il apparaît dans ton code :
txtHHM.Value = Format(Val(txtHHC.Value) / 24, "hh:mm:ss")Dans ce dernier cas, si tu affectes le texte ainsi formaté à une cellule, Excel devrait l'identifier comme valeur horaire, le convertir en nombre et formater automatiquement la cellule...
Si cela ne se passe pas ainsi, tu as la ressource d'affecter comme j'ai indiqué plus haut, ou tu convertis avec :
.Cells(x, x) = TimeValue(txtHHM.Value)Possible dans ce cas qu'il faille formater la cellule...
Mais si pour des dates, il faut toujours convertir (avec CDate ou éventuellement DateValue) une valeur chaîne ayant une format de date, en raison des différences de formats français et américain... avec les heures ça se passe habituellement sans problème, et ça me surprend un peu si tu n'as pas des heures à l'arrivée.
N'oublie pas que si tu additionnes des heures, format "[h]:mm:ss" si total peut être supérieur à 24 h...
Cordialement.