Reduction d un code si imbriqué

Bonjour tout le monde.

J'ai créer une base de donnée liée à calendrier tenant compte des jours feriés.

J'ai imbriqué des si() avec des ou() et des et().

J'aimerai savoir si ma premiere ligne de code peut être amélioré (raccourci notamment), je suis sur que cela est possible mais je ne trouve pas la solution.

Voici le debut de mon code :

=SI(OU(A17=$B$6;A17=$B$7;A17=$B$8;A17=$B$9;A17=$B$10;A17=$B$11;A17=$B$12;A17=$B$13;A17=$C$6;A17=$C$8;A17=$C$10;A17=$C$12;A17=$C$14);"ferie"

j'avais pensé à :

=si(A17=ou($B$6;$B$7;$B$8.$B$9;$B$10;$B$11;$B$12;$B$13;$C$6;$C$8;$C$10;$C$12;$C$14);"ferie")

il a le mérite d'être plus court et c est que je recherche , mais il ne marche pas.

Merci pour votre aide.

Bonjour,

je te donne le principe :

  • tu mets tous les jours fériés en continu dans une zone (que tu peux nommer)
  • tu remplaces tous tes OU par un NB.SI pour savoir si la date appartient à cette zone

ensuite tu remets ton calcul de jours (j'ai mis en attendant "______")

Bonsoir,

Ouille !

Voilà déjà un peu plus court !

=SI(NB.SI($B$5:$C$14;A17)>0;"ferie";SI(JOURSEM(A17)=1;"week end";SI(MOD(JOURSEM(A17)+2;7)>3;SI(ET(JOURSEM(A17)<>4;NB.SI(B18:B19;"ferie")>0);A17+3;SI(ET(JOURSEM(A17)=4;NB.SI(B18:B21;"ferie")>0);A17+5;A17+2));SI(NB.SI(B18:B21;"ferie")>0;A17+5;A17+4))))

Mais je l'ai faite en analysant tes conditions pour les reproduire... Ce qui ne rectifie pas l'erreur qui semble affecter tes conditions.

Ce que j'ai déduis de l'analyse du cheminement de tes SI OU ET c'est en résumé que la date d'envoi à définir est par rapport à la date de signature : hors présence de férié dans les 2 jours suivants pour LU et MA ou les 4 jours suivants pour les autres jours, cette date est J+2 pour LU MA et ME , J+4 pour JE VE SA ; si présence de férié comme indiqué : J+3 pour LU MA et J+5 pour autres jours.

Alors il faut que tu nous exprimes les règles de façon concise mais précise....

Il est certain que le chevauchement avec le délai normal aboutit à fixer une date sans avoir testé s'il s'agissait d'un férié...

A suivre.


Ah ! Attention avec mes formules ! Je ne travaille JAMAIS avec JOURSEM(date;2) mais exclusivement avec JOURSEM(date), estimant que c'est une source d'erreur de faire autrement, JOURSEM étant fréquemment utilisé avec MOD pour faire renvoyer une répartition différente des jours de la semaine. Ici j'ai fait renvoyer une répartition qui met le jeudi à 0 (et le dimanche à 3)...

Sous réserve que tu confirmes ou modifie les règles d'acheminement normal, j'ai un peu commencé à débrousailler le problème, pensant qu'il faut tester à partir de la date normale d'envoi dès lors qu'il s'agit d'un délai de traitement incompressible.

On peut imaginer formuler en utilisant MIN pour pour sélectionner le premier ouvré disponible. (Mais là ce sera du matriciel probablement).

J'ai aussi fait le point sur les télescopages possibles de fériés : 2 fériés consécutifs ne peuvent tomber qu'avec l'Ascension qui est toujours un jeudi : ce sera donc soit un ME-JE, soit un JE-VE ; autre télescopage indirect possible, si la Pentecôte tombe le 10 mai (c'est la date minimale pour ce jour, qui sera alors un dimanche, suivant le 8 mai qui sera un vendredi). Là gros décalage mais ça n'arrive pas souvent... Les jours de signature pouvant donner lieu à des décalages importants d'envoi sont les mardi et mercredi.

Une autre solution que je n'ai pas encore envisagée pour trouver le jour ouvré qui convient est la fonction ad-hoc de Microsoft.

Je vais voir si cela permet d'obtenir le résultat dans tous les cas.

Mais là il va falloir que tu exécutes dare-dare la directive de Steelson et nous liste les fériés dans une même colonne à la suite et nomme la plage de façon qu'on l'utilise dans la formule.

Nouvelle formule :

=SI(NB.SI(Fériés;A17)>0;"ferie";SI(JOURSEM(A17)=1;"week end";SERIE.JOUR.OUVRE(A17;SI(JOURSEM(A17)<>7;2;3);Fériés)))

Il reste des problèmes ! mais qui là tiennent aux règles appliquées :

-la règle que j'ai observé est que le jour d'envoi pour les jours de signature du lundi au vendredi est le 2e jour ouvrable suivant ; pour le samedi, c'est le 3e (soit normalement le mercredi qui suit, mais dans ta vérif cela devient le 2e si un jour férié s'intercale.

C'est un point à préciser il me semble. C'est également vrai pour la veille du 1er novembre (un lundi) où tu mets l'envoi au 2, soit le jour ouvré suivant.

La formule s'est sérieusement raccourcie toutefois. On va essayer de ne pas la rallonger. Je me fie à ta vérif ! et je vais chercher une solution.

MFerrand a écrit :

Ah ! Attention avec mes formules ! Je ne travaille JAMAIS avec JOURSEM(date;2) mais exclusivement avec JOURSEM(date), estimant que c'est une source d'erreur de faire autrement, JOURSEM étant fréquemment utilisé avec MOD

Hum, mouais ... mais quand même la norme ISO = la semaine commence le lundi !

MFerrand a écrit :

Alors il faut que tu nous exprimes les règles de façon concise mais précise....

Il est certain que le chevauchement avec le délai normal aboutit à fixer une date sans avoir testé s'il s'agissait d'un férié...

A suivre.

Quel travail ! je n'ai pas eu le courage de décortiquer, j'attendais la suite !

Il faut en effet utiliser SERIE.JOUR.OUVRE mais j'avais compris que le samedi devait être inclus comme jour ouvré !

OK pour la norme ISO mais sans argument, c'est plus court, et comme on la charcute beaucoup cette fonction, c'est un peu une exception

Oui pour SERIE.JOURS.OUVRES, mais il y a des écarts que j'ai indiqués... Il faut vraiment qu'il nous définisse les règles clairement !

j'ai essayé de moduler le jour de départ, mais cela crée d'autres écarts ailleurs. Et si on module pour avoir 0 comme jour cherché il ne le teste pas si férié.

Le samedi est ouvré pour les agences mais n'est pas un jour d'envoi, donc on peut traiter weekend normal de ce point de vue.

Bon je crois que je vais déjeuner !

Bonjour. Et merci pour vos reponses

Je vous mets en pj le tableau de correspondance.

Ps en l ecrivant je me demande si je me suis pas trompé dans mon code excel, je regarderai cela ce soir.

Bon ! l'envoi n'est pas parti (crash) et le message perdu !

Voilà déjà le fichier.


Je reprends mon message qui disait que ton document montrait que la formule était bonne. Tu verras les cas d'écart dans le fichier, j'y ai ajouté un commentaire tous ces cas (sauf 1) ont signature le samedi, un férié intercalé et la formule donne l'envoi au jeudi, comme le doc de réf. Pareil pour le lundi suivi d'un mardi férié, l'envoi ressort au jeudi comme dans le doc.

J'ajoutais que les cas de conjonction de 2 fériés de semaine consécutifs rares ne sont pas explicitement décrits mais entraîneront un décalage supplémentaire vraisemblablement puisque le traitement ne pourra avoir lieu lors des fériés (sauf dispositif particulier) mais tu as le temps d'y penser, ça se produit sur des cycles assez longs, et ne peut survenir que pour le 1er et le 8 mai avec l'Ascension. De même pour le cas encore plus rare du 8 mai un vendredi suivi du dimanche et lundi de Pentecôte...

Bonne continuation.

Euh ... Merci.

formidable, effectivement le fait de rassembler les dates dans une série est astucieuse.

Par contre je ne connaissais pas la fonction serie.jour.ouvré , je vais donc l'etudier et la memoriser.

Encore merci

Bonne soirée

Ici la fonction SERIE.JOURS.OUVRES qui considère le samedi et le dimanche comme weekend était utilisable dans la mesure où si le samedi est un jour ouvré pour signatures, il ne l'était pas pour l'envoi, ce qu'on déterminait.

Sinon on pouvait avoir recours à SERIE.JOURS.OUVRES.INTL qui permet n'importe quelles combinaisons de jours et offre d'énormes possibilités...

Cordialement.

MFerrand a écrit :

J'ajoutais que les cas de conjonction de 2 fériés de semaine consécutifs rares ne sont pas explicitement décrits mais entraîneront un décalage supplémentaire vraisemblablement puisque le traitement ne pourra avoir lieu lors des fériés (sauf dispositif particulier) mais tu as le temps d'y penser, ça se produit sur des cycles assez longs, et ne peut survenir que pour le 1er et le 8 mai avec l'Ascension. De même pour le cas encore plus rare du 8 mai un vendredi suivi du dimanche et lundi de Pentecôte...

En effet :

  • en 2018 : mardi 8 mai, jeudi 10 mai = Ascension, soit 2 jours fériés dans la semaine
  • en 2035 : mardi 1er mai, jeudi 3 mai = Ascension, mardi 8 mai, soit 3 jours fériés regroupés

J'avais du coup pensé à une fonction personnalisée qui simulerait de jour en jour les cas rencontrés ... je vais regarder ce point.

C'est déjà bon ça !

Le regroupement dans la même période est moins rare.

Bon courage pour calculer... cela dépend de la date de Pâques, elle a un cycle, mais plutôt hors de portée. Je l'avais lu quelque part mais je ne sais plus si c'est de l'ordre de 10000 ou du million d'années.

Bonne journée.

J'oubliais ceci :

  • en 2024 : Ascension le lendemain du 8 mai, en semaine tous les 2
  • et en 2043, c'est la veille du 8 mai !

Bon, je vais me faire la simulation complète sur le XXIème siècle


Il y a même des années ou l'Ascension tombe un 8 mai

21jf.xlsx (28.89 Ko)

Oui ! Là c'est plus gênant.

Je n'ai pas eu le temps de le poster ce matin ...

TOUS LES JOURS FERIES DU XXIème SIECLE ... plus visuel comme ceci !

Rechercher des sujets similaires à "reduction code imbrique"