begin process at 2012 02 12 11:54:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VBA

 > NUMÉRO DE LA SEMAINE : SANS LES BUGS DE LA SEMAINE 53 ET DU 29/12 (TESTÉ ET VÉRIFIÉ)

NUMÉRO DE LA SEMAINE : SANS LES BUGS DE LA SEMAINE 53 ET DU 29/12 (TESTÉ ET VÉRIFIÉ)


 Information sur la source

Note :
Aucune note
Catégorie :VBA Niveau :Initié Date de création :03/08/2004 Date de mise à jour :05/08/2004 15:17:27 Vu :12 606

Auteur : Chris_LaFouine

Ecrire un message privé
Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

 Description

Il y a un ensemble de fonction dont 2 que j'ai eu sur ce site mais je les ai un peu remaniées pour qu'elles soient plus compréhensibles. Mais j'ai entièrement créé la fonction principale nommée : "NumeroSemaine".

S'en servir est très facile, il suffit de mettre la date en argument de la fonction pour avoir le numéro EXACT de la semaine! En effet, la majorité des codes que j'ai trouvé avaient juste un bug ou deux. Celui que je propose n'a pas les bugs de la semaine 53 et du 29 décembre (si vous en trouvez un... prévenez-moi!

Finalement, c'est plus une mise à jour de fonctions déjà existantes que d'une nouvelle fonction!!!

Source

  • Option Explicit
  • Public Function NumeroSemaine(dateSemaine As Date) As Integer
  • 'Réalisé par Alexsimps en VBA
  • Dim Jour As Date
  • Dim NumJour As Integer
  • Dim DernierJourSemaine As Date
  • Dim NbJour As Integer
  • Dim nbpremier As Integer
  • 'Correspond au 1 er janvier de l'année de la date donnée
  • Jour = DateSerial(Year(dateSemaine), 1, 1)
  • 'Correspond au jour dans la semaine (1 = lundi, 2 = mardi, 3 = mercredi, 4 = jeudi, etc ...)
  • NumJour = JourSemaine(Jour)
  • 'Correspond au dernier jour de la semaine du 1er janvier
  • DernierJourSemaine = DateSerial(Year(dateSemaine), 1, 8 - NumJour)
  • 'Si le 1er janvier est après le vendredi, la semaine du 1 er janvier n'est pas comptabilisée dans la nouvelle année
  • If NumJour > 5 Then
  • NumeroSemaine = 0
  • Else
  • 'sinon elle l'est
  • NumeroSemaine = 1
  • End If
  • 'Différence entre la date et le jour de la fin de semaine du 1er janvier
  • NbJour = dateSemaine - DernierJourSemaine
  • 'Ensuite, on calcule le numéro de la semaine
  • 'Si le calcul tombe juste, on met le résultat
  • If NbJour Mod 7 = 0 Then
  • NumeroSemaine = (NbJour / 7) + NumeroSemaine
  • Else
  • 'Sinon, on, rajoute un car il y a une semaine en cours
  • NumeroSemaine = NumeroSemaine + Int(NbJour / 7) + 1
  • End If
  • 'Si le numéro est égal à 53, on vérifie où se trouve le 1er janvier
  • If NumeroSemaine = 53 Then
  • nbpremier = JourSemaine(DateSerial(Year(dateSemaine) + 1, 1, 1))
  • 'Si le 1er tombe avant le vendredi, le numéro de la semaine est le numéro 1
  • If nbpremier < 5 Then
  • NumeroSemaine = 1
  • End If
  • 'sinon, le numéro est le 53
  • End If
  • 'Le numéro de la semaine peut être egale à 0 (01/01/2005)
  • 'car il ne detécte pasla semaine 53
  • 'On cherche alors le numéro de la semaine du 31/12 de l'année d'avant
  • If NumeroSemaine = 0 Then
  • 'Sauf si le 01/01 est le lundi
  • If nbpremier = 1 Then
  • NumeroSemaine = 1
  • Else
  • NumeroSemaine = NumeroSemaine(DateSerial(Year(dateSemaine) - 1, 12, 31))
  • End If
  • End If
  • End Function
  • Private Function NumeroJourJulien(dateATraiter As Date)
  • 'Récupéré sur vbFrance.com
  • 'J'ai uniquement renommé quelques variables
  • 'Par Alexsimps
  • Dim y As Long
  • Dim m As Long
  • Dim DDdd As Double
  • Dim Annee As Long
  • Dim Mois As Long
  • Dim a As Double
  • Dim b As Double
  • Annee = Year(dateATraiter)
  • Mois = Month(dateATraiter)
  • DDdd = Day(dateATraiter) + Hour(dateATraiter) / 24 + Minute(dateATraiter) / 24 / 60 + Second(dateATraiter) / 24 / 60 / 60
  • If Mois <= 2 Then y = Annee - 1: m = Mois + 12 Else y = Annee: m = Mois
  • If dateATraiter >= 1582.1015 Then
  • a = y \ 100
  • b = 2 - a + a \ 4
  • End If
  • If y = Abs(y) Then
  • NumeroJourJulien = Int(365.25 * y) + Int(30.6001 * (m + 1)) + DDdd + 1720994.5 + b
  • Else
  • NumeroJourJulien = Int(365.25 * y) + Int(30.6001 * (m + 1)) + DDdd + 1720994.5
  • End If
  • End Function
  • Private Function JourSemaine(LaDate As Date) As Integer
  • 'Récupéré sur vbfrance.com
  • 'Quelques modifications quand même...
  • 'Par Alexsimps
  • Dim res As Double
  • res = NumeroJourJulien(LaDate) + 1.5
  • res = res Mod 7
  • JourSemaine = CInt(res)
  • End Function
