* après le N° Semaine ISO, l'année "Calendaire" ...*

David69400

XLDnaute Junior
Bonsoir le Forum,

Suite à échange avec Misange qui me conseille de poser la question sur le forum.

Pour avoir le numéro de semaine à la française, j'utilise donc la formule bien connue de Laurent :

PHP:
=ENT((A1-(DATE(ANNEE(A1-JOURSEM(A1-1)+4);1;3)-JOURSEM(DATE(ANNEE(A1-JOURSEM(A1-1)+4);1;3)))+5)/7)

en VBA, j'utilise NOSEM(Date) de Daniel Maher.
PHP:
Option Explicit

Public Function IsoWeekNum(d1 As Date) As Integer
' Provided by Daniel Maher.
   Dim d2 As Long
   d2 = DateSerial(Year(d1 - Weekday(d1 - 1) + 4), 1, 3)
   IsoWeekNum = Int((d1 - d2 + Weekday(d2) + 5) / 7)
End Function

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 + 1
End Function

Ma question :

Je voudrais retrouver l'année que j'appelle ''calendaire" correspondant à mon n° de semaine ISO :

ex pour le 30/12/2013 on est en semaine ISO 1 de l'année "calendaire" 2014 mais de l'année "civile" 2013
la fonction ANNEE(30/12/2013) me donne donc 2013

y'a t il une formule en excel ? en vba ? :confused:

merci pour votre aide ! :rolleyes:

David
 

ROGER2327

XLDnaute Barbatruc
Re : * après le N° Semaine ISO, l'année "Calendaire" ...*

Bonsoir David69400.


La fonction​
Code:
Function GRG2ISO(dGRG)
Dim a, b, g
  g = Array("", "", "")
  If IsDate(dGRG) Then
    If Int(dGRG) > 0 And Int(dGRG) <> 60 Then
      b = Int(dGRG) - (dGRG < 60) + 5
      a = DateSerial(Year(b - b Mod 7 - 2), 1, 1)
      g = Array(Year(a), (b - b Mod 7 - a + 5) \ 7, b Mod 7 + 1)
    End If
  End If
  GRG2ISO = g
End Function
prend une date grégorienne dGRG en mode calendrier 1900 et renvoie un vecteur-ligne à trois composantes qui sont l'année ISO (norme ISO 8601), le numéro de semaine et le rang du jour dans la semaine.

La fonction​
Code:
Function GRG2ISOtxt$(dGRG)
Dim a&, b&
  If IsDate(dGRG) Then
    If Int(dGRG) > 0 And Int(dGRG) <> 60 Then
      b = Int(dGRG) - (dGRG < 60) + 5
      a = DateSerial(Year(b - b Mod 7 - 2), 1, 1)
      GRG2ISOtxt = Year(a) & "-W" & Format((b - b Mod 7 - a + 5) \ 7, "00") & "-" & b Mod 7 + 1
    End If
  End If
End Function
prend une date grégorienne dGRG en mode calendrier 1900 et renvoie la date ISO sous forme d'une chaîne de caractères.

Exemple avec 22/09/2014 en A1 :
=GRG2ISO(A1) renvoie le vecteur (2014;39;1).
=GRG2ISOtxt(A1) renvoie 2014-W39-1

Voir le classeur joint qui contient aussi des solutions par formules Excel, et les fonctions réciproques pour retrouver la date grégorienne à partir de la date ISO. Ce classeur traîne déjà quelque part sur le site, mais je ne sais plus où.


Bonne nuit.


ℝOGER2327
#7574


Dimanche 15 Absolu 142 (Ethernité - fête Suprême Tierce)
1[SUP]er[/SUP] Vendémiaire An CCXXIII, 9,4299h - raisin
Bonne année !

2014-W39-1T22:37:54Z
 

Pièces jointes

  • Date_ISO.xlsm
    25.7 KB · Affichages: 52
  • Date_ISO.xlsm
    25.7 KB · Affichages: 61
  • Date_ISO.xlsm
    25.7 KB · Affichages: 62

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : * après le N° Semaine ISO, l'année "Calendaire" ...*

Bonsoir David69400,

Pas certain d'avoir tout compris. J'ai interprété comme ceci: "à partir d'une date, retrouver l'année correspondant au numéro ISO de la semaine de la date".

J'ai utilisé la formule suivante (avec la date en E2):
Code:
=ANNEE(E2+4-JOURSEM(E2;2))


Voir fichier joint. Choisir l'année à l'aide de la liste déroulante en cellule K1.


nota: comme vous utilisez une version d'Excel supérieure ou égale à 2010, j'ai utilisé la fonction native d'Excel =NO.SEMAINE(E2;21) pour retourner le numéro de semaine ISO.

edit: bonjour ℝOGER2327 :) ; suis un peu à la traine sur ce coup :eek:
 

Pièces jointes

  • David69400-Numéro de l'année de la semaine ISO v1.xlsx
    12.6 KB · Affichages: 42
Dernière édition:

Discussions similaires

Réponses
1
Affichages
1 K