Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Soustraction de format heure avec résultat négatif VBA

  • Initiateur de la discussion Initiateur de la discussion Yabon21
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Yabon21

XLDnaute Nouveau
Bonjour à tous,
Je viens à vous car je suis complètement bloqué avec un bug qui se produit lorsque je lance, en VBA, une soustraction de deux cellules au format "heure" dont le résultat est négatif.
En gros je veux soustraire une heure réel de sortie avec une heure théorique de sortie. Le résultat est donc positif lorsque la sortie se fait en avance par rapport à l'heure théorique et négatif si la sortie se fait en retard par rapport à l'heure théorique.

je vous ai joins mon tableau excel.
Pour le tester voici des données à remplir dans les userform :
1/ lancer la macro en cliquant sur le bouton en haut à gauche du tableau
2/ renseigner N° de train 745633
3/ renseigner la case protection 3:42
4/renseigner la case présence CRTT 4:37
5/ valider ce qui lance le deuxième userform
5/ renseigner la case prêt au départ 5:12
6/ renseigner la case départ 5:15
7/ valider ce qui lance le troisième userform
8/ renseigner la case départ 5:35

les résultats obtenus doivent correspondre à cela :

E5 : -00:10
F5 : 00:00
G5 : 02:00
H5 : 04:00

Merci d'avance de votre aide!
 

Pièces jointes

Petit avancement.
J'ai fait un petit bout de code pour capter les valeurs reçues, j'ai appelé les variables par leur nom de cellules, plus simples à lire. On obtient :

Certaines cellules sont des nombres, mais certaines cellules sont des chaines de caractères, en particulier W5,L5,Q5,S5. Donc les calculs ne peuvent pas marcher. Reste à trouver pourquoi, et le résoudre.

En fait, tout ce qui vient des userforms sont des chaines de caractères, non des nombres.
Il faut donc transformer "5:35" en 5:35.
 
Dernière édition:
Oui mais comme le type est chaine, un changement de format ne change rien.
Si on a Chaine="5:12" alors il faut faire Heure=5/24+12/1440.
Il faut splitter la chaine avec le séparateur ":"
 
bonsoir
en vba pour le calcul de différence d'heure il y a application.text qui gère très bien sans faire le cumul
en addition
par exemple selon toi quel serait le résultat souhaité pour ceci

heure1 = CDate("01:28:00")
heure2 = CDate("08:54:12")
msgbox heure1-heure2
 
et ben alors
VB:
'soustraction
    heure1 = CDate("01:28:00")
    heure2 = CDate("08:54:12")
    If heure1 < heure2 Then temp = heure1: heure1 = heure2: heure2 = temp
    TH = heure1 - heure2

    'formatage avec la fonction ""Text"" de application
    MsgBox "soustraction  des heures : " & Application.text(TH, "[hh]:mm:ss")

et c'est pareil pour additionner on cumule au dela de 24:00:00 et sans inverser
VB:
'addition
    heure1 = CDate("23:17:08")
    heure2 = CDate("01:34:27")
    TH = heure1 + heure2

    'formatage avec la fonction ""Text"" de application
    MsgBox "cumul des heures : " & Application.text(TH, "[hh]:mm:ss")    'les crochets associés a app.text  indiquent que les heures se cumulent au dela de 24

    'sans formatage on obtient un  temps
    MsgBox "temps résultant :" & Format(TH, "hh:mm:ss")
😉
 
Waouu me voila perdu une deuxième fois en 10 minutes
Si j'essaie de comprendre :
1/("01:28:00") et ("08:54:12") sont à remplacer par mes valeurs sources? Feuil1.cells(X,X).value?
2/ je ne comprends pas comment diriger le résultat vers une cellule.
Est ce comme ça? Feuil1.cells(X,X).Application.text(TH, "[hh]:mm:ss")
 
Ca me met une erreur de syntaxe pourtant sur la dernière ligne
VB:
    heure1 = CDate(Feuil1.Cells(5, 23))
    heure2 = CDate(Feuil1.Cells(5, 16))
    If heure1 < heure2 Then temp = heure1: heure1 = heure2: heure2 = temp
    TH = heure1 - heure2

   Feuil1.Cells(5, 3).Application.Text(TH, "[hh]:mm:ss")
 
Bonjour Yabon, Patrick,
Une autre solution, c'est, une fois posé les textbox en ligne 5 de lancer une conversion sur toute la ligne, avec :
VB:
Sub Convertir()
For C = 1 To 38
    If Sheets("SENS IMPAIR").Cells(5, C) Like "*:*" Then
        Sheets("SENS IMPAIR").Cells(5, C) = CDate(Sheets("SENS IMPAIR").Cells(5, C))
    End If
Next C
End Sub
De cette façon tous les chaines comportant ":" seront transformées en heures.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
468
  • Question Question
Réponses
15
Affichages
1 K
  • Question Question
Réponses
8
Affichages
973
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…