Connaître le nombre de "semaines ISO" entières ou tronquées dans un mois

Magic_Doctor

XLDnaute Barbatruc
Rebonjour à tous,

Il y a essentiellement 5 semaines ISO 8601 différentes dans un mois, rarement 6 et exceptionnellement 4 s'il s'agit uniquement d'un mois de février de 28 jours dont le 1er jour est un lundi.

Il y a-t-il un moyen par formule ou fonction de savoir combien de "semaines ISO" entières (7 jours) et tronquées (< 7 jours) il y a dans un mois donné ?

Merci d'avance pour un tuyau.
 

job75

XLDnaute Barbatruc
Re : Connaître le nombre de "semaines ISO" entières ou tronquées dans un mois

Bonjour le fil, le forum, salut Magic Doctor et Roger,

Allez ce n'est pas fini, voici une autre manière de faire, je reprends tout à zéro :cool:

- Donc, avec la date en A2, dates du 1er et dernier jour du mois en cours :

Code:
=DATE(ANNEE(A2);MOIS(A2);1)
=DATE(ANNEE(A2);MOIS(A2)+1;0)

- Date du dernier lundi du mois précédent :

Code:
=DATE(ANNEE(A2);MOIS(A2);1)-JOURSEM(DATE(ANNEE(A2);MOIS(A2);1)-2)

- Pour Maxence, numéro de semaine (dans le mois) de la date A2 :

Code:
=ENT((A2-DATE(ANNEE(A2);MOIS(A2);1)+JOURSEM(DATE(ANNEE(A2);MOIS(A2);1)-2))/7)+(JOURSEM(DATE(ANNEE(A2);MOIS(A2);1))<>2)

