Si vous avez déjà utilisé la fonction =NO.SEMAINE() vous ne pouvez pas ne pas avoir remarqué ses défauts.
Cette fonction vient d'Excel et Numbers en reproduit parfaitement le (dys)fonctionnement.
Si on lui demande le numéro de semaine du 31 décembre 2009, elle indique 53.
Si on lui demande le numéro de semaine du 1
er janvier 2010, elle indique 1.
C'est ennuyeux car ces deux jours se suivent et appartiennent à la même semaine mais le tableur ne leur donne pas le même numéro.
Pour qui veut tenir des indicateurs hebdomadaires, ce n'est pas très pratique il est assez rare qu'une année démarre un lundi et finisse un dimanche.
Donc, avec =NO.SEMAINE(), la première et la dernière semaine sont généralement incomplètes, ont un nombre de jours différent de 7.
Enfin, si on regarde un calendrier, par exemple celui de 2010, le numéro de semaine indiqué par le tableur est incorrect.
Il existe une définition ISO du numéro de semaine.
Dieu a été assez malin pour créer une semaine de 7 jours, c'est à dire ayant un nombre impair de jours.
Ainsi, quand une semaine est à cheval sur deux années, il y en a toujours une qui détient plus de jours que l'autre.
La semaine ISO, par définition, appartient alors en totalité à cette année.
Dit autrement, c'est le jeudi qui détermine l'année à laquelle la semaine appartient.
On peut aussi noter que le 4 janvier appartient du coup toujours à la semaine 1.
Dans ces conditions, le 31/12/2009 et le 01/01/2010 appartiennent tous deux à la semaine 53 de l'année 2009.
En effet, le jeudi de cette semaine, le 31/12 justement, tombe en 2009 et c'est le 53
ème jeudi de l'année.
Pour obtenir le numéro de semaine ISO d'un jour donné, il "suffit" donc de déterminer le rang du jeudi de la semaine en question.
Admettons qu'en A1, on ait indiqué un jour. Le jeudi correspondant à ce jour est obtenu par la formule suivante :
- Code:
-
=A1-JOURSEM(A1;2)+4
On prend le jour en question, on lui enlève le n° d'ordre du jour dans la semaine en comptant du lundi et on ajoute 4 jours.
On tombe bien un jeudi. Le jeudi qui nous intéresse.
Maintenant, il faut déterminer le rang de ce jeudi dans l'année. Il faut donc trouver d'abord le premier jeudi de l'année.
On sait que le 4 janvier appartient à la première semaine. Le premier jeudi de l'année est donc celui qui appartient à la même semaine que le 4 janvier.
On obtient ça par la formule suivante :
- Code:
-
DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4)-JOURSEM(DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4);2)+4
On a "juste" remplacé A1 par DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4) — qui donne le 4 janvier de l'année — dans la formule précédente (en fait, le 4 janvier de l'année du jeudi de la semaine considérée).
Si on soustrait maintenant la seconde formule de la première et qu'on divise le résultat par 7, on trouve le rang du jeudi correspondant à A1, donc le numéro de semaine ISO de la date en A1. Ou presque. Puisque n - n vaut zéro, il faut rajouter 1 :
- Code:
-
=((A1-JOURSEM(A1;2)+4)-(DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4)-JOURSEM(DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4);2)+4))/7+1
Selon des considérations et des calculs similaires, on peut déterminer l'année ISO de la date.
L'année ISO est l'année à laquelle appartient le jeudi de la semaine, donc l'année à laquelle appartient la semaine.
Sans tenir compte de ça, on risque d'écrire que le 31/12/2009 appartient la semaine 53 de 2009 et que le 01/01/2010 appartient à la semaine 53 de 2010.
Ce qui est une affreuse connerie évidemment. Parler de semaine ISO sans parler d'année ISO est une aberration.
L'année ISO est donc :
- Code:
-
=ANNÉE(A1-JOURSEM(A1;2)+4)
Et comme parler semaine sans parler année dépasse l'entendement, il faudrait mieux concaténer les deux pour être rigoureux :
- Code:
-
=ANNÉE(A1-JOURSEM(A1;2)+4)*100+((A1-JOURSEM(A1;2)+4)-(DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4)-JOURSEM(DATE(ANNÉE(A1-JOURSEM(A1;2)+4);1;4);2)+4))/7+1
Pour "faire de la place" au numéro de semaine, on a multiplié l'année par 100.
On pourra, pour plus de lisibilité, formater la cellule selon le schéma ####-## ou ####s## selon ses préférences ou ses besoins.
L'idéal serait de pouvoir créer une macro qui ajouterait cette formule pour en faire une fonction.
Excel en est capable. Numbers, non. Disons, pas encore...
Pour terminer, l'ISO ne dit rien du mois. mais on pourrait étendre la notion en parlant de mois ISO.
Ainsi, la semaine appartiendrait au mois qui contient son jeudi et le mois ISO ferait toujours un nombre entier de semaines.
Ca simplifie énormément certains problèmes : une année ISO, un mois ISO et une semaine ISO commencent toujours un lundi et se finissent toujours un dimanche.
Un mois ISO est toujours un ensemble de semaines ISO entières.
Une année ISO est toujours un ensemble de mois ISO entiers, donc de semaines ISO entières.
Par contre, années ISO et mois ISO commencent rarement un 1
er !