Option Explicit

Public Function NumeroSemaine(dateSemaine As Date) As Integer
'Réalisé par Alexsimps en VBA

Dim Jour As Date
Dim NumJour As Integer
Dim DernierJourSemaine As Date
Dim NbJour As Integer
Dim nbpremier As Integer

    'Correspond au 1 er janvier de l'année de la date donnée
    Jour = DateSerial(Year(dateSemaine), 1, 1)
    
    'Correspond au jour dans la semaine (1 = lundi, 2 = mardi, 3 = mercredi, 4 = jeudi, etc ...)
    NumJour = JourSemaine(Jour)
    
    'Correspond au dernier jour de la semaine du 1er janvier
    DernierJourSemaine = DateSerial(Year(dateSemaine), 1, 8 - NumJour)
    
    'Si le 1er janvier est après le vendredi, la semaine du 1 er janvier n'est pas comptabilisée dans la nouvelle année
    If NumJour > 5 Then
        NumeroSemaine = 0
    Else
    'sinon elle l'est
        NumeroSemaine = 1
    End If
    
    'Différence entre la date et le jour de la fin de semaine du 1er janvier
    NbJour = dateSemaine - DernierJourSemaine

    'Ensuite, on calcule le numéro de la semaine
    'Si le calcul tombe juste, on met le résultat
    If NbJour Mod 7 = 0 Then
        NumeroSemaine = (NbJour / 7) + NumeroSemaine
    Else
    'Sinon, on, rajoute un car il y a une semaine en cours
        NumeroSemaine = NumeroSemaine + Int(NbJour / 7) + 1
    End If
    
    'Si le numéro est égal à 53, on vérifie où se trouve le 1er janvier
    If NumeroSemaine = 53 Then
        nbpremier = JourSemaine(DateSerial(Year(dateSemaine) + 1, 1, 1))
        
        'Si le 1er tombe avant le vendredi, le numéro de la semaine est le numéro 1
        If nbpremier < 5 Then
            NumeroSemaine = 1
        End If
        'sinon, le numéro est le 53
    End If
    
    'Le numéro de la semaine peut être egale à 0 (01/01/2005)
    'car il ne detécte pasla semaine 53
    'On cherche alors le numéro de la semaine du 31/12 de l'année d'avant
    If NumeroSemaine = 0 Then
        'Sauf si le 01/01 est le lundi
        If nbpremier = 1 Then
            NumeroSemaine = 1
        Else
            NumeroSemaine = NumeroSemaine(DateSerial(Year(dateSemaine) - 1, 12, 31))
        End If
    End If
End Function

Private Function NumeroJourJulien(dateATraiter As Date)
'Récupéré sur vbFrance.com
'J'ai uniquement renommé quelques variables
'Par Alexsimps
Dim y As Long
Dim m As Long
Dim DDdd As Double
Dim Annee As Long
Dim Mois As Long
Dim a As Double
Dim b As Double

Annee = Year(dateATraiter)
Mois = Month(dateATraiter)
DDdd = Day(dateATraiter) + Hour(dateATraiter) / 24 + Minute(dateATraiter) / 24 / 60 + Second(dateATraiter) / 24 / 60 / 60

If Mois <= 2 Then y = Annee - 1: m = Mois + 12 Else y = Annee: m = Mois

If dateATraiter >= 1582.1015 Then
  a = y \ 100
  b = 2 - a + a \ 4
End If

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

End Function

Private Function JourSemaine(LaDate As Date) As Integer
'Récupéré sur vbfrance.com
'Quelques modifications quand même...
'Par Alexsimps
Dim res As Double

res = NumeroJourJulien(LaDate) + 1.5
res = res Mod 7
JourSemaine = CInt(res)

End Function


 Conclusion

Merci pour le gens de VBFrance (je me souviens plus son nom) qui m'a filé... euh, sur lequel j'ai "pompé" deux fonctions, s'il se reconnait, ben je lui dis merci!


 Historique

05 août 2004 15:17:27 :
Y avait un oubli tout ridicule qui m'affichait le numéro de la semaine précédente! Voila, c'est corrigé!!!

 Sources du même auteur

Source .NET (Dotnet) RÉCUPÉRER LA LISTE DES FICHIERS (AVEC OU SANS EXTENSION PRÉC...

 Sources de la même categorie

Source avec Zip GESTION PERSONNEL par oudlarbi
Source avec Zip Source avec une capture CALENDRIER EN VBA POUR EXCEL 2010 par nounou94
Source avec Zip Source avec une capture MANIPULER LES FENETRES ENFANT D'EXCEL par bigfish_le vrai
Source avec Zip Source avec une capture COLLECTION ID par Le Pivert
Source avec Zip Source avec une capture VBA MASQUE DE SAISIE NUMÉRIQUE par acive

Commentaires et avis

Commentaire de crenaud76 le 03/08/2004 10:36:53

Sans voulori être méchant, voici ma version de ton code:
[Code]
Public Function NumeroSemaine(ByVal D As Date) As Integer
    NumeroSemaine = DateDiff("ww", "01/01/" & CStr(Year(D)), D, vbMonday, vbFirstJan1) + 1
End Function
[/Code]

Commentaire de juvamine le 03/08/2004 11:35:17

j'ai la meme version que Christophe ^^

tu t'ai bien compliqué la vie je crois !!

a+
juva

Commentaire de crenaud76 le 03/08/2004 11:47:31

Pour info : De l'eau chaude + de l'eau froide, ca donne de l'eau tiède !!!

Commentaire de Stephle le 03/08/2004 14:35:30

Encore plus fort, et dans le meme genre que crenaud76:
[code]
Public function NumeroSemaine(ByVal D as Date) As Integer
     NumeroSemaine = DatePart("ww",D)
End Function
[/code]

Faut pas se prendre la tete quand des fonctions comme DateDiff() ou DatePart() existent déjà...

Commentaire de crenaud76 le 03/08/2004 15:06:17

Tiens !! Je connaissais pas DatePart() !!

Commentaire de Neo.balastik le 04/08/2004 14:51:05

En ce qui me concerne, j'ai tjs utilisé la façon de faire suivante pour trouver le n° de la semaine selon une date :

MsgBox Format$(Date, "ww")

Est-ce buggé selon des cas bien précis ?

Commentaire de Renfield le 04/08/2004 14:58:24 administrateur CS

j'utiliserai DatePart également, plutot que Format (Date , "WW" )

Commentaire de Neo.balastik le 04/08/2004 15:10:10

Oui mais cela ne me dit pas en quoi DatePart serait meilleur que Format$(Date, "ww").

Commentaire de Renfield le 04/08/2004 16:57:53 administrateur CS

meilleur, je sais pas, je fait part de ma preference....

Format$ renvoyant un String....

Commentaire de Neo.balastik le 04/08/2004 18:03:51

Moi je parlais d'exactitude dans le n° de semaine retourné...

Commentaire de Neo.balastik le 04/08/2004 18:08:02

Pour info :
VarType(Format$(Date, "ww"))
retourne 8, cad que Format$ serait de type STRING...

Mais Format sans le signe $ est bien de type Variant.

Commentaire de Renfield le 04/08/2004 20:02:34 administrateur CS

typename ( DatePart("ww",D) )  -> Integer
typename  ( Format(Date, "ww")) -> String

Commentaire de ShareVB le 23/10/2004 11:10:40

salut

c bien de dire que le code a été copier-coller depuis vbfrance et d'ailleurs depuis ma source qui cela dit est effectivement bien compliquée et dont le résultat est le même que la m..tienne lol...
http://www.vbfrance.com/code.aspx?id=5253

pour ceux qui doutent de l'utilité de ce code, deux chose à dire :
  - si on traduit cette source en asm ou C et que l'on en fait une dll appellé par VB...ca sera beaucoup plus rapide que les fonctions de VB (surtout en cas d'appel fréquents...)
  - et de plus avec la date julienne, on peut calculer les saisons, les quartiers de lune, des éclipses et bien d'autres choses...

ShareVB

Commentaire de Renfield le 23/10/2004 12:13:41 administrateur CS

  - si on traduit cette source en asm ou C et que l'on en fait une dll appellé par VB...ca sera beaucoup plus rapide que les fonctions de VB (surtout en cas d'appel fréquents...)

c'est valable pour bon nombre de sources, tu sais.....

Commentaire de Morricon le 26/05/2005 14:35:58

Oups !

C'est normal que la fonction : NumeroJourJulien renvoi un resultat comme celui-ci : 2453371,5 ?

J'ai moi-même écrit des fonctions de calcul numéro semaine, et je n'obtient pas ce type de résultat !!!??

J'avoue ne pas comprendre !

Commentaire de blarcheres le 22/06/2006 14:56:30

Contrairement à ce qu'on dit les autres, les autres, ce code :
[code]
Public function NumeroSemaine(ByVal D as Date) As Integer
     NumeroSemaine = DatePart("ww",D)
End Function
[/code]
est certe bien plus simple mais ne donne pas de bon résultats pour certains jours comme le 01/01/2005 qui tombe la semaine
31 et non pas la semaine 1.

Commentaire de Renfield le 22/06/2006 16:20:23 administrateur CS

étrange, chez moi c'est correct...

? DatePart("ww",#01/01/05#)
1

à noter que la fonction DatePart possède en outre deux parametres FirstDayOfWeek et FirstWeekOfYear...

Commentaire de chatissimus le 03/01/2008 11:44:06

En utilisant
Format(Date, "ww", vbMonday, vbFirstFourDays)
ou
DatePart("ww",Date,vbMonday,vbFirstFourDays)

j'obtiens semaine 53 pour le #31/12/2007# au lieu de semaine 1

le code donné sort bien la semaine 1

(en même temps c'est du vba sous Access 97 ;-) ceci explique peu etre cela )

Commentaire de Renfield le 03/01/2008 12:03:05 administrateur CS

le dernier jour de l'annnée n'est pas en semaine 1 ...

où est le soucis ?

Commentaire de chatissimus le 03/01/2008 19:35:51

Le soucis ?

prends n'importe quel calendrier avec la numérotation des semaines, tu le verras.

une semaine a un numéro et une année d'appartenance. cette numérotation est unique et normalisée.
la semaine 1 de l'année X est la première semaine comprenant le 4 janvier de l'année X.

si on s'en tient aux fonctions vba la semaine du 31/12/2007 au 6/1/2008 est la semaine 53 de l'année 2007 si on est le 31/12, et la semaine 1 de l'année 2008 si on est après le 1/1/2008.
La même semaine a deux numérotations...
et de toute façon il n'existe pas de semaine 53 dans l'année 2007.

(C'est pas moi qui le décide, c'est la ISO 8601 si tu veux de la lecture ;-) )

Commentaire de Renfield le 04/01/2008 10:21:41 administrateur CS

ok, ok,

Gobillot semble avoir prévu ce soucis :
   http://www.codyx.org/snippet_recuperer-numero-semaine_61.aspx#401

testé avec mon code, issu du descriptif fournis sur le site wikipedia
  http://fr.wikipedia.org/wiki/ISO_8601#Num.C3.A9ro_de_semaine

Commentaire de Renfield le 04/01/2008 10:24:05 administrateur CS

EBartSoft, et moi même avons également déposé des Snippets qui pourraient t'être utile

Commentaire de orwen le 08/10/2008 14:48:30

Merci pour le code Renfield, très utile et testé avec succès.

Commentaire de jodeciters le 22/03/2009 15:01:06

Bonjour
je cherche également à obtenir un numéro de semaine dans une suite de dates en colonne.
Je programme ci-dessous que j'ai trouvé à plusieurs reprises dans des forums semble est correct.

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

Mon souci est que je ne sais pas le mettre en oeuvre. Lorsque je tâche de l'exécuter, j'ai un message d'erreur du type "end sub attendu"

voici le code que j'ai tenté de faire :
Sub sen()

Function num_sem(D As Date) As Long

D = Range("A2").Value 'pour exemple A2 indique une date

num_sem = DateSerial(Year(D + (8 - Weekday(D)) Mod 7 - 3), 1, 1)
num_sem = ((D - num_sem - 3 + (Weekday(num_sem) + 1) Mod 7)) \ 7 + 1
End Function

End Sub

merci de votre aide

Commentaire de Renfield le 22/03/2009 23:17:14 administrateur CS

sub
function
   ...
end function
end sub

ca peut pas etre imbriqué...

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,186 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales