no.semaine mode iso !

gnimitz

XLDnaute Occasionnel
Bonsoir à tous

Je recherchais une formule pour me calculer mes numéros de semaine dans Excel, en donnant une date dans une feuille je voulais récupérer le numéro de la semaine, ayant compris qu'avec le systeme us je ne pouvais pas obtenir de chiffre juste, j'ai vu sur le site de Laurent Longre la formule suivante qui marche parfaitement(le système iso)

=ENT(MOD(ENT(($B7-2)/7)+0.6;52+5/28))+1

le problème est que je ne comprens rien à cette dernière, qu'est ce que c'est ce 0.6 etc... je désirerai que si l'un ou une d'entre vous me donne une réponse, ce serai parfait ! car insérer une formule que l'on ne comprends pas, un peu rude

Amitiés
gnimitz
 

Papou-net

XLDnaute Barbatruc
Re : no.semaine mode iso !

Bonsoir gnimitz,

Je pense que le 0.6 sert à arrondir à l'entier supérieur ?

Mais pourquoi n'utilises-tu pas la fonction No.semaine présente dans Excel ?

=NO.SEMAINE(A1;2)

Il faut toutefois, je crois, avoir installé l'utilitaire d'analyse.

Espérant t'avoir orienté.

Cordialement et bonnes fêtes.
 

gnimitz

XLDnaute Occasionnel
Re : no.semaine mode iso !

Hello,

Non non cela ne marche pas du tout, si tu mets 04 janvier 2010, elle va te dire que c'est la 2ème semaine, avec le système iso, normalement c'est vrai... , mais pour moi c'est la première semaine, donc il n'y a que la solution ci-dessous qui fonctionne.

Merci quand m^me de ta réponse
gnimitz
 

MJ13

XLDnaute Barbatruc
Re : no.semaine mode iso !

Bonjour gnimitz, Papou

Voir ce post:

https://www.excel-downloads.com/threads/xl2007-probleme-avec-no-semaine.130516/

Sinon, pour la formule, il y a un autre post très intéressant assez récent que je n'ai pas retrouvé (Quelqu'un devrait facilement remettre la main dessus).

