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 :

[VBA-E] Calculs d'écarts entre 2 dates


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [VBA-E] Calculs d'écarts entre 2 dates
    Bonjour,

    Je parcours tous les forums depuis un petit moment, et je n'ai pas trouvé grand chose, malheureusement, à part quelques fonctions à droite et à gauche qui me permettrait éventuellement de faire un bricolage pas très joli, donc je m'adresse à vous !

    Dans le cadre de mon job, il faut que je fasse des calculs d'indicateurs qualité sous Excel à partir de dates (sachant que je connais(sais) pas le VBA).

    Pour faire concis, j'ai une date de début, et une date de fin, et il me faut le nombre d'heures "ouvrées" entre les 2... rien de sorcier en apparence, mais dans ce contexte, "ouvrées" signifie "les jours ouvrés entre 8h30 et 17h30"

    Donc entre le vendredi a 17h et le lundi a 14h, il y a 30mn + 5h30 = 6h
    et entre le jeudi à 17h45 et le vendredi a 8h36, il n'y a que 6mn...

    Si quelqu'un a une piste (je ne m'attends pas à trouver le code tout fait), ça m'enleverait une fière chandelle du pied !!

    Merci d'avance !

    --
    Pierre

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bonjour, bienvenue sur le forum.
    Je vais juste jeter des idées. On verra ensuite ce qu'on peut en faire...
    Déjà une chose, parles-tu des jours ouvrés donnés pas la formule NB.JOURS.OUVRES ?
    Ensuite, pour tes heures, un tableau du nombre d'heures journalier est-il possible ?
    Pour une date donnée, tu peux avoir le numéro du jour de la semaine.
    1 pour le dimanche, 2 pour le lundi... etc
    Tu pourrais avoir un tableau à des heures deux dimensions dont l'une serait l'index du jour...
    Ensuite, l'utilisation de l'index du jour pourrait te permettre de retrouver le nombre d'heures pour un jour donné...
    Ça pourrait se faire ? Quelles sont les plages de dates, qu'on ait une idée ?
    Bon, ce sont juste des idées mais peux-tu préciser ce que tu veux obtenir ? Un cumul, une donnée journalière ? Bref, sous quelle forme souhaites-tu le résultat ?
    A+

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Voilà l'idée extrapolée d'un vieux truc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Horaires = Array(0, 0, 7, 8, 5, 6, 4, 0)
    DateDébut = "10/07/2002"
    DateFin = "10/08/2002"
    JourFérié = "14/07/2002"
     
    'Cumuls
    For i = DateValue(DateDébut) To DateValue(DateFin)
        If CStr(Application.WorksheetFunction.WeekDay(i)) Like ("[2-6]") Then
            Férié = i = DateValue(JourFérié)
            NbJoursOuvrés = NbJoursOuvrés + 1 + Férié
            if not Férié then NbreHeures = NbreHeures + Horaires(Application.WorksheetFunction.WeekDay(i))
        End If
    Next
    MsgBox "Nbre de jours => " & NbJoursOuvrés & " Nbre d'heures => " & NbreHeures
    Il te reste à adapter les horaires
    Le tableau Horaires() commence à 0
    Horaires(1) = horaires du dimanche (=0)
    Horaires(7) = Horaires du samedi (=0)
    il te reste les autres
    A+

    Edit
    Si tu as tous les jours fériés d'une année, tu les places dans un tableau JourFérié(n)
    Dans 'Cumuls, tu testes le 1er rencontré puis si "Férié = true", tu incrémentes n
    Le jour férié suivant testé sera = Férié(n+1) jusqu'à ce qu'il soit rencontré...
    Ce qui donnerait 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
    JourFérié = Array("01/01/2006", "24/04/06","01/05/06","08/05/06","15/05/2006","28/05/06","14/07/06","15/08/06") ' etc
    n= 0
    For i = DateValue(DateDébut) To DateValue(DateFin)
        If CStr(Application.WorksheetFunction.WeekDay(i)) Like ("[2-6]") Then
            Férié = i = DateValue(JourFérié(n))
            NbJoursOuvrés = NbJoursOuvrés + 1 + Férié
            if not Férié then 
                  NbreHeures = NbreHeures + Horaires(Application.WorksheetFunction.WeekDay(i))
                else
                  n = n + 1
            endif
        End If
    Next

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    tout d'abord, merci pour la réponse !

    Citation Envoyé par ouskel'n'or
    Déjà une chose, parles-tu des jours ouvrés donnés pas la formule NB.JOURS.OUVRES ?
    En fait, je parle d'heures ouvrées !
    Pour replacer les choses dans leur contexte, nous recevons des extractions d'un logiciel de suivi d'incidents, et nous devons calculer des indicateurs concernant notre reactivité a prendre en charge une anomalie, en fonction de sa gravité.
    Pour cela, il me faut le temps qui s'est écoulé entre 2 "dates et heures", sachant que l'on ne compte que les heures pour lesquelles nous sommes tenus d'intervenir, c'est à dire entre 8h30 et 17h30, du lundi au vendredi...

    Citation Envoyé par ouskel'n'or
    Ensuite, pour tes heures, un tableau du nombre d'heures journalier est-il possible ?
    Oui oui, tout est possible !

    Citation Envoyé par ouskel'n'or
    Pour une date donnée, tu peux avoir le numéro du jour de la semaine.
    1 pour le dimanche, 2 pour le lundi... etc
    Tu pourrais avoir un tableau à des heures deux dimensions dont l'une serait l'index du jour...
    Ensuite, l'utilisation de l'index du jour pourrait te permettre de retrouver le nombre d'heures pour un jour donné...
    J'ai un peu de mal à saisir l'interet de la chose ! Ce n'est pas une simple multiplication par 9 (17h30 - 8h30) que je veux faire, mais compter les heures entre 2 dates (a prendre au sens date + heure)

    Citation Envoyé par ouskel'n'or
    Quelles sont les plages de dates, qu'on ait une idée ?
    Bon, ce sont juste des idées mais peux-tu préciser ce que tu veux obtenir ? Un cumul, une donnée journalière ? Bref, sous quelle forme souhaites-tu le résultat ?
    Les plages de date ? Tous les jours ouvrés de toute l'année ! Et la différence entre la date de fin et la date de début peut être de 6 mois, ou 10mn...
    Une fois que j'ai obtenu le temps écoulé entre la date de début et la date de fin, je vérifie qu'elle ne dépasse pas le temps de correction aloué en fonction de la gravité. Donc j'attends une date (donc un nombre de jours avec des décimales) ou un nombre d'heures, peu importe...

    Nos indicateurs doivent être précis (par exemple, une ano bloquante doit être contournée ou reglée en 2h maximum)...

    Merci encore,

    A+

    --
    Pierre

  5. #5
    Membre régulier Avatar de zebulon2212
    Inscrit en
    Juin 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2006
    Messages : 77
    Points : 88
    Points
    88
    Par défaut
    Si le tableau a un interret si tes jours ne contiennent pas tous le meme nombre d'heure ouvrés et si tes jours sont du lundi au vendredi, ils correspondent bien à la fonction NB.JOURS.OUVRES
    en fait le plus simple serait de compter le nombre de jour ouvrés entre tes 2 dates, date comprise dans le calcul, multiplier ce résultat par le nombre d'heure total par jour, puis de soustraire le temps déjà écouler de ta premiere journé avant l'intervention additionné au temps restant de ta journé de fin d'intervention.
    on a donc par exemple :
    date de debut d'inter le 27/11/06 à 14h00
    date de fin d'inter le 29/11/06 à 16h00
    ca donne 3 jours ouvré multiplié par 9 = 27 heures
    on soustrait (14h00 - 8h30)+(17h30 - 16h00) soit 5h30 + 1h30 = 7h00
    donc une inter de 20h00

    Question : Pas de pose le midi ?

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    je donne ici une fonction qui donne le nombre de jours ouvrés entre deux dates
    http://www.developpez.net/forums/sho...d.php?t=243768

    si tu décomposes ainsi ton pb

    calcul tu temps de la première journée +
    calcul du temps de la dernière journé +
    (nb jours ouvrés entre la première journée + 1 et la dernière -1)* temps journalier tu devrais pas être loin du résultat
    Elle est pas belle la vie ?

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par ouskel'n'or
    Pour une date donnée, tu peux avoir le numéro du jour de la semaine.
    1 pour le dimanche, 2 pour le lundi... etc
    J'espère que tu as compris ça. Selon le jour de la semaine, tu as un jour ouvré ou non. Les jours ouvrés sont 2, 3,....6.
    Si tu as un temps de présence de 9h par jour ouvré, le nombre de jours ouvrés * 9 te donne le délai en jour. Et là, la proposition de zebulon2212 est effectivement à envisager : ((NbreJoursOuvrés - 2) * 9) + (Heure Intervention - 8:30)
    Tu peux même avoir le résultat dans une cellule
    =TEMPSVAL(TEXTE(MAINTENANT();"jj/mm/aa hh:mm:ss"))-"08:30"
    ou
    =TEMPSVAL("18/11/06 15:17")-"08:30"
    A ce temps, et de la même manière, tu ajoutes le temps entre l'heure de l'incident et 17h30
    Dates et heures que tu peux prendre dans une cellule où tu les auras saisies
    Si tu veux, on te sort la seconde
    Pour avoir le temps en heures et minutes, tes cellules doivent être au format voulu
    Si la solution te paraît jouable, on passera au VBA
    A toi

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Voilà. J'ai pondu un truc à partir d'une procédure (jrs ouvrés seuls) en ajoutant du code au fur et à mesure des besoins. Bref, il est sans doute possible de simplifier mais comme je ne vais plus être disponible pendant quelques temps (sauf le soir) je te mets ça. Je ne suis pas sûr d'avoir testé tous les cas de figure, alors... A toi le soin de voir ç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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Option Explicit
    Sub JoursOuvrésAvecHeures()
    Dim JourFérié()
    Dim DateTraitement As String, DateDemande As String, HeureTraitement As String
    Dim Heures As Single
    Dim TempsCumulé As String, HeureDemande As String, TpsHeureTraitement As String, délaiH As String
    Dim i As Date, n As Byte, NbJoursOuvrés As Integer, NbreJrs As Integer
    Dim Férié As Boolean
        Heures = 1 / 24     '0.041666666667 (N° de série)
        DateDemande = "01/12/06"
        DateTraitement = "04/12/2006"    'Format(Now(), "dd/mm/yy")
        HeureDemande = "16:30"
        HeureTraitement = "12:30"
        'Calcul horaire entre heure de la demande et heure du traitement
        If TimeValue(HeureTraitement) > TimeValue(HeureDemande) Then
                TpsHeureTraitement = TimeValue(HeureTraitement) - TimeValue(HeureDemande)
            Else
                TpsHeureTraitement = (9 * Heures) - (TimeValue(HeureDemande) - TimeValue(HeureTraitement))
        End If
        JourFérié = Array("01/01/2006", "24/04/06", "01/05/06", "08/05/06", "15/05/2006", "28/05/06", _
        "14/07/06", "15/08/06", "01/01/2007", "25/12/2006", "1/11/2006", "11/11/2006") ' etc
        n = 0
        For i = DateValue(DateDemande) + 1 To DateValue(DateTraitement)
            If CStr(Application.WorksheetFunction.Weekday(i)) Like ("[2-6]") Then
                For n = 0 To UBound(JourFérié)
                    Férié = i = DateValue(JourFérié(n)) ''si vrai, Férié = -1
                    If Férié Then Exit For
                Next
                'si on a un jour férié, on le retranche
                NbJoursOuvrés = NbJoursOuvrés + 1 + Férié 'Si férié = true, férié = -1
            End If
        Next
        If TimeValue(HeureTraitement) < TimeValue(HeureDemande) Then NbJoursOuvrés = NbJoursOuvrés - 1
        If TpsHeureTraitement >= (9 * Heures) Then
            NbreJrs = Int((TpsHeureTraitement / (9 * Heures)) + 0.0000001) 'ROUNDUP/ARRONDI.SUP
            NbJoursOuvrés = NbJoursOuvrés + NbreJrs
            TpsHeureTraitement = TpsHeureTraitement - (9 * Heures * NbreJrs)
        End If
        délaiH = Format(TpsHeureTraitement, "hh:nn")
        MsgBox "Délai d'intervention" & vbCr & "Nbre de jours ouvrés " & NbJoursOuvrés & vbCr & "Nombre d'heures " & délaiH
    End Sub
    J'ai plein de variables, tu pourras sans doute en supprimer (en prenant tes valeurs dans des cellules par exemple... )
    Bon courage
    A+

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    waouw, merci beaucoup à tous !

    Ca fonctionne nickel après quelques aménagaments minimes !

    Merci encore !

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

Discussions similaires

  1. [AC-2007] Calculer l'écart entre 2 dates
    Par rch05 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 23/07/2011, 11h41
  2. [LV 2009] Calcul écart entre deux dates/heures
    Par K-RK-S dans le forum LabVIEW
    Réponses: 3
    Dernier message: 10/09/2010, 10h04
  3. Réponses: 4
    Dernier message: 21/11/2008, 10h54
  4. [Dates] Calcul d'écart entre 2 dates
    Par Sytchev3 dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2007, 01h39
  5. [VBA] Calculer la différence entre deux dates
    Par T'chab dans le forum Access
    Réponses: 13
    Dernier message: 11/05/2006, 15h12

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