Bonjour le forum
Voici une fonction polyvalente, rapide et sans calendrier fixe, qui détermine les jours fériés et dispense de la tenue d’un calendrier des jours fériés pour la France, la Belgique, la Suisse, l'Espagne, le Portugal, le Luxembourg et Monaco :
Selon l'utilisation :
Paramètre pour le pays, 33 ou omis France, 32 Belgique, 41 Suisse, 352 Luxembourg, 377 Monaco, 34 España, 351 Portugal
J'ai mis dans le fichier joint « Exemples utilisation TJF en formules en MFC en détermination de jours fériés.Xlsm », pour quatre pays, des exemples d'utilisation avec NB, NB.JOURS.OUVRES, NB.JOURS.OUVRES.INTL, des MFC et des déterminations de jour férié.
Dans le fichier joint « Exemples utilisation en matricielles standard ou dynamiques 365 horizontales ou verticales.Xlsm », j’ai mis des exemple de formules matricielles standard toutes versions d'Excel et des matricielles dynamiques horizontales et verticales pour 365.
Fonction personnalisée utilisable en VBA, en formules (y compris encapsulée ou en matricielle) et en MFC.
Bien cordialement, @+
Code de la fonction
exemples VBA
Voici une fonction polyvalente, rapide et sans calendrier fixe, qui détermine les jours fériés et dispense de la tenue d’un calendrier des jours fériés pour la France, la Belgique, la Suisse, l'Espagne, le Portugal, le Luxembourg et Monaco :
Selon l'utilisation :
- Elle détermine si une date donnée est fériée et renvoie un boolean.
- Elle renvoie un tableau des jours fériés, compris entre deux dates, utilisable avec les fonctions d'Excel acceptant un tableau de dates.
- Elle gère les spécificités régionales par un paramètre optionnel pour la région.
- En option, la possibilité de renvoyer les libellés des jours fériés. Cela permet de faire un listing détaillé des jours fériés, libellés et dates, voir fichiers exemples.
Cette fonctionnalité permet de remplacer facilement, dans un fichier existant, un tableau des jours fériés à mise à jour manuelle par un tableau des jours fériés entièrement automatisé qui évolue selon les années. - Elle est utilisable en formule, en MFC ou par VBA.
- Elle est utilisable en formule matricielle renvoyant un tableau horizontal ou vertical, compatible matricielles standards et matricielles dynamiques Excel 365. La gestion des #N/A en calcul matriciel standard est intégrée dans la fonction.
- Le choix du pays, France, Belgique, Suisse, Espagne, Portugal, Luxembourg et Monaco.
- Les régions en France, Espagne et Portugal sont gérées par le paramètre régional.
- Les cantons en Suisse sont gérés par le paramètre régional, un paramètre optionnel a été ajouté pour la gestion des jours chômés spécifiques à la Suisse.
- Les communautés en Belgique sont gérées par le paramètre régional.
Paramètre pour le pays, 33 ou omis France, 32 Belgique, 41 Suisse, 352 Luxembourg, 377 Monaco, 34 España, 351 Portugal
J'ai mis dans le fichier joint « Exemples utilisation TJF en formules en MFC en détermination de jours fériés.Xlsm », pour quatre pays, des exemples d'utilisation avec NB, NB.JOURS.OUVRES, NB.JOURS.OUVRES.INTL, des MFC et des déterminations de jour férié.
Dans le fichier joint « Exemples utilisation en matricielles standard ou dynamiques 365 horizontales ou verticales.Xlsm », j’ai mis des exemple de formules matricielles standard toutes versions d'Excel et des matricielles dynamiques horizontales et verticales pour 365.
Fonction personnalisée utilisable en VBA, en formules (y compris encapsulée ou en matricielle) et en MFC.
Bien cordialement, @+
Code de la fonction
VB:
Option Explicit
Function TJF(ByVal DateDeb, Optional ByVal DateFin = 0, Optional Pays = 33, Optional Region$ = "", Optional Lun_Pent As Boolean = 1, Optional Jour_Chome As Boolean = 0, Optional MDV As Boolean = 0, Optional Lib As Boolean = 0) As Variant
'********************************************************************************************************************
' Fonction TJF, jours fériés automatiques
' Auteur: Bernard_XLD sur Exceldownloads
'Selon l 'utilisation :
'Elle détermine si une date donnée est fériée et renvoie un boolean.
'Elle renvoie un tableau des jours fériés, compris entre deux dates, utilisable avec les fonctions d'Excel acceptant un tableau de dates.
'Elle gère les spécificités régionales par un paramètre optionnel pour la région.
'La version 2.0 a intégré le choix du pays, France, Belgique, Suisse et Luxembourg. Un paramètre optionnel a été ajouté pour la gestion des jours chômés spécifiques à la Suisse et les cantons sont gérés par le paramètre régional.
'La version 3.0 l'a rendue utilisable en fonction matricielle renvoyant un tableau horizontal ou vertical, compatible matricielles standards et matricielles dynamiques Excel 365. La gestion des #N/A en calcul matriciel standard est intégrée dans la fonction.
'Cette fonctionnalité permet de remplacer facilement, dans un fichier existant, un tableau des jours fériés à mise à jour manuelle par un tableau des jours fériés entièrement automatisé ( voir fichier joint ).
'La version 3.3 a intégré en option la possibilité de renvoyer les libellés des jours fériés. Elle permet de faire un listing détaillé des jours fériés, libellés et dates, voir fichiers exemples.
'La version 4.0 a intégré l'Espagne, le Portugal et la Principauté de Monaco, les régions en Espagne et au Portugal sont gérées par le paramètre régional.
'
'Utilisable en formule (y compris encapsulée), par les fonctions de feuille acceptant un tableau, en MFC, par VBA, en matricielles standards (gestion des #N/A intégrée) et en matricielles dynamiques 365
'Cette fonction gère tous les jours fériés à date fixe et tous les jours fériés à date mobile déterminés par le dimanche de Pâques de l’année ( vérifié jusqu'en 2099 ) ou par la spécificité régionale. Elle comprend un
'paramétrage optionnel du lundi de Pentecôte (pour la France) et des jours fériés régionaux. Elle dispense de la tenue d'un calendrier des jours fériés pour les calculs, les MFC ou l'établissement de plannings/calendriers.
'France par défaut (avec régions), paramétrage optionnel du pays : Belgique (avec communauté), Suisse (avec cantons), Luxembourg, Monaco
'
'évolution des versions
'Fonction TJF V1.0 , Bernard_XLD
'Fonction TJF V1.1 , Bernard_XLD, correction des jours fériés DOMCOM
'Fonction TJF V2.0 , Bernard_XLD, ajout du choix de pays, ajout de la Belgique, ajout de la Suisse, ajout du Luxembourg
'Fonction TJF V2.1 , Bernard_XLD, réglement d'un bug sur les calculs de jours mobiles pour la Suisse et d'un bug sur le retour tableau en cas d'absence de jour férié sur la période définie
'Fonction TJF V2.3 , Bernard_XLD, amélioration du calcul des jours mobiles pour la Suisse
'Fonction TJF V2.4 , Bernard_XLD, réglement d'un bug de traitement des dates de début et de fin passés en paramètre, en nombre dans une feuille de calcul
'Fonction TJF V3.0 , Bernard_XLD, intégration des formules matricielles horizontales et verticales avec une gestion des #N/A intégrée dans la fonction, compatible formules matricielles standard et matricielles dynamiques Excel 365
'Fonction TJF V3.1 , Bernard_XLD, amélioration de la gestion des matricielles dynamiques Excel 365
'Fonction TJF V3.2 , Bernard_XLD, ajout des libellés des jours fériés
'Fonction TJF V3.3 , Bernard_XLD, ajout traitement des libellés des jours fériés en mode test une journée
'Fonction TJF V3.4 , Bernard_XLD, amélioration du retour TJF en cas d'absence de jours fériés sur une période
'Fonction TJF V3.5 , Bernard_XLD, optimisation du code et suppression de la redondance du calcul des jours mobiles religieux
'Fonction TJF V3.6 , Bernard_XLD, suppression de la redondance du calcul des jours mobiles pour la suisse
'Fonction TJF V3.7 , Bernard_XLD, optimisation des portées matricielles
'Fonction TJF V3.8 , Bernard_XLD, tous les séparateurs de date par défaut sont gérés (obsolète en 3.9)
'Fonction TJF V3.9 , Bernard_XLD, comparaisons de dates en entier DDMM, diverses petites corrections et améliorations
'Fonction TJF V4.0 , Bernard_XLD, ajout de l'Espagne, du Portugal et de la Principauté de Monaco
'Fonction TJF V4.1 , Bernard_XLD, modification de la détection de la taille des matricielles standards
'Fonction TJF V4.2 , Bernard_XLD, renvoie l'information au lieu d'une erreur si valeur invalide passée en date de début
'Fonction TJF V4.3 , Bernard_XLD, correction du calcul de la date de Pâques pour les années 2049 et 2076
'Fonction TJF V4.4 , Bernard_XLD, modification du test des dates pour encapsulation de fonctions personnalisées
'si DateFin est omis, teste si la journée est fériée et renvoie un boolean
'Renvoie un tableau des jours fériés compris entre deux dates utilisable avec les fonctions d'Excel acceptant un tableau de dates exemple : NB.JOURS.OUVRES
'Pays : paramétrage optionnel du pays, 33 ou omis France, 32 Belgique, 41 Suisse, 352 Luxembourg, 377 Monaco, 34 España, 351 Portugal
'Region : paramétrage optionnel de la région pour les jours fériés régionaux
'Lun_Pent : paramétrage optionnel du Lundi de Pentecôte pour la France, actif par défaut
'Jour_Chome : paramétrage optionnel pour l'intégration des jours chômés spécifiques à la suisse, inactif par défaut
'MDV : paramétrage optionnel pour l'orientation des matricielles dynamiques d'Excel 365 (0 ou omis pour horizontale, 1 pour verticale)
'Lib : report des libellés des jours fériés au lieu des dates en mode tableau ou d'un boolean en mode journée, inactif par défaut
'Paramètre Région
'Régions pour la France
'Region = "" ou omis => standard métropole (sauf Alsace-Moselle)
'Region = "ALM" => Alsace-Moselle
'Region = "GSM" => Guadeloupe & Saint-Martin
'Region = "GUY" => Guyane
'Region = "REU" => la Réunion
'Region = "MAR" => Martinique
'Region = "MAY" => Mayotte
'Region = "STB" => Saint-Barthélemy
'Region = "NCA" => Nouvelle-Calédonie
'Region = "POF" => Polynésie française
'Region = "WEF" => Wallis et Futuna
'Communautés pour la Belgique
'Region = "" ou omis => standard Belgique
'Region = "SID" => sidérurgie, la Saint Éloi (premier décembre) remplace le 11 novembre
'Region = "FLA" => Communauté Flamande
'Region = "FRA" => Communauté Française
'Region = "FLS" => Communauté Flamande et sidérurgie, la Saint Éloi (premier décembre) remplace le 11 novembre
'Region = "FRS" => Communauté Française et sidérurgie, la Saint Éloi (premier décembre) remplace le 11 novembre
'Cantons pour la Suisse
'Region = "AG" >= Argovie
'Region = "AI" => Appenzell Rhodes-Intérieures
'Region = "AR" => Appenzell Rhodes-Extérieures
'Region = "BE" >= Berne
'Region = "BL" >= Bâle - Campagne
'Region = "BS" >= Bâle - Ville
'Region = "FR" >= Fribourg
'Region = "GE" >= Genève
'Region = "GL" >= Glaris
'Region = "GR" >= Grisons
'Region = "JU" >= Jura
'Region = "LU" >= Lucerne
'Region = "NE" >= Neuchâtel
'Region = "NW" >= Nidwald
'Region = "OW" >= Obwald
'Region = "SG" >= Saint - Gall
'Region = "SH" >= Schaffhouse
'Region = "SO" >= Soleure
'Region = "SZ" >= Schwytz
'Region = "TG" >= Thurgovie
'Region = "TI" >= Tessin
'Region = "UR" >= Uri
'Region = "VD" >= Vaud
'Region = "VS" >= Valais
'Region = "ZG" >= Zoug
'Region = "ZH" >= Zurich
'Regiones para España
'Region = "AND" >= Andalucía
'Region = "ARA" >= Aragón
'Region = "CYL" >= Castilla y León
'Region = "CLM" >= Castilla-La Mancha
'Region = "ICA" >= las Canarias
'Region = "CAT" >= Catalunya
'Region = "EXT" >= Extremadura
'Region = "GAL" >= Galicia
'Region = "BAL" >= Illes Balears
'Region = "RIO" >= Rioja
'Region = "MAD" >= Comunidad de Madrid
'Region = "MUR" >= Murcia
'Region = "NAV" >= Navarra
'Region = "AST" >= Asturias
'Region = "VAS" >= País Vasco
'Region = "CAN" >= Cantabria
'Region = "VAL" >= Comunitat Valenciana
'Region = "CEU" >= Ceuta
'Region = "MEL" >= Melilla
'Regiões para Portugal
'Region = "" ou omitido => Portugal padrão
'Region = "ACO" >= Região Autónoma dos Açores
'Region = "MAD" >= Madeira e das Comunidades Madeirenses
'********************************************************************************************************************
Region = UCase(Region)
'vérification des arguments Pays et Région
Select Case Pays
Case 33 'France
Select Case Region
Case "", "ALM", "GSM", "GUY", "REU", "MAR", "MAY", "STB", "NCA", "POF", "WEF"
Case Else
TJF = "Argument Région " & Chr(34) & Region & Chr(34) & " incorrect": Exit Function
End Select
Case 32 'Belgique
Select Case Region
Case "", "FRA", "FLA", "SID", "FRS", "FLS"
Case Else
TJF = "Argument Région " & Chr(34) & Region & Chr(34) & " incorrect": Exit Function
End Select
Case 41 'Suisse
Select Case Region
Case "AG", "AI", "AR", "BE", "BL", "BS", "FR", "GE", "GL", "GR", "JU", "LU", "NE", "NW", "OW", "SG", "SH", "SO", "SZ", "TG", "TI", "UR", "VD", "VS", "ZG", "ZH"
Dim Date_Ref As Date, Num_Cible As Byte, Jour_Sem As Byte, Decal_Jour%, Mois_Ref As Byte 'valeurs
Dim Fahrtsfest%, Jeune_Genevois%, Lundi_du_Jeune_Federal% 'fêtes mobiles
Case Else
TJF = "Argument Région " & Chr(34) & Region & Chr(34) & " incorrect": Exit Function
End Select
Case 352 'Luxembourg
Case 377 'Monaco
Case 34 'España
Select Case Region
Case "AND", "ARA", "CYL", "CLM", "ICA", "CAT", "EXT", "GAL", "BAL", "RIO", "MAD", "MUR", "NAV", "AST", "VAS", "CAN", "VAL", "CEU", "MEL"
Case Else
TJF = "Configuración de región " & Chr(34) & Region & Chr(34) & " incorrecta": Exit Function
End Select
Case 351 'Portugal
Select Case Region
Case "", "ACO", "MAD"
Case Else
TJF = "Configuração de região " & Chr(34) & Region & Chr(34) & " incorreta": Exit Function
End Select
Case Else
TJF = "Argument Pays " & Chr(34) & Pays & Chr(34) & " incorrect": Exit Function
End Select
Dim Test_J As Boolean
'concordance des dates
If DateFin = 0 Then DateFin = DateDeb: Test_J = True
On Error Resume Next
DateDeb = CDate(DateDeb): DateFin = CDate(DateFin)
On Error GoTo 0
If IsDate(DateDeb) And IsDate(DateFin) Then
If DateFin < DateDeb Then TJF = "Date de fin inférieure à la date de début": Exit Function
Else
If Not IsDate(DateDeb) Then
TJF = "La date de début n'est pas une date valide": Exit Function
Else
If Not IsDate(DateFin) Then TJF = "La date de fin n'est pas une date valide": Exit Function
End If
End If
Dim Annee%, DateX As Date, LibJF$, Val1% 'valeurs
Dim JF() As Date, JF2(), LibTJF$() 'tableaux
Dim Cale_Paques&, Date_Dim_Paques As Date, Mar_Gras%, Jeu_Saint%, Ven_Saint%, Dim_Paques%, Lun_Paques%, Ascension%, Pentecote%, Fete_Dieu% 'fêtes mobiles
Dim Premier_An%, Epiphanie%, Saint_Joseph%, Premier_Mai%, Assomption%, Toussaint%, Noel%, Saint_Etienne%, Armistice%, Immaculee_Conception% 'fêtes fixes communes
'définition des fêtes fixes communes
Premier_An = 101: Epiphanie = 601: Saint_Joseph = 1903: Premier_Mai = 105: Assomption = 1508: Toussaint = 111: Armistice = 1111: Immaculee_Conception = 812: Noel = 2512: Saint_Etienne = 2612
For DateX = DateDeb To DateFin
If Not Annee = Year(DateX) Then 'calcul du Dimanche de Pâques et des fêtes mobiles sur changement d'année de DateX
Annee = Year(DateX)
Cale_Paques = (((255 - 11 * (Annee Mod 19)) - 21) Mod 30) + 21
Date_Dim_Paques = DateSerial(Annee, 3, 1) + Cale_Paques + (Cale_Paques > 48) + 6 - ((Annee + (Annee \ 4) + Cale_Paques + (Cale_Paques > 48) + 1) Mod 7)
Ven_Saint = CInt(Format(Date_Dim_Paques - 2, "ddmm")) 'Calcul Vendredi Saint, vendredi précédant le Dimanche de Pâques
Dim_Paques = CInt(Format(Date_Dim_Paques, "ddmm")) 'Dimanche de Pâques
Lun_Paques = CInt(Format(Date_Dim_Paques + 1, "ddmm")) 'Calcul Lundi de Pâques, lundi suivant le Dimanche de Pâques
Ascension = CInt(Format(Date_Dim_Paques + 39, "ddmm")) 'Calcul Ascension, 39 jours après le Dimanche de Pâques
Pentecote = CInt(Format(Date_Dim_Paques + 50, "ddmm")) 'Calcul Pentecôte, 50 jours après le Dimanche de Pâques
Select Case Pays
Case 34
Fete_Dieu = CInt(Format(Date_Dim_Paques + 60, "ddmm")) 'Calcul Fête Dieu, 60 jours après le Dimanche de Pâques
Jeu_Saint = CInt(Format(Date_Dim_Paques - 3, "ddmm")) 'Calcul Jeudi Saint, jeudi précédant le Dimanche de Pâques
Case 377
Fete_Dieu = CInt(Format(Date_Dim_Paques + 60, "ddmm")) 'Calcul Fête Dieu, 60 jours après le Dimanche de Pâques
Case 351
Fete_Dieu = CInt(Format(Date_Dim_Paques + 60, "ddmm")) 'Calcul Fête Dieu, 60 jours après le Dimanche de Pâques
Mar_Gras = CInt(Format(Date_Dim_Paques - 47, "ddmm")) 'Calcul Mardi Gras, 47 jours avant le Dimanche de Pâques, début de la semaine grasse avant le jeune de 40 jours du Carème
Case 41
Fete_Dieu = CInt(Format(Date_Dim_Paques + 60, "ddmm")) 'Calcul Fête Dieu, 60 jours après le Dimanche de Pâques
'Calcul Fahrtsfest, Premier jeudi d'avril
Jour_Sem = 4: Mois_Ref = 4: Num_Cible = 1 'premier jeudi d'avril
Date_Ref = DateSerial(Year:=Annee, Month:=Mois_Ref, Day:=1)
Decal_Jour = Jour_Sem - Weekday(Date_Ref, 2): If Decal_Jour >= 0 Then Decal_Jour = Decal_Jour - 7
Fahrtsfest = CInt(Format(Date_Ref + Decal_Jour + (Num_Cible * 7), "ddmm")) 'Calcul Fahrtsfest, Premier jeudi d'avril
'Calcul Jeûne genevois, jeudi suivant le 1er dimanche de septembre
Jour_Sem = 7: Mois_Ref = 9: Num_Cible = 1 'premier dimanche de septembre
Date_Ref = DateSerial(Year:=Annee, Month:=Mois_Ref, Day:=1)
Decal_Jour = Jour_Sem - Weekday(Date_Ref, 2): If Decal_Jour >= 0 Then Decal_Jour = Decal_Jour - 7
Jeune_Genevois = CInt(Format(Date_Ref + Decal_Jour + (Num_Cible * 7) + 4, "ddmm")) 'Calcul Jeûne genevois, premier dimanche de septembre + 4 jours pour le jeudi
'Calcul Lundi du Jeûne fédéral, lundi suivant le 3e dimanche de septembre
Jour_Sem = 7: Mois_Ref = 9: Num_Cible = 3 'troisième dimanche de septembre
Date_Ref = DateSerial(Year:=Annee, Month:=Mois_Ref, Day:=1)
Decal_Jour = Jour_Sem - Weekday(Date_Ref, 2): If Decal_Jour >= 0 Then Decal_Jour = Decal_Jour - 7
Lundi_du_Jeune_Federal = CInt(Format(Date_Ref + Decal_Jour + (Num_Cible * 7) + 1, "ddmm")) 'Calcul Lundi du Jeûne fédéral, troisième dimanche de septembre + 1 jour pour le lundi
End Select
End If
LibJF = ""
Select Case Pays
Case 33 'France
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'commun,Premier janvier
LibJF = "Premier janvier"
Case Lun_Paques 'commun,Lundi de Pâques
LibJF = "Lundi de Pâques"
Case Premier_Mai 'commun, Fête du travail
LibJF = "Fête du travail"
Case 805 'commun, Victoire des alliés
LibJF = "Victoire des alliés"
Case Ascension 'commun, Jeudi de l'Ascension
LibJF = "Jeudi de l'Ascension"
Case Pentecote 'commun,Lundi de Pentecôte
If Lun_Pent Then LibJF = "Lundi de Pentecôte"
Case 1407 'commun, Fête nationale
LibJF = "Fête nationale"
Case Assomption 'commun, Assomption
LibJF = "Assomption"
Case Toussaint 'commun, Toussaint
LibJF = "Toussaint"
Case Armistice 'commun, Armistice
LibJF = "Armistice"
Case Noel 'commun, Noël
LibJF = "Noël"
Case Ven_Saint 'Alsace Moselle, Vendredi Saint
If Region = "ALM" Then LibJF = "Vendredi Saint"
Case Saint_Etienne 'Alsace Moselle, Saint Etienne
If Region = "ALM" Then LibJF = "Saint Etienne"
Case 2705 'Guadeloupe & Saint-Martin, Abolition de l'esclavage
If Region = "GSM" Then LibJF = "Abolition de l'esclavage"
Case 1006 'Guyane, Abolition de l'esclavage
If Region = "GUY" Then LibJF = "Abolition de l'esclavage"
Case 2012 'La Réunion, Abolition de l'esclavage
If Region = "REU" Then LibJF = "Abolition de l'esclavage"
Case 2205 'Martinique, Abolition de l'esclavage
If Region = "MAR" Then LibJF = "Abolition de l'esclavage"
Case 2704 'Mayotte, Abolition de l'esclavage
If Region = "MAY" Then LibJF = "Abolition de l'esclavage"
Case 910 'Saint-Barthélemy, Abolition de l'esclavage
If Region = "STB" Then LibJF = "Abolition de l'esclavage"
Case 2409 'Nouvelle-Calédonie, Fête de la citoyenneté
If Region = "NCA" Then LibJF = "Fête de la citoyenneté"
Case 503 'Polynésie française, Arrivée de l'Évangile
If Region = "POF" Then LibJF = "Arrivée de l'Évangile"
Case 2906 'Polynésie française, Fête de l’autonomie
If Region = "POF" Then LibJF = "Fête de l’autonomie"
Case 2804 'Wallis et Futuna, Saint Pierre Chanel
If Region = "WEF" Then LibJF = "Saint Pierre Chanel"
Case 2907 'Wallis et Futuna, Fête du territoire
If Region = "WEF" Then LibJF = "Fête du territoire"
End Select
Case 32 'Belgique
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'commun,Premier janvier
LibJF = "Premier janvier"
Case Lun_Paques 'commun,Lundi de Pâques
LibJF = "Lundi de Pâques"
Case Premier_Mai 'commun, Fête du travail
LibJF = "Fête du travail"
Case Ascension 'commun, Jeudi de l'Ascension
LibJF = "Jeudi de l'Ascension"
Case Pentecote 'commun,Lundi de Pentecôte
LibJF = "Lundi de Pentecôte"
Case 2107 'commun, Fête nationale
LibJF = "Fête nationale"
Case Assomption 'commun, Assomption
LibJF = "Assomption"
Case Toussaint 'commun, Toussaint
LibJF = "Toussaint"
Case Armistice 'Armistice
Select Case Region
Case "SID", "FLS", "FRS"
Case Else
LibJF = "Armistice"
End Select
Case 112 'Saint Éloi, sidérurgie
Select Case Region
Case "SID", "FLS", "FRS"
LibJF = "Saint Éloi"
End Select
Case Noel 'commun, Noël
LibJF = "Noël"
Case 1107 'Communauté Flamande
Select Case Region
Case "FLA", "FLS"
LibJF = "Communauté Flamande"
End Select
Case 2709 'Communauté Française
Select Case Region
Case "FRA", "FRS"
LibJF = "Communauté Française"
End Select
End Select
Case 41 'Suisse
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'commun,Premier janvier
LibJF = "Premier janvier"
Case 201 'Saint Berchtold
Select Case Region
Case "AG", "BE", "JU", "VD", "ZG"
LibJF = "Saint Berchtold"
Case "NE"
If Application.Weekday(DateX - 1, 2) = 7 Then LibJF = "Saint Berchtold(dimanche 01/01)"
Case Else
If Jour_Chome Then
Select Case Region
Case "FR", "GL", "LU", "OW", "SH", "SO", "ZH"
LibJF = "Saint Berchtold, chômé"
End Select
End If
End Select
Case Epiphanie 'Épiphanie
Select Case Region
Case "SZ", "TI", "UR"
LibJF = "Épiphanie"
End Select
Case 103 'Instauration de la République
If Region = "NE" Then LibJF = "Instauration de la République"
Case Saint_Joseph 'Saint Joseph
Select Case Region
Case "LU", "NW", "SZ", "TI", "UR", "VS"
LibJF = "Saint Joseph"
End Select
Case Fahrtsfest 'Fahrtsfest, Premier jeudi d'avril
If Region = "GL" Then LibJF = "Fahrtsfest"
Case Ven_Saint 'Vendredi saint
Select Case Region
Case "AG", "AI", "AR", "BE", "BL", "BS", "FR", "GE", "GL", "GR", "JU", "LU", "NE", "NW", "OW", "SG", "SH", "SO", "SZ", "TG", "UR", "VD", "ZG", "ZH"
LibJF = "Vendredi saint"
End Select
Case Lun_Paques 'Lundi de Pâques
Select Case Region
Case "AG", "AI", "AR", "BE", "BL", "BS", "GE", "GL", "GR", "JU", "SG", "SH", "SZ", "TG", "TI", "UR", "VD", "ZH"
LibJF = "Lundi de Pâques"
Case Else
If Jour_Chome Then
Select Case Region
Case "FR", "LU", "NE", "NW", "OW", "SO", "VS", "ZG"
LibJF = "Lundi de Pâques, chômé"
End Select
End If
End Select
Case Premier_Mai 'Fête du travail
Select Case Region
Case "BL", "BS", "JU", "NE", "SH", "TI", "UR", "ZH"
LibJF = "Fête du travail"
Case Else
If Jour_Chome And Region = "GE" Then LibJF = "Fête du travail, chômé"
End Select
Case Ascension 'commun,Jeudi de l'Ascension
LibJF = "Jeudi de l'Ascension"
Case Pentecote 'Lundi de Pentecôte
Select Case Region
Case "AG", "AI", "AR", "BE", "BL", "BS", "GE", "GL", "GR", "JU", "SG", "SH", "SZ", "TG", "TI", "UR", "VD", "ZH"
LibJF = "Lundi de Pentecôte"
Case Else
If Jour_Chome Then
Select Case Region
Case "FR", "LU", "NE", "NW", "OW", "SO", "VS", "ZG"
LibJF = "Lundi de Pentecôte, chômé"
End Select
End If
End Select
Case 2306 'Commémoration du plébiscite
If Region = "JU" Then LibJF = "Commémoration du plébiscite"
Case Fete_Dieu 'Fête-Dieu
Select Case Region
Case "AG", "AI", "FR", "JU", "LU", "NW", "OW", "SO", "SZ", "TI", "UR", "VS", "ZG"
LibJF = "Fête-Dieu"
End Select
Case 2906 'Saint-Pierre et Paul
If Region = "TI" Then LibJF = "Saint-Pierre et Paul"
Case 108 'commun, Fête nationale
LibJF = "Fête nationale"
Case Assomption 'Assomption
Select Case Region
Case "AG", "AI", "FR", "GR", "JU", "LU", "NW", "OW", "SO", "SZ", "TI", "UR", "VS", "ZG"
LibJF = "Assomption"
End Select
Case Jeune_Genevois 'Jeûne genevois, jeudi suivant le 1er dimanche de septembre
If Region = "GE" Then LibJF = "Jeûne genevois"
Case Lundi_du_Jeune_Federal 'Lundi du Jeûne fédéral, lundi suivant le 3e dimanche de septembre
If Region = "VD" Then
LibJF = "Lundi du Jeûne fédéral"
Else
If Jour_Chome And Region = "NE" Then LibJF = "Lundi du Jeûne fédéral, chômé"
End If
Case 2509 'Fête de Saint-Nicolas-de-Flüe
If Region = "OW" Then LibJF = "Fête de Saint-Nicolas-de-Flüe"
Case Toussaint 'Toussaint
Select Case Region
Case "AI", "FR", "GL", "JU", "LU", "NW", "OW", "SG", "SO", "TI", "UR", "VS", "ZG"
LibJF = "Toussaint"
End Select
Case Immaculee_Conception 'Immaculée Conception
Select Case Region
Case "FR", "LU", "NW", "OW", "TI", "UR", "VS", "ZG"
LibJF = "Immaculée Conception"
End Select
Case Noel 'commun, Noël
LibJF = "Noël"
Case Saint_Etienne 'Saint-Étienne
Select Case Region
Case "AG", "AI", "AR", "BE", "BL", "BS", "GL", "GR", "LU", "SG", "SH", "SZ", "TG", "TI", "UR", "ZH"
LibJF = "Saint-Étienne"
Case "NE"
If Application.Weekday(DateX - 1, 2) = 7 Then LibJF = "Saint-Étienne(dimanche 25/12)"
Case Else
If Jour_Chome Then
Select Case Region
Case "FR", "NW", "OW", "SO", "ZG"
LibJF = "Saint-Étienne, chômé"
End Select
End If
End Select
Case 3112 'Restauration de la République
If Region = "GE" Then LibJF = "Restauration de la République"
End Select
Case 352 'Luxembourg
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'Premier janvier
LibJF = "Premier janvier"
Case Lun_Paques 'Lundi de Pâques
LibJF = "Lundi de Pâques"
Case Premier_Mai 'Fête du travail
LibJF = "Fête du travail"
Case 905 'Journée de l'Europe
LibJF = "Journée de l'Europe"
Case Ascension 'Jeudi de l'Ascension
LibJF = "Jeudi de l'Ascension"
Case Pentecote 'Lundi de Pentecôte
LibJF = "Lundi de Pentecôte"
Case 2306 'Anniversaire du Grand Duc
LibJF = "Anniversaire du Grand Duc"
Case Assomption 'Assomption
LibJF = "Assomption"
Case Toussaint 'Toussaint
LibJF = "Toussaint"
Case Noel 'Noël
LibJF = "Noël"
Case Saint_Etienne 'Saint Etienne
LibJF = "Saint Etienne"
End Select
Case 377 'Monaco
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'Premier janvier
LibJF = "Premier janvier"
Case 2701 'Sainte Dévote
LibJF = "Sainte Dévote"
Case Lun_Paques 'Lundi de Pâques
LibJF = "Lundi de Pâques"
Case Premier_Mai 'Fête du travail
LibJF = "Fête du travail"
Case Ascension 'Jeudi de l'Ascension
LibJF = "Jeudi de l'Ascension"
Case Pentecote 'Lundi de Pentecôte
LibJF = "Lundi de Pentecôte"
Case Fete_Dieu 'Fête-Dieu
LibJF = "Fête-Dieu"
Case Assomption 'Assomption
LibJF = "Assomption"
Case Toussaint 'Toussaint
LibJF = "Toussaint"
Case 1911 'Fête du Prince Monégasque
LibJF = "Fête du Prince Monégasque"
Case Immaculee_Conception 'Immaculée Conception
LibJF = "Immaculée Conception"
Case Noel 'Noël
LibJF = "Noël"
End Select
Case 34 'España
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'Año Nuevo
LibJF = "Año Nuevo"
Case Epiphanie 'Epifanía del Señor
LibJF = "Epifanía del Señor"
Case 2802 'Día de Andalucía
If Region = "AND" Then LibJF = "Día de Andalucía"
Case 103 'Dia de les Illes Balears
If Region = "BAL" Then LibJF = "Dia de les Illes Balears"
Case 1903 'San José
If Region = "MUR" Or Region = "VAL" Then LibJF = "San José"
Case Jeu_Saint 'Jueves Santo
Select Case Region
Case "MUR", "VAL"
LibJF = "Jueves Santo"
End Select
Case Ven_Saint 'Viernes Santo
LibJF = "Viernes Santo"
Case Lun_Paques 'Lunes de Pascua
Select Case Region
Case "CAT", "BAL", "NAV", "VAS", "VAL"
LibJF = "Lunes de Pascua"
End Select
Case 2304 'Día de Aragón, Día de Castilla y León
If Region = "ARA" Then LibJF = "Día de Aragón"
If Region = "CYL" Then LibJF = "Día de Castilla y León"
Case Premier_Mai 'Día del Trabajador
LibJF = "Día del Trabajador"
Case 205 'Fiesta de la Comunidad de Madrid
If Region = "MAD" Then LibJF = "Fiesta de la Comunidad de Madrid"
Case 305 'Dia de la Cruz
If Region = "AND" Then LibJF = "Dia de la Cruz"
Case 1705 'Día das Letras Galegas
If Region = "BAL" Then LibJF = "Día das Letras Galegas"
Case 3005 'Día de las Canarias
If Region = "ICA" Then LibJF = "Día de las Canarias"
Case 3105 'Día de la Región Castilla-La Mancha
If Region = "CLM" Then LibJF = "Día de la Región Castilla-La Mancha"
Case Fete_Dieu 'Corpus Christi
If Region = "MAD" Then LibJF = "Corpus Christi"
Case 906 'Día de Aragón, Día de la Región de Murcia
If Region = "RIO" Then LibJF = "Día de La Rioja"
If Region = "MUR" Then LibJF = "Día de la Región de Murcia"
Case 2406 'Sant Joan
If Region = "CAT" Then LibJF = "Sant Joan"
Case 2507 'Santiago Apóstol
If Region = "GAL" Then LibJF = "Santiago Apóstol"
Case Assomption 'Asunción
LibJF = "Asunción"
Case 209 'Día de Ceuta
If Region = "CEU" Then LibJF = "Día de Ceuta"
Case 809 'Día de Asturias, Día de Extremadura
If Region = "AST" Then LibJF = "Día de Asturias"
If Region = "EXT" Then LibJF = "Día de Extremadura"
Case 1109 'Diada Nacional de Catalunya
If Region = "CAT" Then LibJF = "Diada Nacional de Catalunya"
Case 1509 'Día de Cantabria
If Region = "CAN" Then LibJF = "Día de Cantabria"
Case 1709 'Día de Melilla
If Region = "MEL" Then LibJF = "Día de Melilla"
Case 910 'Dia de la Comunitat Valenciana
If Region = "VAL" Then LibJF = "Dia de la Comunitat Valenciana"
Case 1210 'Fiesta Nacional de España
LibJF = "Fiesta Nacional de España"
Case 2510 'Euskadi Eguna
If Region = "VAS" Then LibJF = "Euskadi Eguna"
Case Toussaint 'Día de todos los Santos
LibJF = "Día de todos los Santos"
Case 612 'Día de la Constitución
LibJF = "Día de la Constitución"
Case Immaculee_Conception 'Inmaculada Concepción
LibJF = "Inmaculada Concepción"
Case Noel 'Navidad
LibJF = "Navidad"
Case Saint_Etienne 'Sant Esteve
If Region = "CAT" Then LibJF = "Sant Esteve"
End Select
Case 351 'Portugal
Select Case CInt(Format(DateX, "ddmm"))
Case Premier_An 'Ano Novo
LibJF = "Ano Novo"
Case Mar_Gras 'Carnaval
LibJF = "Carnaval"
Case Ven_Saint 'Sexta-feira Santa
LibJF = "Sexta-feira Santa"
Case Dim_Paques 'Domingo de Páscoa
LibJF = "Domingo de Páscoa"
Case 2504 'Dia da Liberdade
LibJF = "Dia da Liberdade"
Case Premier_Mai 'Dia do Trabalhador
LibJF = "Dia do Trabalhador"
Case Pentecote 'Dia da Região Autónoma dos Açores
If Region = "ACO" Then LibJF = "Dia da Região Autónoma dos Açores"
Case Fete_Dieu 'Corpo de Deus
LibJF = "Corpo de Deus"
Case 1006 'Dia de Portugal
LibJF = "Dia de Portugal"
Case 107 'Dia da Região Autónoma da Madeira
If Region = "MAD" Then LibJF = "Dia da Região Autónoma da Madeira"
Case Assomption 'Assunção de Nossa Senhora
LibJF = "Assunção de Nossa Senhora"
Case 510 'Implantação da República
LibJF = "Implantação da República"
Case Toussaint 'Dia de Todos-os-Santos
LibJF = "Dia de Todos-os-Santos"
Case 112 'Restauração da Independência
LibJF = "Restauração da Independência"
Case Immaculee_Conception 'Imaculada Conceição
LibJF = "Imaculada Conceição"
Case Noel 'Natal
LibJF = "Natal"
Case Saint_Etienne 'Primeira Oitava
If Region = "MAD" Then LibJF = "Primeira Oitava"
End Select
End Select
If Not LibJF = "" Then
Val1 = Val1 + 1
ReDim Preserve LibTJF(1 To Val1): LibTJF(Val1) = LibJF
ReDim Preserve JF(1 To Val1): JF(Val1) = DateX
End If
Next DateX
If Test_J Then
If Lib Then TJF = LibJF Else TJF = IIf(LibJF = "", False, True)
Else
If Val1 = 0 Then ReDim JF2(1): TJF = JF2: Exit Function
Dim Val2&, Val3&, Val4&, Test_MD
With Application
'<pour initialisation matricielle dynamique>
If Lib Then
TJF = IIf(MDV, .Transpose&(LibTJF), LibTJF)
Else
TJF = IIf(MDV, .Transpose&(JF), JF)
End If
'</>
If TypeName(.Caller) = "Range" Then
With .ThisCell
If .FormulaArray = .Offset(0, 1).FormulaArray And Not MDV Then
Test_MD = Range(.Address & ":" & .Offset(0, 1).Address).Formula 'pour test matricielle dynamique
If Test_MD(1, 1) = Test_MD(1, 2) Then 'teste si matricielle non dynamique
For Val3 = 1 To .End(xlToRight).Column - .Column + 1
If Not .FormulaArray = .Offset(0, Val3).FormulaArray Then Exit For
Next Val3
End If
If Val3 < Val1 Then Val3 = Val1 'pour le redimensionnement des matricielles dynamiques après modification des données d'entrée
ReDim JF2(1 To Val3)
Val4 = UBound(JF)
For Val2 = 1 To Val3
If Val2 > Val4 Or Val1 = 0 Then JF2(Val2) = "" Else JF2(Val2) = IIf(Lib, LibTJF(Val2), JF(Val2))
Next Val2
TJF = JF2
Else
If .FormulaArray = .Offset(1, 0).FormulaArray Then 'teste si matricielle
If MDV Then
Val3 = Val1
Else
For Val3 = 1 To .End(xlDown).Row - .Row + 1
If Not .FormulaArray = .Offset(Val3, 0).FormulaArray Then Exit For
Next Val3
End If
ReDim JF2(1 To Val3)
Val4 = UBound(JF)
For Val2 = 1 To Val3
If Val2 > Val4 Or Val1 = 0 Then JF2(Val2) = "" Else JF2(Val2) = IIf(Lib, LibTJF(Val2), CLng(JF(Val2)))
Next Val2
TJF = Application.Transpose(JF2)
Else
'<pour matricielles dynamiques sans report de matrice ou matricielle sans portée>
Select Case Val1
Case 0
TJF = ""
Case 1
TJF = IIf(Lib, LibTJF, CLng(JF(1)))
End Select
'</>
End If
End If
End With
End If
End With
End If
End Function
exemples VBA
VB:
'utilisation TJF en VBA
'pour déterminer si une journée est fériée
Sub demo1()
Dim Date_Test
Date_Test = InputBox("Entrez une date en format jj/mm/aaaa ou en valeur", "Demande", "13/05/2021")
If IsDate(Date_Test) Or IsNumeric(Date_Test) Then MsgBox "Le " & Format(Date_Test, "dddd dd mmmm yyyy") & " est férié : " & vbLf & vbLf & TJF(Date_Test), vbOKOnly + vbInformation _
Else MsgBox "La valeur :" & vbLf & Date_Test & vbLf & " n'est pas une date valide", vbOKOnly + vbInformation
End Sub
'pour récupérer un libellé
Sub demo2()
Dim Date_Test
Date_Test = InputBox("Entrez une date en format jj/mm/aaaa ou en valeur", "Demande", "13/05/2021")
If IsDate(Date_Test) Or IsNumeric(Date_Test) Then MsgBox "Le " & Format(Date_Test, "dddd dd mmmm yyyy") & " est férié : " & vbLf & vbLf & TJF(Date_Test) & IIf(TJF(Date_Test), ", ", "") & TJF(DateDeb:=Date_Test, Lib:=True), vbOKOnly + vbInformation _
Else MsgBox "La valeur :" & vbLf & Date_Test & vbLf & " n'est pas une date valide", vbOKOnly + vbInformation
End Sub
'pour récupérer un tableau vb des jours fériés
Sub demo3()
Dim Tablo, Tablo2$(), x&
Dim Date_Deb, Date_Fin
'définition des dates de début et fin de période en nombre ou en valeur
Date_Deb = "01/01/2021": Date_Fin = "31/12/2022"
Date_Deb = InputBox("Entrez une date de début en format jj/mm/aaaa ou en valeur", "Demande", Date_Deb)
Date_Fin = InputBox("Entrez une date de fin en format jj/mm/aaaa ou en valeur", "Demande", Date_Fin)
If (IsDate(Date_Deb) Or IsNumeric(Date_Deb)) And (IsDate(Date_Fin) Or IsNumeric(Date_Fin)) Then
'récupération en tableau
Tablo = TJF(Date_Deb, Date_Fin)
If Not Tablo(LBound(Tablo)) = "" Then
ReDim Tablo2(LBound(Tablo) To UBound(Tablo))
For x = LBound(Tablo2) To UBound(Tablo2)
Tablo2(x) = Format(Tablo(x), "dddd dd mmmm yyyy")
Next x
If Not Tablo2(1) = "" Then MsgBox "Il y a " & UBound(Tablo2) - LBound(Tablo2) + 1 & " jours fériés sur la période du " & Format(Date_Deb, "dddd dd mmmm yyyy") & " au " & Format(Date_Fin, "dddd dd mmmm yyyy") & " : " & vbLf & vbLf & Join(Tablo2, vbLf), vbOKOnly + vbInformation
Else
MsgBox "Il y a aucun jour férié sur la période du " & Format(Date_Deb, "dddd dd mmmm yyyy") & " au " & Format(Date_Fin, "dddd dd mmmm yyyy"), vbOKOnly + vbInformation
End If
End If
End Sub
'pour récupérer un tableau vb des jours fériés avec leurs libellés
Sub demo4()
Dim Tablo, Tablo2$(), Tablo3, x&
Dim Date_Deb, Date_Fin
'définition des dates de début et fin de période en nombre ou en valeur
Date_Deb = "01/01/2021": Date_Fin = "31/12/2022"
Date_Deb = InputBox("Entrez une date de début en format jj/mm/aaaa ou en valeur", "Demande", Date_Deb)
Date_Fin = InputBox("Entrez une date de fin en format jj/mm/aaaa ou en valeur", "Demande", Date_Fin)
If (IsDate(Date_Deb) Or IsNumeric(Date_Deb)) And (IsDate(Date_Fin) Or IsNumeric(Date_Fin)) Then
'récupération en tableaux
Tablo = TJF(Date_Deb, Date_Fin)
If Not Tablo(LBound(Tablo)) = "" Then
Tablo3 = TJF(DateDeb:=Date_Deb, DateFin:=Date_Fin, Lib:=1)
ReDim Tablo2(LBound(Tablo) To UBound(Tablo))
For x = LBound(Tablo2) To UBound(Tablo2)
Tablo2(x) = Format(Tablo(x), "dddd dd mmmm yyyy") & ", " & Tablo3(x)
Next x
MsgBox "Il y a " & UBound(Tablo2) - LBound(Tablo2) + 1 & " jours fériés sur la période du " & Format(Date_Deb, "dddd dd mmmm yyyy") & " au " & Format(Date_Fin, "dddd dd mmmm yyyy") & " : " & vbLf & vbLf & Join(Tablo2, vbLf), vbOKOnly + vbInformation
Else
MsgBox "Il y a aucun jour férié sur la période du " & Format(Date_Deb, "dddd dd mmmm yyyy") & " au " & Format(Date_Fin, "dddd dd mmmm yyyy"), vbOKOnly + vbInformation
End If
End If
End Sub
'pour récupérer un tableau vb des jours fériés avec leurs libellés, Suisse, Canton de Genève, jours chomés intégrés aux jours fériés
Sub demo4B()
Dim Tablo, Tablo2$(), Tablo3, x&
Dim Date_Deb, Date_Fin
'définition des dates de début et fin de période en nombre ou en valeur
Date_Deb = "01/01/2021": Date_Fin = "31/12/2022"
Date_Deb = InputBox("Entrez une date de début en format jj/mm/aaaa ou en valeur", "Demande", Date_Deb)
Date_Fin = InputBox("Entrez une date de fin en format jj/mm/aaaa ou en valeur", "Demande", Date_Fin)
If (IsDate(Date_Deb) Or IsNumeric(Date_Deb)) And (IsDate(Date_Fin) Or IsNumeric(Date_Fin)) Then
'récupération en tableaux
Tablo = TJF(DateDeb:=Date_Deb, DateFin:=Date_Fin, Pays:=41, Region:="GE", Jour_Chome:=1)
If Not Tablo(LBound(Tablo)) = "" Then
Tablo3 = TJF(DateDeb:=Date_Deb, DateFin:=Date_Fin, Pays:=41, Region:="GE", Jour_Chome:=1, Lib:=1)
ReDim Tablo2(LBound(Tablo) To UBound(Tablo))
For x = LBound(Tablo2) To UBound(Tablo2)
Tablo2(x) = Format(Tablo(x), "dddd dd mmmm yyyy") & ", " & Tablo3(x)
Next x
MsgBox "Il y a " & UBound(Tablo2) - LBound(Tablo2) + 1 & " jours fériés/chômés pour le Canton de Genève sur la période du " & Format(Date_Deb, "dddd dd mmmm yyyy") & " au " & Format(Date_Fin, "dddd dd mmmm yyyy") & " : " & vbLf & vbLf & Join(Tablo2, vbLf), vbOKOnly + vbInformation
Else
MsgBox "Il y a aucun jour férié/chômé pour le Canton de Genève sur la période du " & Format(Date_Deb, "dddd dd mmmm yyyy") & " au " & Format(Date_Fin, "dddd dd mmmm yyyy"), vbOKOnly + vbInformation
End If
End If
End Sub
Pièces jointes
Dernière édition: