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 :

Problème de formats heure


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut Problème de formats heure
    Hello!

    J'ai un petit problème de format... Je m'explique : J'ai une liste de login / logout qui peuvent commencer par exemple le 22.12.2008 à 11:00 avec un logout à 00:30 le 23.12.2008. Je souhaiterais compter combien de temps s'est écoulé entre les deux. Pour ça je pensais couper en 2 : compter combien de temps s'est écoulé de 11:00 à 24:00, puis de 00:00 à 00:30. Mais j'ai une erreur de compatibilité, voilà le bout de code qui devrait le faire :

    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
    If datelogin = datelogout Then
     
        dureeheure = DateDiff("n", heurelogin, heurelogout) / 60
        dureeheure = Format(dureeheure, "#0.00")
        .Range(Cells(i, 6).Address).Value = dureeheure
     
        'Suppression des login / logout de durée 0
        'If dureeheure = 0 Then
            '.Range(Cells(i, 6).Address).EntireRow.Delete
        'End If
     
    Else
     
        'Durée sur 1er jour
        heurebutoire = Format("24:00", "hh:mm")
        dureeheure = DateDiff("n", heurelogin, heurebutoire) / 60
        dureeheure = Format(dureeheure, "#0.00")
        .Range(Cells(i, 6).Address).Value = dureeheure
     
        'Durée sur 2e jour
        heurebutoire = Format("00:00", "hh:mm")
        dureeheure = DateDiff("n", heurebutoire, heurelogout) / 60
        dureeheure = Format(dureeheure, "#0.00")
        .Range(Cells(i, 7).Address).Value = dureeheure
     
    End If
    Et la déclaration des variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim heurelogin As Date, heurelogout As Date, heurebutoire As Date
    Dim datelogin, datelogout, dureeheure
    Les heures dans le tableau excel sont dans ce format ##:##. Ca me fait une erreur 3, incompatibilité de type, sur la ligne "heurebutoire". Est-ce que quelqu'un pourait m'aider svp?

    Bonne soirée!

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    Si HeureLogin et HeureLogout sont des temps complets (date et heure), dateDiff te donne directement la durée.

    Et, du coup, le découpage ne sert à rien.

    Pour l'erreur, je pense que tu essaies d'affecter à une variable date une string. En plus la fonction Format ne sert ici à rien (si elle marchait elle renverrait "00:00") et son premier argument devrait être TimeValue("..."). Bref une erreur 3, mais aussi probablement 3 erreurs sur la même ligne

    PGZ

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    Bonsoir!

    Dans mon tableau j'ai une colonne "Date login", une colonne "Heure login", une colonne "Date logout" et une colonne "Heure logout". J'utilise DateDiff sur les colonnes "Heure login" et "Heure logout", c'est pour ça que je voulais faire ce "découpage". J'ai adapté le code selon ce que tu m'as dit, ça me donne la même erreur / nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        'Durée sur 1er jour
        heurebutoire = TimeValue("24:00")
        dureeheure = DateDiff("n", heurelogin, heurebutoire) / 60
        dureeheure = Format(dureeheure, "#0.00")
        .Range(Cells(i, 6).Address).Value = dureeheure
     
        'Durée sur 2e jour
        heurebutoire = TimeValue("00:00")
        dureeheure = DateDiff("n", heurebutoire, heurelogout) / 60
        dureeheure = Format(dureeheure, "#0.00")
        .Range(Cells(i, 7).Address).Value = dureeheure
    Est-ce que je suis obligé d'assembler la colonne "Date login" avec "Heure login" et "Date logout" avec "Heure logout" pour faire le calcul, ou est-ce que ça pourrait fonctionner autrement?

    Merci!

  4. #4
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Bonsoir,

    tu peu tout simplement faire cela avec une formule excel. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =(DateFin + heureFin) - (DateDebut + heureDebut)
    et tu met la cellule au format : [h]:mm


    tu dis quoi ...

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Moi, je m'arrête à ton "heure butoir" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heurebutoire = TimeValue("24:00")
    Cette heure n'existe tout simplement pas ! (on passe de 23 h 59 à 0 h 00)
    Il te suffirait d'ailleurs de frapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox  TimeValue("24:00")
    pour avoir une erreur d'incompatibilité !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    Hello!

    En fait j'ai besoin de la durée en heure par exemple 1.5 = 1:30. Si je mets ta formule, ça ne fonctionne pas, même après avoir changé le format en format nombre.

    Ou alors utiliser un format personnalisé?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Bonjour,

    Moi, je m'arrête à ton "heure butoir" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heurebutoire = TimeValue("24:00")
    Cette heure n'existe tout simplement pas ! (on passe de 23 h 59 à 0 h 00)
    Il te suffirait d'ailleurs de frapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox  TimeValue("24:00")
    pour avoir une erreur d'incompatibilité !
    Avec 23h 59 ça fonctionne, je savais pas que 24:00 n'existait pas le problème c'est maintenant que je perd 1 min à chaque fois... Je vais essayer de concaténer date login avec heure login et date logout avec heure logout et voir si ça passe comme ça!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    Avec la concaténation de date et heure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    heurebutoire = TimeValue("00:00")
        dureeheure = DateDiff("n", datelogin & " " & heurelogin, datelogout & " " & heurelogout) / 60
        dureeheure = Format(dureeheure, "#0.00")
        .Range(Cells(i, 6).Address).Value = dureeheure
    ça fonctionne, après quelque tests, les valeurs sont correctes. Merci de votre aide!

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Je veux bien t'aider, mais il va falloir que tu commences par t'aider toi-même un peu.

    Réflexion 1 : on ne peut parler de durée en ne parlant que d'heures... ! La durée est une notion qui s'étale dans le temps et inclut donc la notion de date également !
    Réflexion 2 : c'est précisément cette notion de date manquante qui te conduit au "mauvais coup" des 24 h 00 au lieu de 0 h.00 (mais... le lendemanin )

    Je te donne ici de quoi méditer calmement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
      datedebut = "01/01/2001 10:12:43"
      datefin = "02/01/2001 10:53:41"
      nbsecondes = DateDiff("s", datedebut, datefin)
      nbheures = nbsecondes \ 3600
      nbminutes = (nbsecondes Mod 3600) \ 60
      nbsecondes = (nbsecondes Mod 3600) Mod 60
      MsgBox nbheures & " heures " & nbminutes & " minutes " & nbsecondes & " secondes "
      MsgBox "soit donc : " & nbheures + (nbminutes / 60) + (nbsecondes / 3600) & " heures"
    End Sub
    Le dernier msgbox te convertit dans ton "expression à virgule" ...

    A toi d'attraper au vol ...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    C'est bon, je me suis aidé moi-même aussi un peu Heure butoire, je l'ai supprimée et ajouté le concept de date dans mon code!! Merci beaucoup en tt cas!

  11. #11
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Citation Envoyé par dawood Voir le message
    C'est bon, je me suis aidé moi-même aussi un peu Heure butoire, je l'ai supprimée et ajouté le concept de date dans mon code!! Merci beaucoup en tt cas!

    Ok j'aurai quand même aimé voir le résultat que tu as appliqué, comme je te l'ait dit plus haut nul besoin de faire des calculs astronomiques et pas besoin de VBA .

    le résultat que de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =(DateFin + heureFin) - (DateDebut + heureDebut)
    c'est des jours , soit 24 h , tu multiplie donc par 24 et tu as ton résolu ton probléme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =((DateFin + heureFin) - (DateDebut + heureDebut))*24

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    Citation Envoyé par JackOuYA Voir le message
    Ok j'aurai quand même aimé voir le résultat que tu as appliqué, comme je te l'ait dit plus haut nul besoin de faire des calculs astronomiques et pas besoin de VBA .

    le résultat que de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =(DateFin + heureFin) - (DateDebut + heureDebut)
    c'est des jours , soit 24 h , tu multiplie donc par 24 et tu as ton résolu ton probléme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =((DateFin + heureFin) - (DateDebut + heureDebut))*24
    Pour un login le 01.11.2008 à 10:57 et logout le 01.11.2008 à 15:06
    Ca me donne ça : 04.01.1900 03:36, ensuite si je met au format standard, ça fonctionne aussi. Par contre, vu que je supprime tout le tableau avant de copier les données d'une feuille sur l'autre avec du code, les formules seront aussi supprimée... Ca me parait moins pratique, mais est-ce que ce sera plus rapide pour le calcul si je copie ta formule pour chaque ligne ou si je le fait avec le vb?

  13. #13
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Tu peu utiliser le même principe et effectuer le calcul en VBA la cela devrai marcher aussi

    comment reporte tu ton calcul dans toutes tes lignes actuellement ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Par défaut
    Comme ça :

    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
    Private Sub CalculHeure()
    Dim i As Integer
    Dim heurelogin As Date, heurelogout As Date
    Dim datelogin As Date, datelogout As Date, dureeheure
     
    Set WScible = Worksheets("Résumé")
     
    For i = 2 To WScible.Range("B65536").End(xlUp).Row
    With WScible
    datelogin = .Range(Cells(i, 2).Address).Value
    heurelogin = .Range(Cells(i, 3).Address).Value
    datelogout = .Range(Cells(i, 4).Address).Value
    heurelogout = .Range(Cells(i, 5).Address).Value
     
     
    dureeheure = DateDiff("n", datelogin & " " & heurelogin, datelogout & " " & heurelogout) / 60
    dureeheure = Format(dureeheure, "#0.00")
    .Range(Cells(i, 6).Address).Value = dureeheure
     
    End With
    Next i
    End Sub

  15. #15
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    il ne faut pas traiter les dates comme des chaines de carctéres essai plutôt :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With WScible
       datelogin = .Cells(i, 2).Value +  .Cells(i, 3).Value
       datelogout = .Cells(i, 4).Value + .Cells(i, 5).Value
       .Cells(i, 6).Value = (datelogout - datelogin) * 24 
       .Cells(i,6).NumberFormat ="#0.00"
    end With
    tu dis quoi..

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

Discussions similaires

  1. Problème affichage format heure
    Par sangokudu92 dans le forum SQL
    Réponses: 13
    Dernier message: 16/12/2009, 14h32
  2. [XL-2003] Problème Format Heure
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/04/2009, 09h35
  3. problème format heure
    Par meldja dans le forum IHM
    Réponses: 5
    Dernier message: 26/02/2009, 19h24
  4. Probléme de format heure dans le textbox
    Par jijie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/02/2008, 18h20
  5. [CR 4.6]Problème affichage une format heur
    Par amazircool dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 08/07/2006, 15h21

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