Filtrage calendrier en semaine 0

Bonsoir,

Je viens de m'apercevoir que mon filtrage de date par le N° de la semaine ne fonctionnait pas pour les années 2017 2022 2023 ect...

car le 1er janvier tombe en semaine 0 mon filtre par semaine n'affiche pas les semaines 0

j'avais penser à incrémenter +1 à toutes les semaines mais impossible de filtrer la semaine 54 ....

Mon idée est d'affiché les dates sélectionnés dans la combobox , si vous avez des idées, car j'ai essayer pleins de formules de calcul de n° de semaine qui aboutissent toujours à un bug de filtrage en début ou en fin d'année.

Je suis

21hebdo-print2.xlsm (145.48 Ko)

Bonjour,

il n'y a pas de semaine 0

Le 01/01/2017 appartient à la semaine 52 de 2016.

Qu'il ne faudra pas confondre avec la semaine 52 de 2017

Pour identifier la semaine sans ambiguïté, la semaine 1 étant la 1ère semaine complète comportant un jeudi :

=ANNEE(A2)-(JOURSEM(A2;2)>4)&"-"&TEXTE(NO.SEMAINE(A2;21);"00")

eric

Bonsoir,

Je crois me souvenir que ton filtrage de semaine se fait sur ListIndex + 1. En le faisant sur ListIndex, cela te permet une valeur 0, te permettant d'avoir une semaine 0 (ce qui ne décale pas les autres) et ajuster ta liste, la semaine 0 restant vide si le 01/01 est dans la semaine 1. Cela fait juste un élément de plus à ta liste, qui comporte déjà une semaine 53 le plus souvent fictive (c'est la semaine 1 de l'année suivante).

Cordialement.

Bonjour eric, Bonjour MFerrand

j'ai appliquer la formule donc effectivement je vois à quel année appartient la semaine mais je n'arrive pas à construire un calendrier filtré dessus,

peut être ai je mal construit le calendrier pour l'affichage, faut il le construire à partir du n° de la semaine plutôt que de déterminer la semaine d'après le calendrier?

Sinon MFerrand, j'avais déjà essayer sans le index +1 mais je me retrouve dans la même situation sur certaine année soit il me manque le début d'année soit la fin.....

Si vous avez d'autre idée je suis preneur car là je sèche complètement,

Merci

Ce que je disais c'est que utilisant une semaine 0, dans ta liste il doit toujours y avoir une semaine 0 : elle sera datée lorsque le 01/01 n'est pas dans la semaine 1, et ne le sera pas si le 1/1 est dans la semaine 1 (la liste de la Combo affichera une valeur vide : si tu la sélectionnes, l'index sera 0 et comme 0 ne figurera pas dans les numéros de semaine, le filtrage n'affichera rien).

Pour avoir la numérotation des semaines à partir de 0, la semaine 0 étant la dernière semaine ISO de l'année précédente (et la dernière numérotée pouvant être la première de l'année suivante) :

=ENT((A2-DATE(ANNEE(A2);1;3)+JOURSEM(DATE(ANNEE(A2);1;3))+5)/7)

NB-Je n'utilise aucune fonction Microsoft pour le calcul du numéro de semaine ISO : la dernière censée le faire est encore boguée, une erreur au 31/12 tous les 28 ans, même chose pour DateDiff en VBA. Je trouve donc plus sûr un calcul direct.

Cordialement.

Bonjour,

en I2 de param , un truc comme ça ne va pas ?

=DATE(An;1;1)

et en J2 =I6+6

et les n° de semaine en H2: =ENT(MOD(ENT((I2-2)/7)+0.6;52+5/28))+1

P.

Salut Patrick !

Tu utilises encore cette horreur de formule ?

Bonne journée

Hello

Bin oui elle fonctionne bien non ?

Bonjour Patrick,

Huum,

j'ai essayer d'appliquer ce que m'a dit mais c'est pas concluant, je continue à chercher une solution

Merci pour vos idées.

C'est un algorithme approximatif, non pérenne, que je considère sans justification dans la mesure où un calcul exact pour toute date passée (sous réserve des bogues d'Excel en matière de dates...) et à venir peut être fait au moyen d'une formule classique de taille réduite.

Il n'en est pas de même pour ce qui est du calcul de Pâques pour laquelle les algorithmes de calcul pérennes (pour de nombreux millénaires si Pâques ne disparaît pas avant ! ) se traduisent par des formules de 6 ou 7 lignes, voire ne peuvent être formulés car dépassant la longueur autorisée d'une formule... Dans ce cas, un algorithme simplifié, à validité limitée dans le temps demeure acceptable lorsque l'on ne veut pas créer une fonction personnalisée (cependant facile à écrire) pour rester sur un classeur sans macro.

Mais ce n'est vraiment pas le cas pour le numéro de semaine ! A tout prendre la fonction Microsoft est tout de même meilleure que cette formule car elle ne bogue que sur un nombre de jours limités (ce qui n'en est pas moins irritant de la part de Microsoft, mais pour tout ce qui concerne les dates, on ne peut pas dire que Microsoft ait fait le moindre effort...)

