DateDiff heures en VBA

Résolu/Fermé
Pryn - Modifié le 3 avril 2020 à 18:36
Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020 - 4 avril 2020 à 16:52
Bonjour,
J'essaie de calculer un intervalle, entre heure de début d'activité et de fin.
hdebut et hfin sont en hh:mm et je souhaiterai calculer la différence en heure 0,00 ou en minutes 000.
Mais ça m'affiche toujours 0 dans cette case.
colonne f : hdebut
colonne g : hfin
colonne h : calcul intervalle
L'heure de début se fait sur un autre code.


Voilà où j'en suis :

If Sheets("TrackTime").Range("g2") = "" Then
Sheets("TrackTime").Range("g2") = Now()

Else
    Sheets("TrackTime").ListObjects(2).ListRows.Add
End If
    dlt = Sheets("TrackTime").Range("g1048576").End(xlUp).Row
    dlt2 = Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, LookIn:=xlValues).Column
    
hdebut = Sheets("TrackTime").Range("f" & dlt2).Value
hfin = Sheets("TrackTime").Range("g" & dlt2).Value
Range("g" & dlt).NumberFormat = "hh:mm"


    Sheets("TrackTime").Range("g" & dlt) = Now()
    Sheets("TrackTime").Range("h" & dlt) = DateDiff("n", hdebut, hfin)
    
    
Unload FormFin



Merci d'avance de vos réponses ! :)

Configuration: Windows / Chrome 80.0.3987.149

5 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
3 avril 2020 à 19:08
Bonjour,

En lecture rapide : tu as un Range et un Cells sans parents
0
Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020
3 avril 2020 à 19:17
Oui j'ai modifié ce point mais ça ne change rien.
C'est toujours à zéro.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
4 avril 2020 à 00:39
dlt2 est un numéro de colonne utilisé comme numéro de ligne dans Range("f" & dlt2) et Range("g" & dlt2) ????
0
Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020 > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
Modifié le 4 avril 2020 à 09:34
Je crois que le problème vient de cette partie-là.
Je me sers de dlt pour pouvoir écrire à la suite dans le tableau.
J'ai cherché pour dlt2 une seconde formule me permettant d'aller chercher la dernière cellule remplie de la colonne (formule qui ne fonctionne apparemment pas ^^).
Puisque là du coup il calcule avec les cellules suivantes et du coup forcément ça fait zéro.

Hdebut.....Hfin.......Temps
9:13.........9:15.........0,00
8:06.........9:16.........0,00

Merci beaucoup des réponses, ça fait un moment que je planche dessus, je me sens moins seule là ^^
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
4 avril 2020 à 09:09
bonjour, si tes dates et heures sont bien enregistrées comme des nombres (et pas du texte), tu peux réaliser cela facilement avec une formule, en multipliant la différence par 24*60.
en vba:
Option Explicit
Private Sub mins()
Dim hdebut As Date, hfin As Date, minutes As Single, dlt2 As Long, dlt As Long
hdebut = Sheets("TrackTime").Range("f" & dlt2).Value
hfin = Sheets("TrackTime").Range("g" & dlt2).Value
minutes = (hfin - hdebut) * 24 * 60
Sheets("TrackTime").Range("h" & dlt) = minutes
End Sub
0
Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020
4 avril 2020 à 09:44
Merci pour ta réponse !
Alors du coup j'ai essayé, j'en suis là :


Dim hdebut, hfin As Date, minutes As Single, dlt2 As Long, dlt As Long
Option Explicit
Private Sub Bouton_Click()
If Sheets("TrackTime").Range("g2") = "" Then
Sheets("TrackTime").Range("g2") = Now()
Else
    Sheets("TrackTime").ListObjects(2).ListRows.Add
End If
    dlt = Sheets("TrackTime").Range("g1048576").End(xlUp).Row
hdebut = Sheets("TrackTime").Range("f" & dlt).Value
hfin = Sheets("TrackTime").Range("g" & dlt).Value
minutes = (hfin - hdebut) * 24 * 60

    Sheets("TrackTime").Range("g" & dlt) = Now()
    Sheets("TrackTime").Range("h" & dlt) = minutes



Mais au lieu de donner zéro comme d'habitude maintenant ça fait ça :
Hdebut....Hfin.......Temps
9:13........9:15........0,00
8:06........9:16........0,00
9:22........9:31........-63252564,00

Comme je disais sur le commentaire au dessus je pense que le problème vient d'où il va chercher les hdebut et hfin, il va chercher sur la première case vide suivante et pas sur la dernière case remplie.
Je n'arrive pas à incrémenter une formule qui va chercher les bonnes informations, c'est pour ça que j'avais essayé de bidouiller la dlt2, qui ne fonctionne pas.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 4 avril 2020 à 10:18
As-tu vu ma réponse au sujet de dlt2 ?
Ne serait-ce pas plutôt :
    dlt2 = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
0
Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020 > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
4 avril 2020 à 10:20
Oui je t'y ai répondu :)
Je suis maintenant là :

Dim hdebut, hfin As Date, minutes As Single, dlt2 As Long, dlt As Long
Option Explicit

Private Sub BtnFin_Click()
If Sheets("TrackTime").Range("g2") = "" Then
Sheets("TrackTime").Range("g2") = Now()

Else
    Sheets("TrackTime").ListObjects(2).ListRows.Add
End If
    dlt = Sheets("TrackTime").Range("g1048576").End(xlUp).Row
     dlt2 = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
    
hdebut = Sheets("TrackTime").Range("f" & dlt2).Value
hfin = Sheets("TrackTime").Range("g" & dlt2).Value
minutes = (hfin - hdebut) * 24 * 60


    Sheets("TrackTime").Range("g" & dlt) = Now()
    Sheets("TrackTime").Range("h" & dlt) = minutes
    
        
Unload FormFin

End Sub


Et résultat :
Hdebut....Hfin.......Temps
10:18.....10:19.....-63252620,00
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020
4 avril 2020 à 10:58
comment obtiens-tu les valeurs que tu nous montres pour hdebut, hfin et minutes?
peut-être
msgbox cstr(hdebut)+" | "+cstr(hfin)+" | "+cstr(minutes)+" | "+cstr(dlt)+" | "+cstr(dlt2)
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020
4 avril 2020 à 10:59
le code que tu montres ne peut pas fonctionner, tu devrais avoir un message d'erreur.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775 > Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020
4 avril 2020 à 11:14
Mauvaises déclarations aussi, mettre :
Dim hdebut As Date, hfin As Date, minutes As Double, dlt2 As Long, dlt As Long
0

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

Posez votre question
Pryn29 Messages postés 16 Date d'inscription mardi 2 janvier 2018 Statut Membre Dernière intervention 4 avril 2020
4 avril 2020 à 12:01
Je confirme qu'en découpant le process (arrêter + rafraîchir) du coup hfin a du contenu et ça génère un résultat en minutes :


Il faudrait donc que le découpage se fasse sur le premier bouton (si c'est possible)
On peut créer un temps de latence entre les deux fonctions ?
0