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 le délai entre deux date jours ouvrés en macro [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 49
    Par défaut Calculer le délai entre deux date jours ouvrés en macro
    Bonjour,

    j'aimerais faire une macro qui calcul le nombre de jours entre deux date exemple 03/12/2018 et le 05/12/2018 ce qui me donnerais deux, car le jour initiale n'est pas compter.

    En évitant les week-end et jours férié.

    j'ai vu la fonction "NB.JOURS.OUVRES.INTL" mais je n'arrive pas à intégrer un -1 car sinon il me calcul 3.

    Pour les jours férié je ne sais pas si je suis obligé de les noter à la main, où si il y a un possibilité pour qu'un système les trouve tout seul.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par SirFurtif Voir le message
    j'ai vu la fonction "NB.JOURS.OUVRES.INTL" mais je n'arrive pas à intégrer un -1 car sinon il me calcul 3.
    Bin... il suffit de mettre -1 à la fin de la formule.

    Citation Envoyé par SirFurtif Voir le message
    Pour les jours férié je ne sais pas si je suis obligé de les noter à la main, où si il y a un possibilité pour qu'un système les trouve tout seul.
    Pour ce qui est des jours fériés "laïques", ce sont tous des jours calendaires fixes (1er janvier, 8 mai, 11 novembre, etc.).
    Pour les jours fériés religieux (pâques, ascension, pentecôte), je crois qu'il est possible de les calculer les uns par rapport aux autres mais je n'ai plus en mémoire les règles de calcul. Cherche sur Wikipedia.

    Il faudrait que tu établisses une liste de tous les jours fériés et que tu utilises une fonction NB.SI.ENS pour calculer le nombre dont la date est supérieure au début de ta période et inférieure à la fin de ta période.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 49
    Par défaut
    Merci j'ai tout résolu le -1 "ne marchait pas" car il me changeait le format et la cellule était trop petite.

  4. #4
    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 : 68
    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
    Bonjour,

    A toute fin utile.

    D'après cette discussion, j'ai pu "récolter" ce code.

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    Function FinalDate(date_début As Date, nbjours As Integer, _
                       Optional Fériés As Boolean = True) As Date
     
        Dim ladate As Date
     
        ladate = CDate(date_début) + 1
     
        While Jours_Travail(date_début, ladate, Fériés) < nbjours
            ladate = DateAdd("d", 1, ladate)
        Wend
     
        FinalDate = ladate
     
    End Function
     
    Function Jours_Travail(BegDate As Variant, EndDate As Variant, _
                       Optional bAvecJFerie As Boolean = True) As Variant
        Dim ladate As Date
     
    On Error GoTo Jours_Travail_Error
        If IsNull(BegDate) Or IsNull(EndDate) Then Err.Raise vbObjectError + 1
        If Not IsDate(BegDate) Or Not IsDate(EndDate) Then Err.Raise vbObjectError + 2
        If BegDate > EndDate Then Err.Raise vbObjectError + 3
     
        ladate = BegDate
        Jours_Travail = 0
        While ladate <= EndDate
            If DatePart("w", ladate, vbMonday) < 6 And IIf(bAvecJFerie, Not Is_Férié(ladate), True) Then
                Jours_Travail = Jours_Travail + 1
            End If
            ladate = DateAdd("d", 1, ladate)
        Wend
        Exit Function
     
    Jours_Travail_Error:
        Select Case Err.Number
            Case vbObjectError + 1: Jours_Travail = "Les 2 dates sont obligatoires."
            Case vbObjectError + 2: Jours_Travail = "Format de date incorrect."
            Case vbObjectError + 3: Jours_Travail = "La date de fin doit être postérieure à la date de début."
            Case Else: Jours_Travail = Err.Description
        End Select
    End Function
     
    Function Is_Férié(ByVal QuelleDate As Date) As Boolean
    Dim anneeDate As Integer
    Dim joursFeries(1 To 11) As Date
    Dim i As Integer
      anneeDate = Year(QuelleDate)
     
      joursFeries(1) = DateSerial(anneeDate, 1, 1)
      joursFeries(2) = DateSerial(anneeDate, 5, 1)
      joursFeries(3) = DateSerial(anneeDate, 5, 8)
      joursFeries(4) = DateSerial(anneeDate, 7, 14)
      joursFeries(5) = DateSerial(anneeDate, 8, 15)
      joursFeries(6) = DateSerial(anneeDate, 11, 1)
      joursFeries(7) = DateSerial(anneeDate, 11, 11)
      joursFeries(8) = DateSerial(anneeDate, 12, 25)
     
      joursFeries(9) = fLundiPaques(anneeDate)
      joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Paques + 38
      joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
     
      For i = 1 To 11
        If QuelleDate = joursFeries(i) Then
          Is_Férié = True
          Exit For
        End If
      Next
    End Function
     
    Private Function fLundiPaques(ByVal Iyear As Integer) As Date
            'Adapté de +ieurs scripts...
            Dim L(6) As Long, Lj As Long, Lm As Long
     
            L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
            L(4) = (19 * L(1) + 24) Mod 30
            L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
            L(6) = 22 + L(4) + L(5)
     
            If L(6) > 31 Then
                    Lj = L(6) - 31
                    Lm = 4
            Else
                    Lj = L(6)
                    Lm = 3
            End If
     
            ' Lundi de Pâques = Paques + 1 jour
            fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
     
    End Function
     
    Public Function HeuresTravail(date1 As Date, heure1 As Long, date2 As Date, heure2 As Long) As Long
    diff = (Jours_Travail(date1, date2) - 1) * 10 - (heure1 - heure2)
    HeuresTravail = diff
    End Function
     
    Public Sub ESSAI()
    With Sheets(1)
            .Range("H1").Value = Jours_Travail(.Range("A1"), .Range("A2"))
            .Range("J1").Value = HeuresTravail(.Range("A1"), .Range("B1"), .Range("A2"), .Range("B2"))
    End With
    End Sub

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

Discussions similaires

  1. [2008] Calculer un délai entre deux dates
    Par Chris L' Arabis dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/07/2014, 19h21
  2. Réponses: 3
    Dernier message: 09/09/2010, 17h47
  3. Calcul de délai entre deux dates
    Par bouchoc dans le forum DB2
    Réponses: 3
    Dernier message: 28/05/2010, 14h04
  4. Réponses: 4
    Dernier message: 21/11/2008, 10h54
  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