Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RETROUVER LE NUMERO DE LA SEMAINE D'UNE DATE DONNÉE


Information sur la source

Catégorie :Date & Heure Classé sous : numéro, semaine, calendrier, date, datetime Niveau : Débutant Date de création : 03/12/2002 Date de mise à jour : 03/12/2002 20:53:51 Vu : 24 450

Note :
6,33 / 10 - par 3 personnes
6,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note


Description

->NumeroSemaine est la function qui renvoie le numero de la semaine d'une date donnée
a part ca :
JJ fonction renvoie la date julienne a partir d'une date donnée
JourSemaine renvoie le jour de la semaine pour une date donnée (0 = Dimanche,1 = Lundi...)
JourAnnée renvoie le numero du jour donnée dans l'année (1 = 01/01)
 

Source

  • Option Explicit
  • Private Function JJ(Dates As Date)
  • Dim y As Long, m As Long, DDdd As Double
  • Dim YYYY As Long, MM As Long
  • Dim a As Double, b As Double
  • YYYY = Year(Dates)
  • MM = Month(Dates)
  • DDdd = Day(Dates) + Hour(Dates) / 24 + Minute(Dates) / 24 / 60 + Second(Dates) / 24 / 60 / 60
  • If MM <= 2 Then y = YYYY - 1: m = MM + 12 Else y = YYYY: m = MM
  • If Dates >= 1582.1015 Then
  • a = y \ 100
  • b = 2 - a + a \ 4
  • End If
  • If y = Abs(y) Then
  • JJ = Int(365.25 * y) + Int(30.6001 * (m + 1)) + DDdd + 1720994.5 + b
  • Else
  • JJ = Int(365.25 * y) + Int(30.6001 * (m + 1)) + DDdd + 1720994.5
  • End If
  • End Function
  • Private Function JourSemaine(Dat As Date) As Long
  • Dim a As Double
  • a = JJ(Dat) + 1.5
  • a = a Mod 7
  • JourSemaine = a
  • End Function
  • Private Function JourAnnée(Dat As Date) As Integer
  • Dim I As Integer
  • I = Year(Dat)
  • If (I Mod 400 = 0) Or ((I Mod 100 <> 0) And (I Mod 4 = 0)) Then
  • JourAnnée = Int((275 * Month(Dat)) / 9) - Int((Month(Dat) + 9) / 12) + Day(Dat) - 30
  • Else
  • JourAnnée = Int((275 * Month(Dat)) / 9) - (2 * Int((Month(Dat) + 9) / 12)) + Day(Dat) - 30
  • End If
  • End Function
  • Public Function NumeroSemaine(Dates As Date) As Byte
  • Dim NbJour1ereSemaine As Byte, JourJulienDates As Double, JourJulien1Janvier
  • Dim JourSemaine1Janvier As Byte, JourAnneeDates As Integer
  • JourJulienDates = JJ(Dates)
  • JourJulien1Janvier = JJ(DateSerial(Year(Dates), 1, 1))
  • JourSemaine1Janvier = JourSemaine(DateSerial(Year(Dates), 1, 1) + TimeSerial(0, 0, 0))
  • If JourSemaine1Janvier = 0 Then
  • NbJour1ereSemaine = 1
  • Else
  • NbJour1ereSemaine = -(JourSemaine1Janvier - 8)
  • End If
  • NumeroSemaine = Int((JourAnnée(Dates) - 1 - NbJour1ereSemaine) / 7) + 2
  • If NumeroSemaine > 52 Then NumeroSemaine = NumeroSemaine - 52
  • End Function
Option Explicit

Private Function JJ(Dates As Date)
Dim y As Long, m As Long, DDdd As Double
Dim YYYY As Long, MM As Long
Dim a As Double, b As Double

YYYY = Year(Dates)
MM = Month(Dates)
DDdd = Day(Dates) + Hour(Dates) / 24 + Minute(Dates) / 24 / 60 + Second(Dates) / 24 / 60 / 60

If MM <= 2 Then y = YYYY - 1: m = MM + 12 Else y = YYYY: m = MM
If Dates >= 1582.1015 Then
a = y \ 100
b = 2 - a + a \ 4
End If

