Compter les jours ouvrables sans les jours fériés

Sophieg1

XLDnaute Nouveau
Bonjour

Je cherche une fonction me permettant à partir d'une date J d'arriver à J+5 jours ouvrables. J'ai trouve sur le forum des fonctions comptant les jours ouvrables mais j'ai deux difficultés supplémentaires que je n'arrive pas à résoudre. Pour situer le contexte J est la date d'envoi d'un colis et J+5 sa réception, la Poste ne travaillant pas dimanches et JF...

1) Il s'agit donc ici de 5 jours VRAIMENT ouvrables donc hors dimanche mais aussi hors jours fériés (j'ai la liste des jours fériés dans une colonne à côté). Je n'arrive pas à prendre en compte les JF dans mon calcul :-(

2) J+5 (ou J+6 ou J+7 suivant ce qu'on a trouvé juste au-dessus) lui même doit être ouvrable c'est à dire ne doit être ni un dimanche ni un jour férié. Si c'est un dimanche ou un jour férié on reporte à J+6 et on s'assure que J+6 n'est pas un dimanche ou un JF etc

Le tout ne peut pas être fait en VBA car doit être compatible Open office (oui je sais bouh :p) et Excel 2000

Je serai infiniment reconnaissante à quiconque pourra m'aider car je patauge depuis plusieurs jours :-(

Sophie
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Compter les jours ouvrables sans les jours fériés

(re)Bonjour Sophieg1,

La formule:
=PETITE.VALEUR(SI(((JOURSEM(A4+LIGNE(INDIRECT("$1:$10"));2)>=7)+(ESTNUM(EQUIV(A4+LIGNE(INDIRECT("$1:$10"));FERIES;0))))>0;"";A4+LIGNE(INDIRECT("$1:$10")));5)

Ce que fait la formule:
Elle construit la série des dates comprises entre la date A4+1 et A4+10. "A4+LIGNE(INDIRECT("$1:$10"))"

Pour chacune de ces dates, on voit si c'est un dimanche (JOURSEM(A4+LIGNE(INDIRECT("$1:$10"));2)>=7)
(renvoit Vrai ou Faux)

Pour chacune de ces dates, on voit si c'est un jour férié ESTNUM(EQUIV(A4+LIGNE(INDIRECT("$1:$10"));FERIES;0))))>0
(renvoit Vrai ou Faux)

Pour chaque de ces dates, on fait un OU logique entre les deux précédentes conditions (le OU se fait par la somme des deux conditions - Faux correspond à 0 et Vrai correspond à 1 )
((JOURSEM(A4+LIGNE(INDIRECT("$1:$10"));2)>=7)+(ESTNUM(EQUIV(A4+LIGNE(INDIRECT("$1:$10"));FERIES;0))))>0
(renvoit 0 => ni dimanche, ni férié, renvoit 1 => soit dimanche, soit férié, renvoit 2 => à la fois dimanche et férié)

Si au moins une des conditions est Vrai (dimanche et/ou férié), alors on renvoit la chaine vide "", sinon on renvoit la date.
SI(((JOURSEM(A4+LIGNE(INDIRECT("$1:$10"));2)>=7)+(ESTNUM(EQUIV(A4+LIGNE(INDIRECT("$1:$10"));FERIES;0))))>0;"";A4+LIGNE(INDIRECT("$1:$10")))

On obtient donc une suite de dates qui ne sont ni dimanche ni fériées, entrecoupées de chaines vides (qui correspondent aux dimanches ou fériées)

On prend ensuite la 5ième plus petite valeur qui est le jour de livraison (Petite.valeur ignore les chaines vides). Si, par ex. on dépose un lundi 10 (semaine sans férié), le jour de livraison sera samedi 15. C'est à vous de voir comment interpréter le J+5. Si vous considérez que le dépot le lundi doit aboutir à une date de livraison au vendredi, alors remplacez le 5 par 4.
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Compter les jours ouvrables sans les jours fériés

Bonsoir à tous


(...)

Le tout ne peut pas être fait en VBA car doit être compatible Open office (oui je sais bouh :p) et Excel 2000

(...)
Un code compatible LibreOffice / Excel :​
VB:
Rem  *****  BASIC  *****

Function decalDate(d&, dec&, fer As Range)
Dim i%, j%, f
    If dec <> 0 Then
        f = fer
        For j = Sgn(dec) To dec Step Sgn(dec)
            d = d + Sgn(dec)
            d = decal(d, dec, f)
        Next
    End If
    decalDate = d
End Function

Function decal(x&, y&, z)
Dim i%, j%
    Do
        For i = 1 To UBound(z, 1)
            If x = z(i, 1) Or x Mod 7 = 1 Then Exit For
        Next
        If i > UBound(z, 1) Then Exit Do
        x = x + Sgn(y)
    Loop
    decal = x
End Function
Sur ce, je pars en vacances...​


Bonne nuit.


ROGER2327
#6671


Dimanche 1[SUP]er[/SUP] Gidouille 140 (Sainte Bouzine, esprit - fête Suprême Tierce)
27 Prairial An CCXXI, 7,3817h - verveine
2013-W24-6T17:42:58Z
 

Pièces jointes

  • Fériés_comp_3x.zip
    37.5 KB · Affichages: 32
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Compter les jours ouvrables sans les jours fériés

Suite...


J'étais bien étourdi hier puisque j'ai déposé une version en cours de développement...

La fonction est :​
VB:
Rem  *****  BASIC  *****

Function decalDate(d&, dec&, fer As Range)
Dim i%, j%, f
    If dec <> 0 Then
        f = fer
        For j = Sgn(dec) To dec Step Sgn(dec)
            d = d + Sgn(dec)
            Do
                For i = 1 To UBound(f, 1)
                    If d = f(i, 1) Or d Mod 7 = 1 Then Exit For
                Next
                If i > UBound(f, 1) Then Exit Do
                d = d + Sgn(dec)
            Loop
        Next
    End If
    decalDate = d
End Function
Cette fois, je pars vraiment en vacances...​



À plus tard.



ROGER2327
#6672


Lundi 2 Gidouille 140 (Saint Lucullus, amateur(Bloosday) - fête Suprême Quarte)
28 Prairial An CCXXI, 2,9253h - thym
2013-W24-7T07:01:14Z
 

Pièces jointes

  • Fériés_comp_4x.zip
    61.5 KB · Affichages: 24

Discussions similaires

Réponses
24
Affichages
1 K

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa