Formule pour calculer délai de 10 jours, en excluant des dimanches et les jours férié

GILBERTO BRAGA

XLDnaute Occasionnel
Bonjour à tous

J'ai besoin de deux formules pour calculer, à partir d'une date de début, 10 jours, en excluant les dimanches et les jours fériés.

La première formule doit retourner premier jour ouvrable immédiatement precedent si le dixième jour tombe un dimanche ou un jour férié.


La seconde formule doit retourner le premier jour ouvrable suivant si le dixième jour tombe un dimanche ou un jour férié.

Le samedi doit être considéré jour utile (ouvrable).

Merci
 

Papou-net

XLDnaute Barbatruc
Re : Formule pour calculer délai de 10 jours, en excluant des dimanches et les jours

Bonjour GILBERTO BRAGA,

En admettant la date en A1, formules à entrer dans les cellules cibles :

Code:
=SI(JOURSEM(A1+10)=1;A1+9;A1+10)
pour le jour précédent,

et :

Code:
=SI(JOURSEM(A1+10)=1;A1+11;A1+10)
pour le jour suivant.

Cordialement.
 

hoerwind

XLDnaute Barbatruc
Re : Formule pour calculer délai de 10 jours, en excluant des dimanches et les jours

Bonjour, salut Papou-net,

Pour Papou-net : il me semble que tu n'as pas tenu compte du fait qu'un dimanche pouvait suivre ou précéder un jour férié.

Je verrai plutôt une formule de ce genre :
Code:
=SI(OU(JOURSEM(A1+10)=1;NB.SI(fer;A1+10)=1);SI(OU(JOURSEM(A1+9)=1;NB.SI(fer;A1+9)=1);A1+8;A1+9);A1+10)
fer étant la plage nommée des jours fériés, dimanches exclus.
 

wilfried_85

XLDnaute Nouveau
Re : Formule pour calculer délai de 10 jours, en excluant des dimanches et les jours

Bonjour

en tenant compte des jours fériés et non-ouvrable

une série de fonctions à placer dans un module
Code:
Function estferie(ByVal cellule As Variant) As Boolean
    'Vrai si la valeur courante correspond a un jour férié
    Application.Volatile
    Dim Y As Long, i As Long, SylvesterDay As Date, SpecD, b As Long
    Y = Year(cellule)
    b = Abs((Y Mod 4 = 0 And Y Mod 100 <> 0) Or (Y Mod 400 = 0))
    SylvesterDay = DateSerial(Y, 1, 1) - 1
    i = EASTER(Y) - SylvesterDay - b
    'Pour la France (1 Mai = 121em jour d'une année NON-bissextile)
    SpecD = Array(1 - b, 121, 128, 195, 227, 305, 315, 359, i + 1, i + 39, i + 50)
    Y = Int(cellule) - SylvesterDay - b
    For i = 0 To UBound(SpecD)
        estferie = Y = SpecD(i)
        If estferie Then Exit For
    Next
End Function
Function NonOuvrable(ByVal cellule As Variant) As Boolean
    'Vrai si la valeur courante correspond a un jour férié
    Application.Volatile
    Dim Y As Long, i As Long, SylvesterDay As Date, SpecD, b As Long
    NonOuvrable = False
    If Weekday(cellule, vbMonday) > 5 Then ' Regarde si j'ai un samedi ou un dimanche
        NonOuvrable = True
        Exit Function
    End If
    Y = Year(cellule)
    b = Abs((Y Mod 4 = 0 And Y Mod 100 <> 0) Or (Y Mod 400 = 0))
    SylvesterDay = DateSerial(Y, 1, 1) - 1
    i = EASTER(Y) - SylvesterDay - b
    'Pour la France (1 Mai = 121em jour d'une année NON-bissextile)
    SpecD = Array(1 - b, 121, 128, 195, 227, 305, 315, 359, i + 1, i + 39, i + 50)
    Y = Int(cellule) - SylvesterDay - b
    For i = 0 To UBound(SpecD)
        NonOuvrable = Y = SpecD(i)
        If NonOuvrable Then Exit For
    Next
End Function
Function ProchainOuvrable(cellule As Variant) As Double
    Dim d As Double
    d = cellule
    Application.Volatile
    While NonOuvrable(d) = True ' Tant que la date est un jour non ouvrable,
        d = d + 1 ' j'ajoute 1 jour
    Wend
    ProchainOuvrable = d ' je transmets la date trouvée
End Function
Function precedentOuvrable(cellule As Variant) As Double
    Dim d As Double
    d = cellule
    Application.Volatile
    While NonOuvrable(d) = True ' Tant que la date est un jour non ouvrable,
        d = d - 1 ' j'ajoute 1 jour
    Wend
    precedentOuvrable = d ' je transmets la date trouvée
End Function

 
Function EASTER(Yr As Long) As Long
    '*Dans la fonction originale, les données étaient de type Integer*
    Dim Century As Long, Sunday As Long, Epact As Long, N As Long
    Dim Golden As Long, LeapDayCorrection As Long, SynchWithMoon As Long
    Golden = (Yr Mod 19) + 1
    Century = Yr \ 100 + 1
    LeapDayCorrection = 3 * Century \ 4 - 12
    SynchWithMoon = (8 * Century + 5) \ 25 - 5
    Sunday = 5 * Yr \ 4 - LeapDayCorrection - 10
    Epact = (11 * Golden + 20 + SynchWithMoon - LeapDayCorrection) Mod 30
    If Epact < 0 Then Epact = Epact + 30
    If (Epact = 25 And Golden > 11) Or Epact = 24 Then Epact = Epact + 1
    N = 44 - Epact
    If N < 21 Then N = N + 30
    N = N + 7 - ((Sunday + N) Mod 7)
    EASTER = DateSerial(Yr, 3, N)
End Function

les formules : ta date en A1
ouvrable suivant
Code:
=si(nonouvrable(A1+10);prochainouvrable(a1+10);a1+10)
precedent ouvrable
Code:
=si(nonouvrable(A1+10);precedentouvrable(a1+10);a1+10)
 

GILBERTO BRAGA

XLDnaute Occasionnel
Re : Formule pour calculer délai de 10 jours, en excluant des dimanches et les jours

Bon jour à tous, Papou-net, Hoerwind, et Wilfried_85

En fait, il faut le plus exclure non seulement les dimanches, comme aussi les jours fériés, comme a bien observé Hoerwind.

Hoerwind, en adaptant sa formule pour le jour suivant:

' =SI(OU(JOURSEM(A1+10)=1;NB.SI(Fer;A1+10)=1);SI(OU(JOURSEM(A1+11)=1;NB.SI(Fer;A1+11)=1);A1+12;A1+11);A1+10)



Concernant la fonction proposition par Wilfried_85, comme je ne sais pas VBA, je ne sais pas comment adapter la fonction aux jours fériés existants au Brésil.

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 210
Messages
2 086 281
Membres
103 170
dernier inscrit
HASSEN@45