If y = Abs(y) Then
JJ = Int(365.25 * y) + Int(30.6001 * (m + 1)) + DDdd + 1720994.5 + b
Else
JJ = Int(365.25 * y) + Int(30.6001 * (m + 1)) + DDdd + 1720994.5
End If
End Function

Private Function JourSemaine(Dat As Date) As Long
Dim a As Double
a = JJ(Dat) + 1.5
a = a Mod 7
JourSemaine = a
End Function

Private Function JourAnnée(Dat As Date) As Integer
Dim I As Integer
I = Year(Dat)
If (I Mod 400 = 0) Or ((I Mod 100 <> 0) And (I Mod 4 = 0)) Then
JourAnnée = Int((275 * Month(Dat)) / 9) - Int((Month(Dat) + 9) / 12) + Day(Dat) - 30
Else
JourAnnée = Int((275 * Month(Dat)) / 9) - (2 * Int((Month(Dat) + 9) / 12)) + Day(Dat) - 30
End If
End Function

Public Function NumeroSemaine(Dates As Date) As Byte
Dim NbJour1ereSemaine As Byte, JourJulienDates As Double, JourJulien1Janvier
Dim JourSemaine1Janvier As Byte, JourAnneeDates As Integer

JourJulienDates = JJ(Dates)
JourJulien1Janvier = JJ(DateSerial(Year(Dates), 1, 1))
JourSemaine1Janvier = JourSemaine(DateSerial(Year(Dates), 1, 1) + TimeSerial(0, 0, 0))

If JourSemaine1Janvier = 0 Then
NbJour1ereSemaine = 1
Else
NbJour1ereSemaine = -(JourSemaine1Janvier - 8)
End If

NumeroSemaine = Int((JourAnnée(Dates) - 1 - NbJour1ereSemaine) / 7) + 2
If NumeroSemaine > 52 Then NumeroSemaine = NumeroSemaine - 52
End Function

Conclusion

alors on met ca dans un module, on appelle NumeroSemaine ou on veut dans le code
et pis si on sait pas faire un copier-coller ben faut arreter l'informatique ;)) lol
 

Commentaires et avis

signaler à un administrateur
Commentaire de ShareVB le 03/12/2002 21:25:28

bon je sais vous allez me dire "Y A PLUS SIMPLE" et la je vous répondrais que je suis d'accord :
mais au moins mon code a le mérite d'expliquer comment on peut calculer sans les fonctions de VB (a part dateserial et timeserial)

ShareVB

signaler à un administrateur
Commentaire de Ricks27 le 04/12/2002 09:14:26

Y'a bcp + simple. Utilises la fonction "Format" de vb!!

Function TrouverNuméroSemaine(ByVal Dte As Date) As Integer
          TrouverNuméroSemaine = Format(Dte, "ww", vbSaturday, vbFirstFullWeek)
          If TrouverNuméroSemaine &gt; 52 Then
                    If Format(Dte + 7, "ww", vbMonday, vbFirstFullWeek) = 2 Then
                              TrouverNuméroSemaine = 1
                    End If
          End If
End Function

signaler à un administrateur
Commentaire de Spylover le 07/12/2002 18:04:11

Ricks27,

Je ne dirais qu'une chose bravo.

signaler à un administrateur
Commentaire de Spylover le 07/12/2002 18:04:35

Ricks27,

Je ne dirais qu'une chose bravo.

signaler à un administrateur
Commentaire de ShareVB le 07/12/2002 18:14:29

bon d'accord format est bien mais mon code c plutot pour du calcul astronomique. JJ qui donne la date julienne ca peut quand meme servir

ShareVB

signaler à un administrateur
Commentaire de KEdd le 10/01/2003 13:38:05

Bravo Ricks27 mais si ShareVB dit que ça peut servir je le croit parce que je ne sait pas ce qu'est la date julienne...

signaler à un administrateur
Commentaire de spy_EIT le 16/07/2004 15:33:10

signaler à un administrateur
Commentaire de spy_EIT le 16/07/2004 15:37:11


Merci Ricks27, exactement ce qu'il me fallait !

Par contre, j'ai supprimé l'argument vbFirstFullWeek, car il me semble que les premiers jours de l'année sont considérés comme Semaine1... en tout cas, sans cet argument, la function retourne le bon numéro de semaine, comme dans les calendriers !

