IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Calcul ecart de temps [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut Calcul ecart de temps
    Bonjour,

    Je suis en train de mettre en place un fichier excel qui va me permettre de calculer l'écart entre deux heures.
    En fait, dans mon fichier excel j'ai des données qui sont mises à jour, quand une certaine donnée passe à 1 je dois déclencher mon compteur de temps. Puis si elle passe à 0 je dois le stopper. Si elle repasse à 1, je dois le redémarrer.
    Ainsi de suite jusqu'à ce que l'utilisateur clique sur un bouton RAZ qui remette tout à 0.
    J'ai trouver des fonctions comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDiff("s", date1, date2)
    mais ça ne me convient pas parce que je veux avoir un écart en seconde mais également en minute voir en heure.
    Pourriez-vous m'aider ?
    Merci par avance.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour
    Analyse ce petit test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
    Dim T1 As Date, T2 As Date
    Dim S As Long
     
    T1 = TimeValue("01:13:45")
    T2 = TimeValue("06:51:21")
    S = DateDiff("s", T1, T2)
    MsgBox S & "   :   " & TimeSerial(0, 0, S)
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Merci bien pour ce bout de code !

    Quand je le test il marche très bien par contre quand je le modifie avec ce que je veux faire j'ai un petit problème de dépassement de capacité ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
     
    Dim tempDepart As Date
    Dim tempsArret As Date
    Dim tempsExecution As Date
     
     
    Dim T1 As Date, T2 As Date
    Dim S As Long
     
    If Feuil1.Range("A1").Value = 1 Then
    tempsDepart = Time
     
    End If
     
    If Feuil1.Range("A1").Value = 0 Then
     
    tempsArret = Time
    S = DateDiff("s", tempsDepart, tempsArret)
    MsgBox S & "   :   " & TimeSerial(0, 0, S)
    End If
     
    End Sub
    La fonction Time renvoie la même chaine que tu passes à TimeValue nan ?

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    En effet, les paramètres de TimeSerial(h,m,s) sont des Integer

    Il faudra faire le calcul basique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Option Explicit
    Dim TempsDepart As Date, TempsArret As Date, TempsExecution As Date
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Dim S As Long, H As Long, M As Long
     
    If Range("A1").Value = 1 Then TempsDepart = Time
    If Range("A1").Value = 0 Then
        TempsArret = Time
        S = DateDiff("s", TempsDepart, TempsArret)
        H = Int(S / 3600)
        M = Int((S - 3600 * H) / 60)
        S = S - 3600 * H - 60 * M
        MsgBox TimeSerial(H, M, S)
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Je ne comprends pas ce que fait la fonction TimeSerial ...
    En tout cas la ligne suivante m'affiche l'heure courante du système et pas l'écart de temps entre mes deux changements de valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox TimeSerial(H, M, S)
    J'ai essayé en laissant quelques secondes et plusieurs minutes et le résultat est le même.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Parce que ton heure de départ est nulle, c'est pourquoi le Msgbox indique l'heure actuelle

    tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox H &":" & M & ":" & S
    Essaies ce code pour voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Dim TempsDepart As Date, TempsArret As Date, TempsExecution As Date
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Dim S As Long, H As Long, M As Long
     
    If Range("A1").Value = 1 Then TempsDepart = Time
    MsgBox "temps départ: " & TempsDepart
    If Range("A1").Value = 0 Then
        TempsArret = Time
        MsgBox "temps arrêt: " & TempsArret
        S = DateDiff("s", TempsDepart, TempsArret)
        H = Int(S / 3600)
        M = Int((S - 3600 * H) / 60)
        S = S - 3600 * H - 60 * M
        MsgBox H & ":" & M & ":" & S
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Toutes mes excuses, le code fonctionnait bien !

    Grâce à vous j'ai bien avancé, je lance mon compteur de temps.
    J'ai essayé de bidouiller une solution pour pouvoir accumuler du temps dans une variable mais ce n'est pas concluant.
    Je résume ce que je veux obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("A1").Value = 1 Then TempsDepart = Time
    Mon compteur se met en route.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If Range("A1").Value = 0 Then
        TempsArret = Time
        S = DateDiff("s", TempsDepart, TempsArret)
        H = Int(S / 3600)
        M = Int((S - 3600 * H) / 60)
        S = S - 3600 * H - 60 * M
        TempsExecution = TempsExecution + TimeSerial(H, M, S)
        MsgBox TempsExecution
    Mon compteur est stoppé et le résultat est conserver dans la variable TempsExecution.

    Le problème c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    est appelé à chaque fois qu'une cellule est modifiée.
    Du coup quand ma cellule A1 reste à 0 alors que d'autres cellules changent de valeur le code contenu dans mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("A1").Value = 0 Then
    est généré. Ce qui me fausse totalement mon compteur ...
    Est-il possible de détecter lorsqu'une certaine cellule change d'état ?

    Je ne sais pas si mon explication est claire donc n'hésitez pas à me demander plus de détails. Je met le code complet ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Option Explicit
    Dim TempsDepart As Date, TempsArret As Date, TempsExecution As Date
     
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Dim S As Long, H As Long, M As Long
     
    If Range("A1").Value = 1 Then TempsDepart = Time
    If Range("A1").Value = 0 Then
        TempsArret = Time
        S = DateDiff("s", TempsDepart, TempsArret)
        H = Int(S / 3600)
        M = Int((S - 3600 * H) / 60)
        S = S - 3600 * H - 60 * M
        TempsExecution = TempsExecution + TimeSerial(H, M, S)
        MsgBox TempsExecution
    End If
    End Sub
     
    Private Sub Worksheet_Activate()
    MsgBox "La Feuil1 est activée"
    TempsExecution = "00:00:00"
    MsgBox "TempsExecution :" & TempsExecution
    End Sub

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Le Target désigne la plage de cellules sélectionnées
    tu peux tester l'adresse (par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Dim S As Long, H As Long, M As Long
     
    If Target.Address = "$A$1" Then
        If Range("A1").Value = 1 Then TempsDepart = Time
        MsgBox "temps départ: " & TempsDepart
        If Range("A1").Value = 0 Then
            TempsArret = Time
            MsgBox "temps arrêt: " & TempsArret
            S = DateDiff("s", TempsDepart, TempsArret)
            H = Int(S / 3600)
            M = Int((S - 3600 * H) / 60)
            S = S - 3600 * H - 60 * M
            TempsExecution = TempsExecution + TimeSerial(H, M, S)
            MsgBox TempsExecution
        End If
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    vois dans ce tuto, ce chapitre :

    http://didier-gonard.developpez.com/...et-vba/#LIII-F

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Merci pour ces deux aides !

    Je crois que j'ai mal interprété la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Ra
    Le changement de valeur se fait automatiquement sans intervention humaine dans la classeur. La cellule récupère d'elle même les valeurs.
    J'ai fait une 'simulation' de ce changement de valeur et je m'aperçois que rien ne se passe ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Dim TempsDepart As Date, TempsArret As Date, TempsExecution As Date
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Dim S As Long, H As Long, M As Long
     
    If Target.Address = "$A$1" Then
     
        If Range("A1").Value = 1 Then
        TempsDepart = Time
        MsgBox "temps départ: " & TempsDepart
        End If
     
        If Range("A1").Value = 0 Then
            TempsArret = Time
            MsgBox "temps arrêt: " & TempsArret
            S = DateDiff("s", TempsDepart, TempsArret)
            H = Int(S / 3600)
            M = Int((S - 3600 * H) / 60)
            S = S - 3600 * H - 60 * M
            TempsExecution = TempsExecution + TimeSerial(H, M, S)
            MsgBox TempsExecution
            Range("B1").Value = TempsExecution
        End If
    End If
    End Sub
     
    Private Sub Worksheet_Activate()
    MsgBox "La Feuil1 est activée"
    TempsExecution = "00:00:00"
    MsgBox "TempsExecution0 :" & TempsExecution
     
    Range("A1").Value = 1
    Sleep 20000
    Range("A1").Value = 0
    End Sub

  11. #11
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    L'évènement Worksheet_SelectionChange se déclenche quand une cellule (ou plage de cellules) est sélectionnée
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Oui effectivement si j'ouvre pas les yeux ça va pas marcher ...
    Je crois que je suis arrivé à mon résultat

    Je pense qu'on aura l'occasion de se recroiser
    Un grand merci !

  13. #13
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je crois que je suis arrivé à mon résultat
    Lequel?
    ça serait utile pour quelqu'un d'autre
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Je me suis enflammé un petit peu ...
    En fait dans mon document Excel, j'ai une feuille qui récupère les valeurs d'un automate automatique via un logiciel sur le PC.
    En gros dans mes cellules j'ai la valeur 0 à 1 qui varie automatiquement.
    Or la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sub Private Sub Worksheet_change(ByVal Target As Excel.Range)
    ne détecte pas ce changement de valeur.
    Mon code est exécuté que quand je le change manuellement ou directement avec le code : .
    Comment je pourrais faire pour que ça fonctionne dans ces conditions ?

    [Edit] Je me suis orienté vers une solution avec les DDE.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] calcul ecart de temps
    Par blandinais dans le forum IHM
    Réponses: 8
    Dernier message: 23/09/2009, 08h35
  2. Calcul d'un temps pour un réglage.
    Par AgriPhilou dans le forum Excel
    Réponses: 2
    Dernier message: 05/05/2008, 20h50
  3. Calcul sur des temps de fonctionnement
    Par micbett dans le forum Modélisation
    Réponses: 10
    Dernier message: 28/02/2008, 16h44
  4. [MySQL] Ecart de temps décomposé en différentes unités (années, mois, jours, etc)
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 01/03/2006, 09h38
  5. [TP]Calculer delai de temps
    Par Alkangelis dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 03/11/2004, 13h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo