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 heures Excel avec plage horaire [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut Calcul heures Excel avec plage horaire
    Bonjour

    Je suis à la recherche de formule afin de calculer le temps d'ouverture d'une action entre la date/heure de début et la date/heure de fin avec une plage d'heures travaillées.

    Par exemple, cette action peut commencer à le 29 novembre 2011 à 15h00 et terminer le 30 novembre à 9h00 avec une plage horaire de travail de 8h00 à 18h00. Donc cette action a été ouverte 4 heures.

    Je voudrais exclure aussi les samedi et dimanche non travaillés ainsi que les jours fériés dans mon calcul (que je peux définir depuis une table).

    Est-ce possible et comment faire ?

    Merci par avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Tu veux dire que si un jour est férié, tu n'as que l'heure d'embauche de la veille et l'heure de débauche du lendemain; eg. pour le 14/07 :
    embauche : 13/07 17:00
    débauche : 15/07 10:00
    ?

  3. #3
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Tu calcules le nombre de jours ouvrés (cf de nombreux posts sur ce forum), tu multiplie par 10 (8h-18h), tu rajoutes les heures d'ouverture du premier jour et tu enlèves ceux du dernier jours après l'heure indiquée. Il faut peut-être rajouter une petite vérification si le premier ou dernier jour est aussi un jour non ouvré.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Bonjour Daniel.C

    C'est une action sur l'ouverture d'un ticket d'incident.
    J'ai une colonne avec date/heure d'ouverture du ticket et une colonne avec date/heure fermeture du ticket.
    Donc oui, c'est cela pour ta demande :
    ouverture ticket : 13/07 17:00
    fermeture ticket: 15/07 10:00
    avec le 14/07 férié, cela donne : 3 heures d'ouverture de ticket.

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut plage horaire
    Bonjour à vous deux,

    Si je puis me permettre de m'immiscer, on pourrait envisager une fonction basée sur cette formule.

    Avec
    prise de fonction : heure1 date1
    fin de fonction : heure2 date2

    temps de fonction = [(nombre de jours ouvrés entre date2 et date1) * (nombre d'heures disponibles d'une journée)] - [heure1 - heure2]
    Pour le calcul du nombre de jours ouvrés entre 2 dates, voir la FAQ

    Nb jours ouvrés entre 2 dates

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    @ MarcelG :

    Sans utiliser VBA, tu as la fonction : NB.JOURS.OUVRES. Pour les versions d'Excel antérieures à XL2007, il faut activer la macro complémentaire "Utilitaire d'analyse".

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    J'ai essayé mais cela n'est pas concluant (cf PJ)
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut jours ouvrés
    Salut Daniel,

    Je suis d'accord. Une réserve cependant consiste en l'obligation de créer une zone comportant la liste des jours fériés.

    Dans le code, ta liste est gérée et s'adapte à toutes les années.

    Pour ma part, j'ai codé :

    avec, dans la plage A1:B2

    31/10/2011 17
    02/11/2011 12

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function HeuresTravail(date1 As Date, heure1 As Long, date2 As Date, heure2 As Long) As Long
    diff = (Work_Days(date1, date2) - 1) * 10 - (heure1 - heure2)
    HeuresTravail = diff
    End Function
     
    Public Sub ESSAI()
    With Sheets(1)
            MsgBox "Temps " & HeuresTravail(.Range("A1"), .Range("B1"), .Range("A2"), .Range("B2"))
    End With
    End Sub
    Ici 10 (en dur) représente le nombre d'heures disponibles dans une journée.

    La procédure me retourne bien le nombre 5.

    Bon appétit. A tout à l'heure.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Bonjour MarcelG

    Peux-tu m'expliquer comment mettre cela en place dans mon exemple ?

    Merci

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Dans le code, ta liste est gérée et s'adapte à toutes les années.
    Ça me paraît un peu risqué, cette liste variant suivant les branches d'activité et suivant les pays...

  11. #11
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut intervalle
    A Daniel,

    Si les règles changent, alors ta plage de jours fériés doit aussi changer. Cette méthode n'est donc pas plus dangereuse. Le code aussi peut être adapté et gérer le pays en question.

    A Lafafmentvotre,

    Dans un module standard, tu copies les 3 fonctions décrites dans la FAQ.
    Tu y ajoutes ensuite le code que j'ai reporté plus haut. Tout dépend de la présentation de tes données (cellules début-fin avec date et heure soit 4 au total, userform, résultat dans msgbox ou dans une cellule).

    N'hésite pas à revenir si nécessaire.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Re

    J'ai essayé ce que tu m'as dit (cf PJ) mais il m'annonce 12 au lieu des 5 que je devrais avoir car ma plage de travail est de 8H00 à 18h00

    Début 31/10/2011 17:00, fin 02/11/2011 12:00 avec férié sur 01/11

    Help please !!!!
    Fichiers attachés Fichiers attachés

  13. #13
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Lafafment,

    J'ai effectué un essai sur ces données, avec succès (Résultat : 5)

    Je n'arrive pas à ouvrir ton fichier. Pourrais-tu l'enregistrer avec l'extension zip, s'il te plaît. En dernier recours, tu peux le joindre en l'épurant au maximum.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Hello

    Le voici
    Fichiers attachés Fichiers attachés

  15. #15
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut calcul plage horaire
    Bonsoir,

    Tes cellules sont informées au format date entière (date et heure) et non comme date d'une part et entier d'autre part (pour les heures) ainsi que décrit dans l'exemple ci-dessus.

    Ta rencontre de difficultés est donc logique.

    Dans ces conditions, les cellules A1 et A2 sont suffisantes. Il te faut seulement en extraire les nombre de séries et les heures.

    Soit

    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
    Public Sub essai2()
     
    Dim lib_date1 As Range, lib_date2 As Range
    Dim date_1 As Date, date_2 As Date
    Dim heure_1 As Long, heure_2 As Long
     
    'Affectation des variables date
    With Sheets(1)
            Set lib_date1 = .Range("A1")
            Set lib_date2 = .Range("A2")
    End With
     
    'Calcul des Serial de chaque date
    date_1 = DateSerial(Year(lib_date1), Month(lib_date1), Day(lib_date1))
    date_2 = DateSerial(Year(lib_date2), Month(lib_date2), Day(lib_date2))
     
    'Calcul des heures de chaque date
    heure_1 = Hour(lib_date1)
    heure_2 = Hour(lib_date2)
     
    'Calcul de la durée effective
    MsgBox "Temps " & HeuresTravail(date_1, heure_1, date_2, heure_2)
     
    'Réinitialisation des variables
    Set ib_date1 = Nothing
    Set ib_date2 = Nothing
     
    End Sub
    Reviens si nécessaire.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Hello

    Quel talent, cela fonctionne

    Par contre, afin de pouvoir utiliser tout cela dans mon fichier global, comment vais je pouvoir faire afin de trouver le nombre rechercher dans chaque ligne ? Car je ne vais pas avoir qu'une ligne...

    Dans le fichier joint, c'est le format qui va être utilisé :
    Colonne A : début
    Colonne B : fin
    Colonne C : résultat

    Merci par avance pour ton aide
    Fichiers attachés Fichiers attachés

  17. #17
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut calcul plage horaire
    Bonjour Lafafmentvotre, Bonjour au Forum,

    Ici, tu ne raisonnes pas en heures entières mais en temps rééel (heures, minutes, secondes).

    Auusi, faut-il revoir la fonction de base afin de raisonner en secondes puis convertir le résultat en hh:mm:ss.

    Autre chose : il est bien convenu que les plages horaires sont de 8 à 18 heures, soit 10 heures au total.

    La fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function HeuresTravail(date1 As Date, heure1 As Long, date2 As Date, heure2 As Long) As Long
    '36000 = 10 heures * 60 minutes * 60 secondes
    diff = ((Work_Days(date1, date2) - 1) * 36000 - (heure1 - heure2))
    HeuresTravail = diff
    End Function
    Le code qui complète ta plage de la colonne C.

    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
    Public Sub essai3()
     
    Dim lib_date1 As Range, lib_date2 As Range
    Dim date_1 As Date, date_2 As Date
    Dim heure_1 As Long, heure_2 As Long
    Dim dercel As Range, c As Range
     
    With Sheets(1)
            Set dercel = .Cells(.Rows.Count, 2).End(xlUp)
            For Each c In .Range("C2", dercel.Offset(0, 1))
                    With c
                            Set lib_date1 = .Offset(0, -2)
                            Set lib_date2 = .Offset(0, -1)
                            'Calcul des Serial de chaque date
                            date_1 = DateSerial(Year(lib_date1), Month(lib_date1), Day(lib_date1))
                            date_2 = DateSerial(Year(lib_date2), Month(lib_date2), Day(lib_date2))
                            'Calcul des heures de chaque date
                            heure_1 = Hour(lib_date1) * 3600 + Minute(lib_date1) * 60 + Second(lib_date1)
                            heure_2 = Hour(lib_date2) * 3600 + Minute(lib_date2) * 60 + Second(lib_date2)
                            '86400 = 60 minutes * 60 secondes * 24 heures
                            .Value = Format(HeuresTravail(date_1, heure_1, date_2, heure_2) / 86400, "hh"" h ""mm"" m ""ss"" s""")
                    End With
                    'Réinitialisation des variables
                    Set ib_date1 = Nothing
                    Set ib_date2 = Nothing
            Next c
    End With
     
     
    End Sub

    Pour exemple,

    A2 = 03/10/2011 08:58:42
    B2 = 05/10/2011 10:00:09

    Résultat

    C2 = 21 h 01 m 27 s

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Re bonjour à tous

    Merci pour cette solution qui fonctionne parfaitement. je vais tester avec le fichier initial mais je suis plus que confiant.

    J'ai juste une question, suis je obligé de lancer la macro à chaque calcul ou existe-t-il un moyen que cela se calcul en automatique ?

    Merci Marcel

  19. #19
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut calcul automatique
    Salut Lafafmentvotre,

    Je te conseillerais de positionner l'appel de cette procédure au sein d'une procédure évènementielle. (Save, Change....).

    Elle s'exécuterait ainsi sans autre intervention.

    Reviens si nécessaire.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2005
    Messages : 218
    Par défaut
    Ok, je vais faire cela

    Encore mille merci

    J'ai parlé trop vite

    Dans le fichier global, date 1 est en colonne B et date 2 en colonne M.
    Le résultat devant se trouver dans colonne Z

    J'ai donc logiquement modifié pour
    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
    Public Sub Calc_Hours()
     
    Dim lib_date1 As Range, lib_date2 As Range
    Dim date_1 As Date, date_2 As Date
    Dim heure_1 As Long, heure_2 As Long
    Dim dercel As Range, c As Range
     
    With Sheets(1)
    Set dercel = .Cells(.Rows.Count, 2).End(xlUp)
    For Each c In .Range("Z2", dercel.Offset(0, 1))
    With c
    Set lib_date1 = .Offset(0, -24)
    Set lib_date2 = .Offset(0, -13)
    'Calcul des Serial de chaque date
    date_1 = DateSerial(Year(lib_date1), Month(lib_date1), Day(lib_date1))
    date_2 = DateSerial(Year(lib_date2), Month(lib_date2), Day(lib_date2))
    'Calcul des heures de chaque date
    heure_1 = Hour(lib_date1) * 3600 + Minute(lib_date1) * 60 + Second(lib_date1)
    heure_2 = Hour(lib_date2) * 3600 + Minute(lib_date2) * 60 + Second(lib_date2)
    '86400 = 60 minutes * 60 secondes * 24 heures
    .Value = Format(HeuresTravail(date_1, heure_1, date_2, heure_2) / 86400, "hh"" h ""mm"" m ""ss"" s""")
    End With
    'Réinitialisation des variables
    Set ib_date1 = Nothing
    Set ib_date2 = Nothing
    Next c
    End With
     
     
    End Sub
    Mais j'ai une erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set lib_date1 = .Offset(0, -24)
    Je comprends pas

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/04/2019, 17h34
  2. [XL-2007] Afficher heure d'1 plage horaire dans combobox
    Par stephadm dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/04/2012, 19h00
  3. condition d'exécution avec plage horaire
    Par tonymontana4192 dans le forum Langage
    Réponses: 3
    Dernier message: 02/07/2008, 11h42
  4. calcul heures excel
    Par jo50160 dans le forum Excel
    Réponses: 4
    Dernier message: 03/11/2007, 20h43
  5. calcul délais entre deux dates avec plages horaires
    Par leila eco dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2007, 16h51

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