DateDiff heures en VBA

Résolu
Pryn -  
Pryn29 Messages postés 16 Statut Membre -
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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    En lecture rapide : tu as un Range et un Cells sans parents
    0
  2. Pryn29 Messages postés 16 Statut Membre
     
    Oui j'ai modifié ce point mais ça ne change rien.
    C'est toujours à zéro.
    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      dlt2 est un numéro de colonne utilisé comme numéro de ligne dans Range("f" & dlt2) et Range("g" & dlt2) ????
      0
      1. Pryn29 Messages postés 16 Statut Membre > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
         
        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
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  4. Pryn29 Messages postés 16 Statut Membre
     
    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
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      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
    2. Pryn29 Messages postés 16 Statut Membre > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Pryn29 Messages postés 16 Statut Membre
       
      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
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Pryn29 Messages postés 16 Statut Membre
       
      le code que tu montres ne peut pas fonctionner, tu devrais avoir un message d'erreur.
      0
    5. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783 > Pryn29 Messages postés 16 Statut Membre
       
      Mauvaises déclarations aussi, mettre :
      Dim hdebut As Date, hfin As Date, minutes As Double, dlt2 As Long, dlt As Long
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Pryn29 Messages postés 16 Statut Membre
     
    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