Cordialement.

edlede a écrit :

Bonjour Patrick,

Huum,

j'ai essayer d'appliquer ce que m'a dit mais c'est pas concluant, je continue à chercher une solution

Merci pour vos idées.

Pas certain d'avoir compris (mes neurones se raréfient)

P.

69hebdo-print3.xlsm (153.56 Ko)

Re bonjour,

ca ressemble beaucoup à se que j'avais fait, d'apres tes explications mais il y a toujours un problème dans l'affichage entre la combobox et le filtrage,

Dans ton fichier exemple la date dans la combo est du 01-janv au 07-janv alors que le filtre ramène les dates du 2 au 8

De plus comme le calendrier se génère automatiquement d'après la date saisie lors de la création du fichier plus on s'éloigne de 2017 plus l'écart entre l'affichage de la combo et celui du filtrage est grand.

je pense que faut il revoir la création du calendrier pour qu'il parte du premier lundi de chaque année se sera peut être plus simple qu'en pensez vous?

Pour ma part, je t'ai indiqué une solution qui me paraît fixe (qui n'a plus à être retouchée les années suivantes)...

Cordialement.

Je veux bien te croire MFerrand mais là j'ai pas du bien l'appliquer, j'ai essayer avec NO.SEMAINE mais j'ai quand même des problèmes sur 2019 entre mon filtre et ma combo

Parfois je m'étonne de ma nullité

si tu as le temps de faire un exemple je suis preneur!

Teste ça ! Explications plus tard, je sois aller poster un courrier...

Ok merci ca m'a l'air de tournée plus rond que le mien en effet

par contre

=ENT((A366-DATE(ANNEE(A366);1;3)+JOURSEM(DATE(ANNEE(A366);1;3))+5)/7)

je veux bien un petit décryptage dans la soirée, parce qu'elle me semble plus complexe que celle déjà testé

Ainsi que cela qui à l'air de corriger mon indexe +1 qui me créait des décalage dans mes semaines

Commençons par la formule... !

Le calcul du numéro de semaine selon la norme ISO en vigueur repose sur le fait que la semaine 1 de l'année contient toujours la date du 4 janvier. Le premier lundi est donc le lundi de la semaine qui contient le 4 janvier.

Le jour de semaine du 4 janvier pouvant varier du lundi au dimanche, ce premier lundi variera corrélativement du 4 janvier au 29 décembre précédent (en remontant le calendrier).

On peut donc le calculer en apportant à cette date du 4 janvier un correctif selon son jour de semaine... soit en utilisant JOURSEM...

Cependant, compte-tenu que JOURSEM renvoie une série de 1 à 7 selon que le jour de semaine varie du dimanche au samedi, il apparaît plus commode d'utiliser la date du 3 janvier.

