DateDiff heures en VBA

Résolu
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

  1. Bonjour,

    En lecture rapide : tu as un Range et un Cells sans parents
    1. Oui j'ai modifié ce point mais ça ne change rien.
      C'est toujours à zéro.
      1. dlt2 est un numéro de colonne utilisé comme numéro de ligne dans Range("f" & dlt2) et Range("g" & dlt2) ????
      2. @Patrice33740Je 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à ^^
    2. Contributeur
      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
      1. 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.
        1. 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
        2. @Patrice33740Oui 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
        3. Contributeur
          @Pryn29comment 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)
        4. Contributeur
          @Pryn29le code que tu montres ne peut pas fonctionner, tu devrais avoir un message d'erreur.
        5. @Pryn29Mauvaises déclarations aussi, mettre :
          Dim hdebut As Date, hfin As Date, minutes As Double, dlt2 As Long, dlt As Long
      2. 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 ?