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

Contribuez Discussion :

Obtenir une liste des jours fériés pour une année donnée


Sujet :

Contribuez

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Obtenir une liste des jours fériés pour une année donnée
    Bonjour à tous,

    Ayant besoin pour un projet de gérer une notion de jours travaillés (= jours ouvrés), j'ai voulu exclure de cette liste les jours fériés.

    La plupart des jours fériés ont un positionnement fixe dans l'année (1 janvier, 1er mai, 14 juillet, 15 août...) mais pour d'autres c'est plus compliqué car la date change chaque année (Jour de Pâques en particulier car pour l'Ascension et la Pencôte ils sont placés un nombre de jours constant après le jour de pâques... le problème revient donc à calculer cette date).

    En fouillant sur Internet j'ai trouvé la formule ci-joint pour le calcul du jour de pâques, qui est une formule pour EXCEL
    (trouvée sur le site de Microsoft http://support.microsoft.com/kb/459735/fr)

    =SI(MOD(19*MOD(année;19)+24;30)+MOD(2*MOD(année;4)+4*MOD(année;7)+6*MOD(19*MOD(année;19)+24;30)+5;7)-9<=0;DATE(année;3;22+MOD(19*MOD(année;19)+24;30)+MOD(2*MOD(année;4)+4*MOD(année;7)+6*MOD(19*MOD(année;19)+24;30)+5;7));DATE(année;4;MOD(19*MOD(année;19)+24;30)+MOD(2*MOD(année;4)+4*MOD(année;7)+6*MOD(19*MOD(année;19)+24;30)+5;7)-9))

    Comme elle m'a paru un peu compliquée à adapter j'ai continué à chercher et trouvé une adaptation plus simple (auteur inconnu) qui donne le même résultat (allez comprendre...).

    Cette formule 'simplifiée' est la suivante :

    =DATE(année;3;29,56+0,979*MOD(204-11*MOD(année;19);30)-JOURSEM(DATE(année;3;28,56+0,979*MOD(204-11*MOD(année;19);30))))

    C'est de cette dernière formule que je me suis donc inspiré, en l'adaptant en VBA pour les besoins de mon projet.

    C'est cette adaptation en VBA que je vous livre ici pour le cas où cela pourrait servir à certains :

    Une petite précision... il s'agit du code d'une CLASSE de mon projet... c'est la classe qui effectue le calcul des différents jours fériés de l'année et les stocke dans une collection de JoursFériés... le code qui gère la collection n'ayant pas d'intérêt ici je ne rentre pas dans ces détails et je vous livre donc cette classe telle quelle, en vous laissant le soin de l'adapter à vos besoins. Si besoin d'autres précisions faites le savoir je pourrai compléter...

    CODE DE LA CLASSE "CLstJoursFeries"

    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    Option Explicit
     
    Private Const kJourDeLAn As String = "Jour de l'an"
    Private Const kLundiDePaques As String = "Lundi de Pâques"
    Private Const kFeteDuTravail As String = "Fête du travail"
    Private Const kVictoireDe1945 As String = "Victoire de 1945"
    Private Const kAscension As String = "Ascension"
    Private Const kPentecote As String = "Pentecôte"
    Private Const kFeteNationale As String = "Fête nationale"
    Private Const kAssomption As String = "Assomption"
    Private Const kToussaint As String = "Toussaint"
    Private Const kArmistice As String = "Armistice"
    Private Const kNoel As String = "Noël"
     
    Private m_AnneeDeReference As Integer
     
    Private m_theLstJoursFeries As USortedCollection
     
    Public Property Let AnneeDeReference(pintAnnee As Integer)
        If pintAnnee <> m_AnneeDeReference Then
            ' Modification de l'année => Il faut recalculer la liste des jours fériés
            Let m_AnneeDeReference = pintAnnee
            Set m_theLstJoursFeries = New USortedCollection ' On recrée la collection
            Call zzCalculeLesDifferentsJoursFeries
        End If
    End Property
     
    Public Property Get AnneeDeReference() As Integer
        Let AnneeDeReference = m_AnneeDeReference
    End Property
     
    Public Function EstJourFerie(pDate As Date) As Boolean
    Dim i As Integer
    Dim ltmpJourFerie As CJourFerie
        'Begin
        For i = 1 To m_theLstJoursFeries.Count
        Set ltmpJourFerie = m_theLstJoursFeries.Item(i)
            If ltmpJourFerie.theDate = pDate Then
                Let EstJourFerie = True
                Exit For
            End If
        Next i
    End Function
     
    Public Function DescriptionListeJoursFeries() As String
    Dim i As Integer
    Dim lJourFerie As CJourFerie
    Dim lstrResult As String
        'Begin
        Let lstrResult = "En excluant les jours fériés suivants :"
        For i = 1 To m_theLstJoursFeries.Count
            Set lJourFerie = m_theLstJoursFeries.Item(i)
            Let lstrResult = lstrResult & vbLf & " " & lJourFerie.theDate & " : " & lJourFerie.Description
        Next i
        Let DescriptionListeJoursFeries = lstrResult
    End Function
     
    Private Sub zzCalculeLesDifferentsJoursFeries()
    Dim lJourFerie As CJourFerie
    Dim lMod1 As Integer ' Pour calcul jour de Pâques
    Dim lMod2 As Integer ' Pour calcul jour de Pâques
    Dim lPremierMars As Date ' Pour calcul jour de Pâques
    Dim lOffset2856 As Byte ' Pour calcul jour de Pâques
    Dim lOffset2956 As Byte ' Pour calcul jour de Pâques
    Dim ldateJourDePaques As Date
    Dim lItemIndex As Byte
        'Begin
        Let lItemIndex = 1
        ' CALCUL JOUR DE L'AN
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kJourDeLAn
        Let lJourFerie.theDate = CDate("01/01/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DU LUNDI DE PAQUES... C'EST LE PLUS COMPLIQUÉ
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kLundiDePaques
        Let lMod1 = m_AnneeDeReference Mod 19
        Let lMod2 = (204 - (11 * lMod1)) Mod 30
        Let lPremierMars = CDate("01/03/" & Str$(m_AnneeDeReference))
        Let lOffset2856 = Val(28.56 + 0.979 * lMod2)
        Let lOffset2956 = Val(29.56 + 0.979 * lMod2 - Weekday(DateAdd("d", lOffset2856, lPremierMars)))
        Let ldateJourDePaques = DateAdd("d", lOffset2956, lPremierMars)
        Let lJourFerie.theDate = DateAdd("d", 1, ldateJourDePaques) ' NB : le LUNDI de pâques est le lendemain du JOUR de pâques
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL FÊTE DU TRAVAIL (1er MAI)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kFeteDuTravail
        Let lJourFerie.theDate = CDate("01/05/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL VICTOIRE DE 1945 (8 MAI)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kVictoireDe1945
        Let lJourFerie.theDate = CDate("08/05/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DE L'ASCENSION (39 jours après le lundi de pâques)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kAscension
        Let lJourFerie.theDate = DateAdd("d", 39, ldateJourDePaques)
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DE LA PENTECÔTE (50 jours après le lundi de pâques)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kPentecote
        Let lJourFerie.theDate = DateAdd("d", 50, ldateJourDePaques)
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DE LA FÊTE NATIONALE (14 JUILLET)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kFeteNationale
        Let lJourFerie.theDate = CDate("14/07/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DE L'ASSOMPTION (15 AOÛT)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kAssomption
        Let lJourFerie.theDate = CDate("15/08/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DE LA TOUSSAINT (1er NOVEMBRE)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kToussaint
        Let lJourFerie.theDate = CDate("01/11/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DE L'ARMISTICE (11 NOVEMBRE)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kArmistice
        Let lJourFerie.theDate = CDate("11/11/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
        Let lItemIndex = lItemIndex + 1
        ' CALCUL DU JOUR DE NOEL (25 DECEMBRE)
        Set lJourFerie = New CJourFerie
        Let lJourFerie.Code = lItemIndex
        Let lJourFerie.Description = kNoel
        Let lJourFerie.theDate = CDate("25/12/" & Str$(m_AnneeDeReference))
        Call m_theLstJoursFeries.AddUnique(lJourFerie)
    End Sub
    Bonne chance pour vos projets respectifs

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour, bonjour,




    Sinon même si le sujet a été maintes fois traité, s'il n'y a pas de question,
    ce serait alors plutôt une contribution à poster donc dans le sous forum Contribuez

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/08/2013, 19h26
  2. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  3. [Dates] Tableau des jours fériés sur une année
    Par Jahprend dans le forum Langage
    Réponses: 5
    Dernier message: 30/06/2008, 17h36
  4. Obtenir la liste des processus tournant sous une base oracle
    Par mikawell3000 dans le forum Oracle
    Réponses: 8
    Dernier message: 26/07/2007, 15h18
  5. [Interbase] Liste des utilisateurs enregistrés pour une BD
    Par touhami dans le forum Bases de données
    Réponses: 4
    Dernier message: 14/02/2007, 07h29

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