En effet, lorsque le 4 janvier varie du lundi au dimanche, le 3 varie simultanément du dimanche au samedi (renvoyant une valeur de JOURSEM(3 janvier) de 1 à 7, ce qui facilite l'application du correctif.

Ainsi : lundiSemaine1 = 3janvier - JOURSEM(3janvier) +2

[C'est ma formule préférée de calcul du numéro de semaine, non pas qu'elle soit supérieure aux autres qui calculent à partir des mêmes règles de définition de la semaine 1, mais parcequ'elle me paraît la plus simple à expliquer et à comprendre. Je te joins pour info un fichier explicatif du calcul du numéro de semaine que j'avais établi suite à une demande...]

Dans la formule que tu cites on calcule la date du lundi précédent (soit le lundi de la dernière semaine de l'année précédente).

On soustrait donc 7 au résultat vu précédemment :

= 3janvier -JOURSEM(3janvier) -5

Le calcul du numéro de semaine d'une date quelconque se fait en calculant le quotient entier par 7 de la différence entre cette date et le lundi de la semaine 1, et en ajoutant 1 (si la date est dans la semaine 1, ce quotient entier sera égal à 0).

Si on substitue le lundi de la semaine qui précéde au lundi de la semaine 1, plus besoin d'ajouter 1.

= ENT ( (date - 3janvier + JOURSEM(3janvier) +5) / 7 ) renvoie donc le numéro de semaine dans l'année considérée.

[NB- inversion des signes du fait de la suppression des parenthèses internes...]

Cette formule renvoie donc un numéro de semaine pour toutes les dates d'une année (du 1er janvier au 31 décembre) qui est bien le bon numéro, de 1 à 52.

Mais pour les premiers jours de l'année elle peut renvoyer 0 si ces jours ne sont pas dans la semaine 1 (semaine 0 = dernière semaine de l'année précédente).

De même, elle peut renvoyer 53 pour les derniers jours de l'année. Ce 53 peut être le bon numéro de semaine dans le cas d'une année comportant 53 semaines (comme 2015, ce sera le cas en 2020, 2026, 2032, 2037...) [l'année a 53 semaines lorsque le 1er janvier est un jeudi, ou lorsque le 1er janvier est un mercredi si l'année est bissextile]. Dans les autres cas, ce renvoi de 53 correspondra en fait à la semaine 1 de l'année suivante.

La formule mise en colonne B (masquée) de ton fichier va donc, du 1er janvier au 31 décembre, renvoyer un numéro de semaine allant soit de 0 à 52, soit de 1 à 53. Il est normal que l'on ait une série de 53 numéros puisqu'une année comprend en volume 52 semaines + 1 jour (+2 jours les années bissextiles), les jours affectés du premier et du dernier numéros de la série étant le plus souvent en nombre inférieur à 7.

Suite des explications sur un post suivant !

Fichier explicatif du calcul général du numéro de semaine :

sacré cliffhanger, j'ai hâte d'avoir la suite je regarde ton fichier joint.

Effectivement j'avais compris cette logique, conséquente dont est issue la norme iso qui permet de définir la première semaine de l'année avec un lundi compris avec 4 jours consécutifs.

Mais de là à trouver la bonne formule, je ne suis pas au niveau, et j'avais pas appréhendé la complexité de la formulation de la chose.

Il est vrai que microsoft aurai pu gérer la fonction No semaine de façon à répondre à ce genre de problème. ( car je pense que nombre d'entreprise qui on besoin de définir de façon pérenne leurs semaines ne doivent pas manquées.)

En fait si on avait eu des année de 364 jours se serait nettement plus simple ça changerai un peu la durée de la seconde mais ça rendrait quand même les calcules plus faciles.

Vivement la suite,

et merci pour cette première partie d'explication.

Mise au point de la liste des semaines (feuille Param) :

- En I2, tu débutes ta "première" semaine de l'année (qui n'est pas forcément la semaine 1) par la date du 1er janvier (qui n'est pas forcément un lundi. [=DATE(An;1;1)]

- La fin de cette première semaine sera par contre bien un dimanche, le dimanche qui suit le 1er janvier ou le 1er janvier lui-même si ce dernier est un dimanche (semaine du 01/01 au 01/01), d'où la formule en J2 :

=I2+MOD(8-JOURSEM(I2);7)

L'utilisation de MOD (modulo 7) permet de renvoyer 0 si le 1er janvier est un dimanche, mais conserve la différence à ajouter, de 6 à 1, pour atteindre le dimanche lorsque le 01/01 varie du lundi au samedi.

- En I3, début de la semaine suivante, on ne peut faire I2+7, le 1er janvier n'étant qu'exceptionnellement un lundi. Mais J2 étant lui nécessairement un dimanche, on peut donc faire :

=J2+1

- En I4, on peut faire enfin : =I3+7, formule qu'on va tirer jusqu'en I54. On aura la succession de lundis débutant chacune des semaines de l'année.

- En J3, on peut par contre faire tout de suite : =J2+7 pour avoir le dimanche suivant. Et tirer la formule vers le bas pour avoir la succession des dimanches, mais il faut s'arrêter à J53 car de même le 01/01 n'est pas forcément un lundi, le 31/12 n'est pas forcément un dimanche...

- Et on termine la liste de semaines de l'année, nécessairement par le 31 décembre, en J54. [=DATE(An;12;31)]

- En H2, on calcule le numéro de semaine de la date I2 (01/01) au moyen de la formule décrite précédemment, qui sera donc 1 ou 0, comme on l'a déjà vu.

- La série des numéros étant continue, en H3 on peut revenir à une formule simple [=H2+1] et la tirer jusqu'en H54.

La liste résultante en colonne K [K2:K54, nommée Week], qui alimente ComboBox1 ne comporte donc pas de "trous" (contrairement à ce que j'avais un peu trop vite pensé d'abord et exprimé dans un post antérieur).

Simplement la numérotation sera de 0 à 52 ou de 1 à 53. Dans le 1er cas (0 à 52), le numéro de la semaine sélectionnée dans la liste correspond à la valeur de ListIndex. Mais dans le second (1 à 53), il correspond à la valeur de ListIndex +1. Il faut donc en tenir compte pour opérer le bon filtrage.

J'ai ajouté un nom de plage, FW [pour FirstWeek] pour nommer la cellule H2 (Param) où se calcule le numéro de la première semaine listée, qui sera comme on l'a vu 1 ou 0.

Dans la procédure de filtrage (ComboBox1_Change), en affectant à une variable ns la valeur ListIndex + [FW] pour définir le critère de filtrage on l'ajuste à la série 0-52 ou 1-53 selon le cas...

Cordialement.

Dans la procédure de filtrage (ComboBox1_Change), en affectant à une variable ns la valeur ListIndex + [FW] pour définir le critère de filtrage on l'ajuste à la série 0-52 ou 1-53 selon le cas...

très astucieux j'avais bien repéré que selon la première semaine était 1 ou 0 il me fallait changer la valeur de mon index mais je n'avais pensé à une solution aussi pertinente ( je me voyais faire des testes de logique avec des if ....)

En tous cas Bravo pour ces astuces très bien pensées et qui règle le problème de façon pérenne.

Encore merci pour les explications (surtout pour la formule ) dont je n'ai pas trouvé d'équivalence sur le net.

Rechercher des sujets similaires à "filtrage calendrier semaine"