- Nombre total de semaines du mois, complètes ou partielles (c'est le numéro de semaine du dernier jour du mois) :

Code:
=ENT((DATE(ANNEE(A2);MOIS(A2)+1;0)-DATE(ANNEE(A2);MOIS(A2);1)+JOURSEM(DATE(ANNEE(A2);MOIS(A2);1)-2))/7)+(JOURSEM(DATE(ANNEE(A2);MOIS(A2);1))<>2)

- Date du 1er lundi du mois en cours :

Code:
=DATE(ANNEE(A2);MOIS(A2);1)-JOURSEM(DATE(ANNEE(A2);MOIS(A2);1)-2)+7

- Date du dernier dimanche du mois en cours :

Code:
=DATE(ANNEE(A2);MOIS(A2)+1;1)-JOURSEM(DATE(ANNEE(A2);MOIS(A2)+1;1)-1)

- Nombre de semaines complètes du mois en cours :

Code:
=(DATE(ANNEE(A2);MOIS(A2)+1;1)-JOURSEM(DATE(ANNEE(A2);MOIS(A2)+1;1)-1)-DATE(ANNEE(A2);MOIS(A2);1)+JOURSEM(DATE(ANNEE(A2);MOIS(A2);1)-2)-6)/7

- Nombre de semaines partielles du mois en cours :

Code:
=(JOURSEM(DATE(ANNEE(A2);MOIS(A2);1))<>2)+(JOURSEM(DATE(ANNEE(A2);MOIS(A2)+1;0))>1)

Un grand merci à Maxence qui nous a permis de revoir cette discussion.

Edition : je joins le fichier, c'est plus clair.

A+
 

Pièces jointes

  • N° de semaine et dates.xls
    27 KB · Affichages: 161
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Connaître le nombre de "semaines ISO" entières ou tronquées dans un mois

Bonjour Job75, le forum,

Puisque dans son exemple Job donne des formules pour connaître la date du dernier dimanche ou celle du premier lundi d'un mois donné, j'en profite pour glisser cette fonction extrêmement pratique que nous devons essentiellement à Roger et qui permet d'obtenir n'importe quelle date avant ou après un jour donné de la semaine. Cette fonction, pour moi, fait partie de ce que l'on pourrait appeler les perles.
Je pense que le maniement de ladite fonction est bien expliqué dans sa spécification.

Code:
Function DateJourSemaine(Année As Integer, mois As Byte, JourSemaine As Byte, Optional RangJourSemaine As Integer = 0, Optional DébutDuMois As Byte = 1) As Date
'Révision : ROGER2327 - 5 (Coq) Germinal CCXVII
'Modification : Magic_Doctor - 14 (Hêtre) Germinal CCXVII

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Année = année de la recherche
'Mois : janvier = 1 ---> décembre = 12
'JourSemaine : lundi = 1 ---> dimanche = 7
'RangJourSemaine = place du jour de la semaine dans le mois (ou au-delà)
'Si RangJourSemaine >= 1 ---> date d'un jour donné un certain nombre de semaines après le début choisi du mois choisi
'Si RangJourSemaine <= -1 ---> date d'un jour donné un certain nombre de semaines avant le début choisi du mois choisi
'Si RangJourSemaine = 0 on obtiendra alors (quel que soit DébutDuMois) la date où le jour de
'la semaine recherché apparaît pour la dernière fois dans le mois choisi.
'En conséquence, si RangJourSemaine <> 0, on obtiendra la date où le jour de la semaine
'recherché apparaît à la "RangJourSemaine"ème position à partir du début de mois choisi.
'Par exemple : 18ème Jeudi à partir du 1er Mars 2005 = "30/06/2005"
'              18ème Jeudi à partir du 28 Mars 2005 = "28/07/2005"
'              -20ème Jeudi avant le 28 Mars 2005 = "11/11/2004"
'DébutDuMois = 1er jour du mois à partir duquel s'effectue la recherche (appartient à l'intervalle [1er du mois , dernier du mois])
'Optionnel : si omis fixe par défaut DébutDuMois au 1er du mois.
'Si > 0 effectue la recherche à partir du jour correspondant à DébutDuMois (ce jour étant inclu dans la recherche).
'Si < 0 effectue la recherche avant le jour correspondant à DébutDuMois (ce jour étant exclu de la recherche).
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Dim NbJoursDansMois As Byte
Dim DateCherchée, DerDuMois

    NbJoursDansMois = Day(DateSerial(Année, mois + 1, 0))
    If DébutDuMois > NbJoursDansMois Then DébutDuMois = NbJoursDansMois

    DerDuMois = DateSerial(Année, mois + 1, 1) - 1 - (Weekday(DateSerial(Année, mois + 1, 1) - JourSemaine, vbMonday) - 1) Mod 7
    
    If DébutDuMois > Day(DerDuMois) Then
        DateCherchée = DateSerial(Année, mois, DébutDuMois) + 7 * IIf(RangJourSemaine < 0, RangJourSemaine + 1, RangJourSemaine) + Day(DerDuMois) - DébutDuMois
    Else
        DateCherchée = DerDuMois + 7 * (IIf(RangJourSemaine < 0, RangJourSemaine + 1, RangJourSemaine) - 1 - (Day(DerDuMois) - DébutDuMois) \ 7)
    End If
    
    If RangJourSemaine = 0 Then DateCherchée = DerDuMois

    DateJourSemaine = DateCherchée
End Function

J'en profite pour remercier Brigitte qui avait eu la gentillesse de m'expliquer comment m'y prendre pour que mes messages soient + bô !

Bonne journée à tous.
 

piga25

XLDnaute Barbatruc
Re : Connaître le nombre de "semaines ISO" entières ou tronquées dans un mois

bonjour à tous,

J'ai trouvé cela sur le site X-Cell : Ce lien n'existe plus

Nombre et numéro de semaine
- Numéro de semaine ISO
La formule suivante renvoie le numéro de semaine conforme à la norme ISO, utilisée dans les pays européens (la première semaine d'un mois étant définie comme la première semaine comportant au moins quatre jours dans le mois).
ATTENTION, si l'on veut calculer des numéros de semaines ISO, ceux en particulier du calendrier français, il ne faut pas utiliser la fonction NO.SEMAINE proposée par l'Utilitaire d'analyse. Celle-ci renvoie un numéro de semaine calculé d'après la méthode utilisée aux Etats-Unis, qui n'est pas conforme à la définition ISO utilisée en France. Pour obtenir un numéro conforme à cette norme, on peut utiliser la formule suivante :
=ENT((D-SOMME(MOD(DATE(ANNEE(D-MOD(D-2;7)+3);1;2);{1E+99;7})*{1;-1})+5)/7)
Fonction VBA équivalente Function NOSEM(D As Date) As Long D = Int(D) NOSEM = DateSerial(Year(D + (8 - WeekDay(D)) Mod 7 - 3), 1, 1) NOSEM = ((D - NOSEM - 3 + (WeekDay(NOSEM) + 1) Mod 7)) \ 7 + 1End Function
- Nombre de semaines ISO dans le mois
=52+ET(JOURSEM(DATE(A;{2;8};))>5) (ajouté par D.M.)
- Nombre de semaines dans le mois
La formule suivante renvoie le nombre de semaines complètes ou partielles dans le mois (c'est-à-dire dont au moins un jour est compris dans le mois) :
=ENT((37+JOURSEM(A3-JOUR(A3))-JOUR(A3-JOUR(A3)+32))/7) (ajouté par D.M.)
Fonction VBA équivalente :Function NBSEMS5(UneDate As Date) As Long Dim JrZero As Date JrZero = UneDate - Day(UneDate) ' Jour précédant le 1er jour du mois NBSEMS5 = Int((37 + Weekday(JrZero) - Day(JrZero + 32)) / 7)End Function

Remplacer ;) par ; et )
 

Bigfish

XLDnaute Occasionnel
Re : Connaître le nombre de "semaines ISO" entières ou tronquées dans un mois

Bonjour à tous,

aller j'y vais de ma petite contribution aussi sur ce sujet.

le fichier contient en plus de la reponse à la question de Magic Doctor, une fonction qui renvois la semaine courante.

A+
 

Pièces jointes

  • Classeur2.xls
    31.5 KB · Affichages: 107
  • Classeur2.xls
    31.5 KB · Affichages: 124
  • Classeur2.xls
    31.5 KB · Affichages: 120
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Connaître le nombre de "semaines ISO" entières ou tronquées dans un mois

Bonsoir à tous
S'il s'agit de respecter la norme internationale ISO, il me semble que la fonction personnalisée CurrentWeek de Bigfish ne peut pas convenir. Je l'ai modifiée pour traiter une date donnée en l'écrivant
Code:
[COLOR="DarkSlateGray"]Function CurW(d As Date) As Long
    CurW = DatePart("WW", d, vbSunday, vbFirstJan1)
End Function[/COLOR]
et j'ai comparé les résultats avec ceux obtenus en respectant la norme internationale dans le classeur joint. On y constate de nombreuses discordances.
Les choses s'arrangent notablement avec la fonction
Code:
[COLOR="DarkSlateGray"]Function CurW2(d As Date) As Long
    CurW2 = DatePart("WW", d, [COLOR="Purple"]vbMonday[/COLOR], [COLOR="Purple"]vbFirstFourDays[/COLOR])
End Function[/COLOR]
mais il reste encore des discordances (29/12/2003, 31/12/2007, 30/12/2019 par exemple).
A vérifier !​
ROGER2327
 

Pièces jointes

  • Bigfish_ISO.zip
    11.5 KB · Affichages: 77

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 611
Messages
2 090 226
Membres
104 453
dernier inscrit
benjiii88