C'est compliqué, mais c'est comme ça (il vaut mieux ne pas trop se perendre la tête avec cette formules sinon, tu auras mal au crâne 2 fois: 1 fois avec la compréhension de la formule et une autre avec les fêtes de fin d'années).
 

Roland_M

XLDnaute Barbatruc
Re : no.semaine mode iso !

bonjour à tous et bonne fêtes de fin d'année !

ci-joint un classeur avec toutes sortes de formules et code vb
assemblage du forum !
 

Pièces jointes

  • CalendrierNoSem FormFonct.zip
    28.1 KB · Affichages: 184
  • CalendrierNoSem FormFonct.zip
    28.1 KB · Affichages: 202
  • CalendrierNoSem FormFonct.zip
    28.1 KB · Affichages: 214

hoerwind

XLDnaute Barbatruc
Re : no.semaine mode iso !

Bonjour Roland_M,

Si je puis me permettre, deux petites remarques :

Je rencontre un bug sous la macro

La formule en D41 n'est pas exacte.
Sont bissextiles les années multiples de quatre, sauf les années centenaires qui ne sont pas multiples de quatre cents.
Ainsi 2000 était bissextile, mais 2100 ne le sera pas.
 

ROGER2327

XLDnaute Barbatruc
Re : no.semaine mode iso !

Bonjour à tous


A gnimitz : Il existe d'assez nombreuses discussions sur cette question (merci au passage à ceux qui ont la gentillesse de renvoyer à mes contributions sur la question). S'agissant de votre questionnement :
Bonsoir à tous

Je recherchais une formule pour me calculer mes numéros de semaine dans Excel, en donnant une date dans une feuille je voulais récupérer le numéro de la semaine, ayant compris qu'avec le systeme us je ne pouvais pas obtenir de chiffre juste, j'ai vu sur le site de Laurent Longre la formule suivante qui marche parfaitement(le système iso)

=ENT(MOD(ENT(($B7-2)/7)+0.6;52+5/28))+1

le problème est que je ne comprens rien à cette dernière, qu'est ce que c'est ce 0.6 etc... je désirerai que si l'un ou une d'entre vous me donne une réponse, ce serai parfait ! car insérer une formule que l'on ne comprends pas, un peu rude

Amitiés
gnimitz
Je suis comme vous, je ne me vois pas utiliser une formule ou un code que je ne comprends pas. Aussi vais-je tenter de justifier la formule que vous citez, autant que faire se peut.

Important : Pour commencer, oublions Excel un instant et raisonnons.

Supposons qu'on compte les jours depuis le lundi 1er janvier 1900, qu'on prend comme jour 1. Il est alors facile d'obtenir le nombre de semaines complètes écoulées du 1/1/1900 à une date D (ou au jour D) ; c'est
Code:
=ENT((D-1)/7)
Aujoud'hui mercredi 30/12/2009 (Saint Roger), D=40176.
Nous avons donc (D-1)/7=40175/7=5739+2/7.
Il s'est écoulé 5739 semaines complètes et deux jours complets depuis le 1/1/1900.
En prenant 1 pour numéro de la semaine du lundi 1/1/1900 au dimanche 7/1/1900, nous sommes dans la 5740[SUP]ième[/SUP] semaine, c'est à dire que le numéro de la semaine courante, à compter de la semaine 1 définie ci-dessus, est
Code:
=ENT((D-1)/7)+1
Ce qui nous intéresse n'est pas ce numéro mais celui de la semaine dans l'année en cours. Et c'est là que les problèmes commencent...

S'il y avait un nombre entier exact N de semaines dans une année, on aurait facilement la réponse, car le 1[SUP]er[/SUP] janvier serait toujours un lundi, et le numéro de la semaine dans l'année courante pour la date D serait
Code:
=MOD(ENT((D-1)/7);N)+1
Mais il n'en est rien car une année dure 52 semaines et 1 ou 2 jours. On va donc commencer à faire de "l'à peu près" en considérant un nombre moyen de semaines dans l'année : en gros (et même en très gros), il y a 365 jours et un quart dans l'année, soit 365,25/7 semaines, ou encore 52+5/28 semaines dans une année grossièrement moyenne.
On peut espérer qu'en prenant cette valeur pour N dans la formule précédente, on aura une bonne approximation du résultat souhaité. Évidemment, ce nombre N n'étant pas entier, la formule
Code:
=MOD(ENT((D-1)/7);52+5/28)+1
ne renverra généralement pas un entier, ce qui conduit à la modifier en ne prenant que l'arrondi entier ou la partie entière de son résultat.
Par exemple, quelque chose comme
Code:
=ENT(MOD(ENT((D-1)/7);52+5/28))+1
peut être une hypothèse de travail intéressante.

Ce qui est sûr, c'est que si cette formule nous donne satisfaction, ce ne sera que sur une période limitée car l'année moyenne ne dure pas 365,25 jours mais 365,2425 jours. Ce fait est suffisant pour être sûr que la formule ne sera qu'approximative.
On peut dire que cette formule est FAUSSE "de naissance".


Quoiqu'il en soit, regardons si elle peut au moins nous être utile pour une période limitée dans le temps.

Si on prend, par exemple, une date quelconque de l'année 2000, on a l'immense satisfaction de voir qu'elle donne le résultat attendu... ...à condition qu'on fasse le calcul à la main.

Revenons maintenant à Excel.

S'il nous vient l'idée de confier la formule à Excel, nous aurons la désagréable surprise de constater qu'elle est, contre toute logique, juste en semaine et fausse le dimanche !
En cherchant un peu, on s'aperçoit rapidement que le décompte des jours ne se fait pas nécessairement à partir du 1/1/1900 considéré comme jour 1. Les scientifiques qui ont conçu ce décompte ont décidé :
  1. On est les maîtres du monde : on fait ce qu'on veut.
  2. Le 1/1/1900 est le jour 1. (Ce fut un lundi, c'est pourquoi on l'appellera dimanche.)
  3. Le lendemain d'un jour J est le jour J+1 si J n'est pas le 28/2/1900 (qui fut un mercredi, mais qu'on appellera mardi).
  4. Le lendemain d'un jour J est le jour J+2 si J est le 28/2/1900. C'est pourquoi on nommera jeudi le premier mars 1900, bien qu'il fût en réalité un jeudi. Si !
  5. Circulez ! Y'a rien à voir !
Pour satisfaire à cette règle, il faut corriger la formule :
Code:
=ENT(MOD(ENT((D-2)/7);52+5/28))+1
Tout rentre dans l'ordre... ...pour les années 1904, 1905, 1909 à 1911 (trois ans de suite !), 1915, 1916, 1921, 1922, 1926, 1927, 1932, 1933, 1937 à 1940, 1943, 1944, 1949, 1950, 1954, 1955, 1960, 1961, 1965 à 1967, 1971, 1972, 1977, 1978, 1983, 1984, 1988, 1989, 1993 à 1995, 1999, 2000, 2005, 2006, 2010, 2011, 2016, 2017, 2021 à 2023, 2027, 2028, 2033, 2034, 2038, 2039, 2044, 2045, 2049 à 2051, 2055, 2056, 2061, 2062, 2066, 2067, 2072, 2073, 2077 à 2079, 2083, 2084, 2089, 2090, 2094, 2095, 2100, 2101, 2106, 2107, etc.

Pour les autres années, on trouve des décalages, qu'on peut essayer d'éliminer avec un terme correctif K :
Code:
=ENT(MOD(ENT((D-2)/7)+K;52+5/28))+1
Après quelques tâtonnements, on trouve que K=3/5 (ou 0,6) donne des résultats corrects du samedi 27/2/1900 au dimanche 28/12/2104 inclus. D'où la formule finale valable pour le XXéme et le XXIème siècle :
Code:
=ENT(MOD(ENT((D-2)/7)+3/5;52+5/28))+1
En pratique courante, on peut se satisfaire de ce résultat.

Pour obtenir quelque chose de plus universel, il faut absolument tenir compte du fait que le calendrier grégorien est périodique, de période 146_097 jours, soit exactement 20_871 semaines ou encore 400 ans. La formule
Code:
=ENT((D-SOMME(MOD(DATE(ANNEE(D-MOD(D-2;7)+3);1;2);{1E+99;7})*{1;-1})+5)/7)
tient compte de ces données et fournit correctement le numéro de semaine au XXIIème siècle et dans ceux qui suivront.

(Je doute qu'elle me soit utile un jour,
mais c'est une autre histoire.)

Son décorticage est plus compliqué mais vaut le détour : c'est très instructif, et je vous laisse le plaisir de la découverte.
Voilà.

Cordialement,


ROGER2327
#2491
 
Dernière édition:

haonv

XLDnaute Occasionnel
Re : no.semaine mode iso !

bonjour a tous ,

Une petite précision .
Avec la norme US (sur laquelle est basée excel) la semaine appartient à l'année qui a le dimanche.(Le premier jour de semaine est le dimanche avec cette norme)
Avec la norme Européenne (ISO ...) la semaine appartient a l'année qui à le jeudi.

Pour déterminer le jour de semaine avec "joursem", excel propose le "type de retour " qui correspond à la norme que l'on veut utiliser .
Norme européenne, la semaine commence le lundi;
Norme US, la semaine commence le dimanche.
Nous n'avons pas le choix pour déterminer le numéro de semaine.

Merci Roger pour le développement de cette formule et ....
bonne fête !

Amicalement
 

exene

XLDnaute Accro
Re : no.semaine mode iso !

Bonsoir le forum, Bonsoir le fil,

Bonsoir Roger,

J'ai lu nombreuses de vos contributions avec toujours le même intérêt mais celle-ci est aussi limpide que le sujet est complexe.

Merci encore et bonne soirée.
 

Discussions similaires

Réponses
0
Affichages
379

Statistiques des forums

Discussions
312 328
Messages
2 087 318
Membres
103 515
dernier inscrit
Cherbil12345