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 :

Calculer la différence entre deux dates


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 217
    Points : 66
    Points
    66
    Par défaut Calculer la différence entre deux dates
    Bonjour,
    j'ai un tableau composé d'une liste d'affaires traitées avec pour chacune la date de fin prévisionnelle et la date de clôture réelle.

    Normalement la date de clôture réelle ne doit pas dépasser la prévisionnelle,et j'aimerais lister le nombre de délais non respectés.

    J'aimerais parcourir ce tableau ligne par ligne, et inscrire au niveau de chaque ligne:
    - Si date de clôture réelle > (date prévisionnelle) : mention "délai dépassé".
    - Si date de clôture <= (date prévisionnelle) : mention "délai respecté".

    Hors je ne sais pas comparer des dates entre elles (en jours ouvrés),comment faire?
    Merci d'avance,
    M

  2. #2
    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
    Points : 5 535
    Points
    5 535
    Par défaut
    Hors je ne sais pas comparer des dates entre elles (en jours ouvrés),comment faire?
    Tu as donc une base de données concernant les jours non-ouvrés autres que les jours (dimanche, par exemple) non normalement ouvrés ?

    Cette liste (des jours non ouvrés bien que n'étant pas un Dimanche, peut varier d'un pays à l'autre, voire (très récent) d'une ville à l'autre).

  3. #3
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 217
    Points : 66
    Points
    66
    Par défaut
    Apparemment il existe une fonction Nb.Jours.Ouvres je faisais référence à cela.

  4. #4
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour,

    Un code que j'ai trouvé et adapté à mes besoins.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Option Explicit
    Sub JoursOuvres()
    '           Adaptation d'un code trouvé sur la toile :
    '           ajout du calcul des Jours férier sur les deux années au cas ou les dates ne sont pas sur la même année.
     
                                Dim Debut                       As Date
                                Dim Fin                         As Date
                                Dim CompA                       As Integer
                                Dim NbJoursOuvres               As Integer
                                Dim Feriers                     As Boolean
                                Dim Jourferies(22)              As Date ' 2 ans (22 jours feriers)
                                Dim indice                      As Integer
                                Dim annee                       As Integer
                                Dim Paques                      As Date
                                Dim Jour                        As Date
     
        Debut = "10/01/2006"
        Fin = "10/12/2007"
     
        If Debut < Fin Then
            indice = 0
            For CompA = Year(Debut) To Year(Fin) ' Calcul les jours fériers
                annee = CompA
                ' Calcul la Date de la pleine lune Pascale
                Paques = DateSerial(annee, 3, 23) + ((2 * (annee Mod 4) + (4 * (annee Mod 7) + _
                  (6 * (((19 * (annee Mod 19)) + 24) Mod 30) + 5))) Mod 7) + _
                    ((19 * (annee Mod 19) + 24) Mod 30) - 1
     
                Jourferies(indice + 1) = DateSerial(annee, 1, 1)     ' Premier janvier
                Jourferies(indice + 2) = DateSerial(annee, 5, 1)     ' 1 Mai
                Jourferies(indice + 3) = DateSerial(annee, 5, 8)     ' 8 mai
                Jourferies(indice + 4) = DateSerial(annee, 7, 14)    ' 14 juillet
                Jourferies(indice + 5) = DateSerial(annee, 8, 15)    ' 15 Aout
                Jourferies(indice + 6) = DateSerial(annee, 11, 1)    ' 1 novembre
                Jourferies(indice + 7) = DateSerial(annee, 11, 11)   ' 11 novembre
                Jourferies(indice + 8) = DateSerial(annee, 12, 25)   ' Noel
                Jourferies(indice + 9) = Paques + 1                  ' Lundi de paques
                Jourferies(indice + 10) = Paques + 39                ' l'Ascenssion
                Jourferies(indice + 11) = Paques + 50                ' lundi de pentecote ' par principe
     
                indice = indice + 11
            Next CompA
     
            NbJoursOuvres = 0
            For Jour = Debut To Fin '  recuperation des jours ouvres
                Feriers = False
                For CompA = 1 To 22
                    If Jour = Jourferies(CompA) Then Feriers = True
                Next CompA
                ' Si le jour est ni un samedi ni un dimanche ni un jour ferier
                If Weekday(Jour) <> 1 And Weekday(Jour) <> 7 And Not Feriers Then NbJoursOuvres = NbJoursOuvres + 1
            Next Jour
        End If
    End Sub
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  5. #5
    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
    NB.JOURS.OUVRES est une des fonctions Excel qu'on ne peut utiliser dans VBA (peut-être y a-t-il une méthode avec Excel4 (?) mais je ne la connais pas.
    Par contre, tu peux coller la formule dans une cellule, ce qui donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
        Date1 = "12/02/2007"
        Date2 = "15/08/2007"
        Range("A1").FormulaLocal = "=NB.JOURS.OUVRES(""" & Date1 & """;""" & Date2 & """)"
        MsgBox Range("A1")
        'ou
        Range("A1").FormulaLocal = "=NB.JOURS.OUVRES(A2;A3)"
        MsgBox Range("A1")
    End Sub

  6. #6
    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
    Tiens je viens de repenser à une méthode par macro
    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
    Sub NbreJourOuvres() ' Appelle "NBJoursOuvres(DateDebut, DateFin)"
    Dim DateDebut As Date
    Dim DateFin As Date
        DateDebut = CDbl(DateValue("03/04/2007"))
        DateFin = CDbl(DateValue("03/05/2007"))
        MsgBox NBJoursOuvres(DateDebut, DateFin)
    End Sub
     
    Function NBJoursOuvres(DateDebut, DateFin)
    Dim i As Long
        For i = DateDebut To DateFin
             NBJoursOuvres = NBJoursOuvres + (Weekday(CDate(i)) <> 1 And _
                               Weekday(CDate(i)) <> 7) * True
        Next
    End Function
    On teste si le jour de la semaine qui est par défaut le dimanche (1) ou le samedi (7)
    Suffit que tu saches que la semaine commence le dimanche dans Excel
    Tu dis

  7. #7
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonsoir Ouskel'nor

    Tu ne gere pas les jours fériers?

    Bon WE
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  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
    Non, j'attends que drthodt précise sa demande, sinon, par formule, un coup d'oeil dans l'aide à NB.JOUR.OUVRES précise la méthode, et par macro, tu l'as fait, je n'allais pas le refaire (pas testé tout de même )

    Edit
    Allez, comme je suis brave, j'ai ajouté les jours fériés (j'avais le calendrier 2008...)
    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
    Sub NbreJourOuvres() ' Appelle "NBJoursOuvres(DateDebut, DateFin)"
    Dim DateDebut As Date, Nbre
    Dim DateFin As Date, JourFeries as variant
        DateDebut = CDbl(DateValue("03/04/2008"))
        DateFin = CDbl(DateValue("12/11/2008"))
        Nbre = NBJoursOuvres(DateDebut, DateFin)
     
    'Post-scriptum ^^
        JourFeries = Array("01/01/2008", "01/05/2008", "08/05/2008", "14/07/2008", "15/08/2008", "01/11/2008", "11/11/2008", "25/12/2008")
        For i = 0 To UBound(JourFeries)
            If CDbl(CDate(JourFeries(i))) > DateDebut And CDbl(CDate(JourFeries(i))) < DateFin Then
                If Not Weekday(JourFeries(i)) = 1 And Not Weekday(JourFeries(i)) = 7 Then _
                    Nbre = Nbre - 1
            End If
        Next
        MsgBox Nbre ' jours fériés exclus
    End Sub
     
    Function NBJoursOuvres(DateDebut, DateFin)
    Dim i As Long
        For i = DateDebut To DateFin
             NBJoursOuvres = NBJoursOuvres + (Weekday(CDate(i)) <> 1 And _
                               Weekday(CDate(i)) <> 7) * True
        Next
    End Function

  9. #9
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 217
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup (un peu long à répondre pas d'Excel pour moi le week-end lol!).
    Tu habites ou ouskeln'or que je t'offres une bière ? ça fait plusieurs fois que tu m'aides (si tu es trop loin elle ne sera que virtuelle mais bon c'est déjà ça lol)

  10. #10
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonjour,

    juste pour info, on peut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Weekday(Jour) <> 1 And Weekday(Jour) <> 7

    par
    Une condition de moins à tester.
    Cordialement

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

Discussions similaires

  1. [AC-2010] Calculer la différence entre deux dates, en jour, dans une requête
    Par Just-Soft dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/10/2010, 02h19
  2. [AC-2007] calculer la différence entre deux dates en minutes
    Par sarah12 dans le forum IHM
    Réponses: 5
    Dernier message: 20/07/2010, 15h44
  3. Calculer une différence entre deux dates
    Par attif0709 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/04/2010, 12h06
  4. [AC-2003] Calcul de différence entre deux dates : problème de format
    Par sinifroth dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/01/2010, 15h35
  5. Calcul de différence entre deux dates cas vaut 0
    Par zanoubya dans le forum Débuter
    Réponses: 3
    Dernier message: 25/12/2008, 19h45

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