signaler à un administrateur
Commentaire de vialstephane le 07/09/2004 16:11:12

salut,

y'as des trucs qui ne marchent pas dans ta formule.

Je l'ai donc corrigée, j'espere que tu m'en voudras pas trop !

@+


Public Function TrouverNuméroSemaine(ByVal Dte As Date) As Integer

TrouverNuméroSemaine = Format(Dte - 2, "ww", vbSaturday)
         If TrouverNuméroSemaine > 52 Then
                    If Format(Dte + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then
                            TrouverNuméroSemaine = 1
                   End If
         End If

End Function

signaler à un administrateur
Commentaire de Morricon le 26/05/2005 14:45:13

Est-ce normal que la date du 26-05-2005 renvoie comme n° semaine : 22 (alors qu'il s'agit de la semaine 21 !) ?


signaler à un administrateur
Commentaire de euskual2003 le 09/04/2007 02:58:45

C'est quoi un copier coller ?

hi hi hi

signaler à un administrateur
Commentaire de MEDIQUAL le 22/02/2008 14:47:36

Je débute de chez débute en informatique (Développement, Visual Basic)

J'ai une colonne de dates sous la forme jj/mm/aaaa et je veux que dans une autre colonne pour chaque ligne la date de la première colonne soit transformée en numéro de semaine.

Pouvez-vous m'expliquer comment faire comme si j'avais 5 ans !!
Merci

signaler à un administrateur
Commentaire de vialstephane le 22/02/2008 15:53:14

Salut,
C'est assez simple.

Tu met la fonction suivante dans un module et tu l'appelles n'importe ou dans ton programme par
TrouverNuméroSemaine("22/02/2008")
C'est un exemple pour aujourd'hui.



Public Function (ByVal Dte As Date) As Integer

TrouverNuméroSemaine = Format(Dte - 2, "ww", vbSaturday)
         If TrouverNuméroSemaine > 52 Then
                    If Format(Dte + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then
                            TrouverNuméroSemaine = 1
                   End If
         End If

End Function

signaler à un administrateur
Commentaire de Wlad69 le 09/07/2008 11:43:47

Salut,
Je ne comprends pas pourquoi un simple :

Public Function TrouverNuméroSemaine(ByVal Dte As Date) As Integer
      TrouverNuméroSemaine=Format(Dte, "ww", vbMonday, vbFirstFourDays)
End Function

Ne suffirait pas ?!
Pouvez-vous m'expliquer à quoi sert le
TrouverNuméroSemaine = Format(Dte - 2, "ww", vbSaturday)

Merci

signaler à un administrateur
Commentaire de mechantebestiole le 15/09/2008 10:21:11

On ne peut pas écrire simplement :
TrouverNuméroSemaine = Format(Dte - 2, "ww", vbSaturday)

car il y a une règle concernant la 53ème semaine de l'année.

Il faut déjà commencer par la semaine No 1. Si la première semaine de l'année est incomplète (1er janv. différent de lundi), on la numérote 1 si et seulement si elle a au moins 4 jours.

A partir de cette règle, si les 1er jours de l'année sont semaine 1 et que cette semaineest à cheval sur décembre et janvier, au mois de décembre on numérote ces jours semaine 1. A l'inverse si les premiers jours ne sont pas semaine 1, on les numérotes 53.
Remarque certains préfère numéroté dans le dernier cas 0.

Exemple :
31 décembre 2009 : sem 53
1 janvier 2010 : sem 53 ou 0

31 décembre 2008 : sem 1
1 janvier 2009 : sem 1

signaler à un administrateur
Commentaire de mechantebestiole le 15/09/2008 10:47:49

Je complète mon commentaire précédent,
Je pense que l'on peut avoir le numéro de semaine en 1 ligne :

Format("01/01/2009", "ww", vbmonday,vbFirstFourDays)

Visiblement les résultats retournés sont bons.

signaler à un administrateur
Commentaire de Le Docteur le 05/01/2009 15:49:36

Bonjour,

Ce serait en effet la solution la plus simple... sauf qu'il y a un bug dans VB6 :
Au lundi de la première semaine de certaines années, la fonction Format retourne un mauvais n° de semaine :
  lundi 29/12/2003 --> semaine 53 au lieu de semaine 1
  lundi 31/12/2007 --> semaine 53 au lieu de semaine 1
  ... j'ai pas testé plus loin !
A priori, ce bug (découvert en 2001) ne semble pas se manifester pour une autre semaine que la semaine 53 et un autre jour que le lundi.

signaler à un administrateur
Commentaire de KaFarD le 13/01/2009 22:48:32

Chalut, juste pour completer les postes ;)
http://support.microsoft.com/kb/200299/fr

a+++

signaler à un administrateur
Commentaire de grarestephane le 01/05/2009 16:21:10 1/10

Trève de bavarderie, voilà la réponse, une seule ligne, avec mon msgbox la réponse est direct...

msgbox DateDiff("w",DateSerial(Year(Date),1,1),Date)

Merci d'avoir joué !

signaler à un administrateur
Commentaire de Le Docteur le 11/05/2009 14:45:32

"msgbox DateDiff("w",DateSerial(Year(Date),1,1),Date)"

C'était séduisant, mais...
1 - l'argument pour la semaine est "ww"
2 - il faut utiliser les arguments "firstdayofweek" et "Firstweekofyear"
ce qui donnerait :
DateDiff("ww",DateSerial(Year(Date),1,1),Date,2,2)

Mais malgré ça je n'obtiens jamais la bonne semaine.

pour aujourd'hui, 11/05/2009, j'obtiens la semaine 19 alors que nous sommes en semaine 20 !



signaler à un administrateur
Commentaire de grarestephane le 12/05/2009 18:04:33

Pas grave ajoute 1, le tour est joué

signaler à un administrateur
Commentaire de Le Docteur le 13/05/2009 17:57:46

D'accord, sauf que le bug existe toujours avec les
lundi 29/12/2003 et lundi 31/12/2007 (renvoit semaine 53 au lieu de semaine 1)

signaler à un administrateur
Commentaire de KaFarD le 15/05/2009 13:54:07

Solution LIGHT: ( une fonction )

Function WOY (MyDate As Date) As Integer   ' Week Of Year
  WOY = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
  If WOY > 52 Then
    If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then WOY = 1
  End If
End Function

Utilisation:
Mon_numéro_de_semaine = WOY(ma_date)

A+++

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

date et calendrier [ par guigui ] existe-t-il une fonction qui à partir d'une date retourne le 1er jour de la semaine concernee et le dernier jour de cette semaine?sinon j'aimerais de Calendrier [ par machto ] Bonjour. Je veux utiliser (pour la 1° fois) ce composant pour sélectionner une date.Quelqu'un peut-il me dire où récupérer la date cliquée et (éve Urgent Recherche calendrier avec le numéro de la semaine [ par jamaica ] Salut, Je recherche une source de calendrier qui pourrait me calculer le N° de Semaine en tenant compte qu'ils y a des année de 53 semaines comme 2004 Retrouver une date à partir d'un numéro de semaine [ par CyberCorp ] Est-il possible de retrouver la date du premier jour d'une semaine en entrant uniquement le numéro de la semaine (et l'année bien sur).Je n'ai trouvé VB numéro de semaine jour et date [ par gothar12 ] Bonjourje dispose de 2 combobox et d'un champ textLa 1ere combobox correspond au numéro de semaine de l'année (donc de 1 a 52) et la 2eme correspond a Calendrier-date en gras [ par goofy584 ] Salut,je voudrais prendre une valeur d'une listbox et afficher le date en gras dans le calendrier.j'essaie de fabriquer qqchose comme***************** NO.SEMAINE [ par fzoul ] Excel fournit une fonction, via une macro compl&#233;mentaire, qui permet de "calculer" le num&#233;ro de semaine d'une date donn&#233;e, fonction qui Probleme de date [ par vevel ] Bonjour,J'ai encore un probleme avec les dates. Je voudrais savoir les codes pour qu'a partir d'une valeur au format "ww-yyyy" representant une semain Planning d'effectifs [ par u473 ] Je dois distribuer sur un calendrier journalier, un devis de40 hommesjours, utilisant un effectif journalier de 4 hommes, sur une semaine de 6 jours.L DateTime.Compare [ par teamtiti ] Salut ,donc voila dans mon programme j'additionne la date du jour et un nombre de jours (90) que je renseigne dans un texbox et que je doit mettre dan


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.