Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2011, 10h25   #1
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
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.
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h39   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
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
?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h45   #3
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
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é.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h50   #4
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
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.
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 11h09   #5
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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

Citation:
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
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 11h57   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
@ 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".
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 12h10   #7
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
J'ai essayé mais cela n'est pas concluant (cf PJ)
Fichiers attachés
Type de fichier : xlsx Test_Heures.xlsx (8,3 Ko, 10 affichages)
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 12h34   #8
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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 :
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.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 13h16   #9
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
Bonjour MarcelG

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

Merci
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 13h18   #10
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Citation:
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...
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 14h52   #11
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 16h05   #12
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
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
Type de fichier : 7z Test_Heures.7z (16,2 Ko, 8 affichages)
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 16h20   #13
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 16h52   #14
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
Hello

Le voici
Fichiers attachés
Type de fichier : zip Test_Heures.zip (16,2 Ko, 3 affichages)
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 17h32   #15
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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 :
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.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 10h09   #16
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
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
Type de fichier : zip Test_Heures_2.zip (17,7 Ko, 6 affichages)
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 12h42   #17
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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 :
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 :
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
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 13h39   #18
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
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
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 13h49   #19
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 14h58   #20
Membre du Club
 
Inscription : mars 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2005
Messages : 181
Points : 45
Points : 45
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 :
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 :
Set lib_date1 = .Offset(0, -24)
Je comprends pas
lafafmentvotre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h39.


 
 
 
 
Partenaires

Hébergement Web