begin process at 2012 02 11 21:45:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > CALCUL AUTOMATIQUE DES N° DE SEMAINE

CALCUL AUTOMATIQUE DES N° DE SEMAINE


 Information sur la source

Note :
Aucune note
Catégorie :Trucs & Astuces Classé sous :semaine, n, calcul, date, vba Niveau :Débutant Date de création :25/11/2006 Date de mise à jour :07/12/2006 05:09:54 Vu :26 961

Auteur : fpetit25

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

 Description

Code permettant de calculer de manière automatique les N° de semaine sur une période donnée.

Explication : 1 - J'ai une semaine qui sert de référence pour le calcul
              2 - Depuis cette semaine de référence, je calcul le N° des semaines précédentes et suivantes
              3 - Le nombre de semaine a calculer par rapport à la semaine de référence est une donnée paramètrable
              4 - Quelque soit l'année, cela fonctionne
              5 - Amélioration à venir : position de la semaine de référence va être paramètrable
              6 - VBA fonctionnant en adéquation avec Microsoft Excel

Toutes remarques sera la bienvenue

Source

  • Public Function Semaine(dat As Date) As Integer
  • Dim a As Integer
  • a = Int((dat - DateSerial(Year(dat), 1, 1) + _
  • ((Weekday(DateSerial(Year(dat), 1, 1)) + 1) _
  • Mod 7) - 3) / 7) + 1
  • If a = 0 Then
  • a = Semaine(DateSerial(Year(dat) - 1, 12, 31))
  • ElseIf a = 53 And (Weekday(DateSerial(Year(dat), 12, 31)) - 1) _
  • Mod 7 <= 3 Then
  • a = 1
  • End If
  • Semaine = a
  • End Function
  • Function WriteWeekAnnee()
  • Dim NomDuJour(7) As String
  • Dim StockVal()
  • LiRef = 3 'La ligne de référence où vont être inscrits la valeur des différentes semaines
  • Col_Sem_Ref = 6 'Par exemple la semaine de référence se trouve à la colonne N° 6
  • NB_Colonne_A_Traiter = 34 'Le N° de la dernière colonne à remplir est 30
  • Lib_Deb_Sem = 4 'N° de la colonne ou commence l'écriture des différentes semaines
  • Nb_Sem_Before = Col_Sem_Ref - Lib_Deb_Sem 'Nb de semaines avant la semaine de référence
  • DateActuel = Now
  • Num_Jour_Actuel = Day(Range("A3").Value)
  • Num_Mois_Actuel = Month(Range("A3").Value)
  • Num_Year_Actuel = Year(Range("A3").Value)
  • Num_Jour_Sem_Actuel = Weekday(Range("A3").Value, vbUseSystem)
  • Sem_Ref = Val(Semaine(Range("A3").Value))
  • If Len(Sem_Ref) = 1 Then
  • Range("B2").Value = "0" & Sem_Ref
  • Else
  • Range("B2").Value = Sem_Ref
  • End If
  • NbTotSem = 52
  • LiDeb = Col_Sem_Ref - Nb_Sem_Before
  • Range(Cells(LiRef, LiDeb), Cells(LiRef, NB_Colonne_A_Traiter)).ClearContents 'On efface les anciennes valeurs
  • If Sem_Ref Is >= 52 Then
  • Sem_Ref = 1
  • Num_Year_Actuel = Num_Year_Actuel + 1
  • Else
  • Sem_Ref = Sem_Ref + 1
  • Num_Year_Actuel = Num_Year_Actuel
  • End Select
  • If Sem_Ref < 10 Then
  • Cells(LiRef, Col_Sem_Ref).Value = "0" & Sem_Ref & "/" & Num_Year_Actuel
  • Else
  • Cells(LiRef, Col_Sem_Ref).Value = Sem_Ref & "/" & Num_Year_Actuel
  • End If
  • Sem_Actuel = Semaine(CDate(Range("A3").Value))
  • Sem_Ref = Val(Left(Range("F3").Value, 2))
  • Annee_Actuel = Val(Year(Range("A3").Value))
  • Annee_Ref = Val(Right(Cells(LiRef, Col_Sem_Ref).Value, 4))
  • If Sem_Ref = 1 Then
  • Select Case Annee_Ref
  • Case Is <> Annee_Actuel
  • Range("F3").Offset(0, -1).Value = NbTotSem & "/" & Annee_Ref - 1
  • Range("F3").Offset(0, -2).Value = NbTotSem - 1 & "/" & Annee_Ref - 1
  • Case Is = Num_Year_Actuel
  • Range("F3").Offset(0, -1).Value = NbTotSem & "/" & Annee_Actuel - 1
  • Range("F3").Offset(0, -2).Value = NbTotSem - 1 & "/" & Annee_Actuel - 1
  • End Select
  • Else
  • If Sem_Ref = 2 Then
  • Range("F3").Offset(0, -1).Value = "0" & Sem_Ref - 1 & "/" & Annee_Actuel
  • Range("F3").Offset(0, -2).Value = NbTotSem & "/" & Annee_Actuel - 1
  • Else
  • If Sem_Ref >= 3 And Sem_Ref < 12 Then
  • Select Case Sem_Ref
  • Case Is <= 10
  • Range("F3").Offset(0, -1).Value = "0" & Sem_Ref - 1 & "/" & Num_Year_Actuel
  • Range("F3").Offset(0, -2).Value = "0" & Sem_Ref - 2 & "/" & Num_Year_Actuel
  • Case 11
  • Range("F3").Offset(0, -1).Value = Sem_Ref - 1 & "/" & Num_Year_Actuel
  • Range("F3").Offset(0, -2).Value = "0" & Sem_Ref - 2 & "/" & Num_Year_Actuel
  • End Select
  • Else
  • Range("F3").Offset(0, -1).Value = Sem_Ref - 1 & "/" & Num_Year_Actuel
  • Range("F3").Offset(0, -2).Value = Sem_Ref - 2 & "/" & Num_Year_Actuel
  • End If
  • End If
  • End If
  • NBIteration = NbTotSem - Left((Cells(LiRef, Col_Sem_Ref).Value), 2)
  • If NBIteration > NB_Colonne_A_Traiter - Col_Sem_Ref Then '24
  • NBIteration = NB_Colonne_A_Traiter - Col_Sem_Ref
  • Else
  • If NBIteration = 0 Then
  • NBIteration = NB_Colonne_A_Traiter - Col_Sem_Ref
  • Sem_Actuel = 0
  • Else
  • NBIteration = NBIteration
  • End If
  • End If
  • ReDim StockVal(NBIteration) 'On réalloue de manière dynamique le nbre d'éléments à stocker
  • Val_Sem_Ref = Val(Left((Cells(LiRef, Col_Sem_Ref).Value), 2))
  • If Val_Sem_Ref = NbTotSem Then
  • Num_Year_Actuel = Num_Year_Actuel + 1
  • Else
  • Num_Year_Actuel = Num_Year_Actuel
  • End If
  • For I = 1 To NBIteration
  • Sem_Ref = Sem_Ref + 1
  • If Len(Sem_Ref) > 1 Then
  • Range("F3").Offset(0, I).Value = Sem_Ref & "/" & Num_Year_Actuel
  • Else
  • Range("F3").Offset(0, I).Value = "0" & Sem_Ref & "/" & Num_Year_Actuel
  • End If
  • StockVal(1) = Range("F3").Offset(0, I).Value
  • Next I
  • Val_Find = StockVal(1)
  • ValCelSem = Cells.Find(Val_Find, , , , xlByColumns, xlPrevious).Column
  • AdCelSem = Cells.Find(Val_Find, , , , xlByColumns, xlPrevious).Address
  • NewYear = Right(Range(adCelSem), 4) + 1
  • NBIteration = NB_Colonne_A_Traiter - ValCelSem
  • For I = 1 To NBIteration
  • If Len(I) = 1 Then
  • Sem_Actuel = I
  • Range(adCelSem).Offset(0, I).Value = "0" & Sem_Actuel & "/" & NewYear
  • Else
  • Sem_Actuel = I
  • Range(adCelSem).Offset(0, I).Value = Sem_Actuel & "/" & NewYear
  • End If
  • Next I
  • End Function
Public Function Semaine(dat As Date) As Integer
    Dim a As Integer
    a = Int((dat - DateSerial(Year(dat), 1, 1) + _
        ((Weekday(DateSerial(Year(dat), 1, 1)) + 1) _
        Mod 7) - 3) / 7) + 1
    If a = 0 Then
        a = Semaine(DateSerial(Year(dat) - 1, 12, 31))
    ElseIf a = 53 And (Weekday(DateSerial(Year(dat), 12, 31)) - 1) _
        Mod 7 <= 3 Then
        a = 1
    End If
    Semaine = a
End Function

Function WriteWeekAnnee()

Dim NomDuJour(7) As String
Dim StockVal()

LiRef = 3 'La ligne de référence où vont être inscrits la valeur des différentes semaines
Col_Sem_Ref = 6 'Par exemple la semaine de référence se trouve à la colonne N° 6
NB_Colonne_A_Traiter = 34 'Le N° de la dernière colonne à remplir est 30
Lib_Deb_Sem = 4 'N° de la colonne ou commence l'écriture des différentes semaines
Nb_Sem_Before = Col_Sem_Ref - Lib_Deb_Sem 'Nb de semaines avant la semaine de référence

DateActuel = Now
Num_Jour_Actuel = Day(Range("A3").Value) 
Num_Mois_Actuel = Month(Range("A3").Value)
Num_Year_Actuel = Year(Range("A3").Value)
Num_Jour_Sem_Actuel = Weekday(Range("A3").Value, vbUseSystem)

Sem_Ref = Val(Semaine(Range("A3").Value))

If Len(Sem_Ref) = 1 Then
   Range("B2").Value = "0" & Sem_Ref
Else
   Range("B2").Value = Sem_Ref
End If

NbTotSem = 52

LiDeb = Col_Sem_Ref - Nb_Sem_Before

Range(Cells(LiRef, LiDeb), Cells(LiRef, NB_Colonne_A_Traiter)).ClearContents 'On efface les anciennes valeurs

If Sem_Ref Is >= 52 Then
   Sem_Ref = 1
   Num_Year_Actuel = Num_Year_Actuel + 1
Else
   Sem_Ref = Sem_Ref + 1
   Num_Year_Actuel = Num_Year_Actuel
End Select

If Sem_Ref < 10 Then
   Cells(LiRef, Col_Sem_Ref).Value = "0" & Sem_Ref & "/" & Num_Year_Actuel
Else
   Cells(LiRef, Col_Sem_Ref).Value = Sem_Ref & "/" & Num_Year_Actuel
End If

Sem_Actuel = Semaine(CDate(Range("A3").Value))
Sem_Ref = Val(Left(Range("F3").Value, 2))
Annee_Actuel = Val(Year(Range("A3").Value))
Annee_Ref = Val(Right(Cells(LiRef, Col_Sem_Ref).Value, 4))

If Sem_Ref = 1 Then
   Select Case Annee_Ref
   Case Is <> Annee_Actuel
        Range("F3").Offset(0, -1).Value = NbTotSem & "/" & Annee_Ref - 1
        Range("F3").Offset(0, -2).Value = NbTotSem - 1 & "/" & Annee_Ref - 1
   Case Is = Num_Year_Actuel
        Range("F3").Offset(0, -1).Value = NbTotSem & "/" & Annee_Actuel - 1
        Range("F3").Offset(0, -2).Value = NbTotSem - 1 & "/" & Annee_Actuel - 1
   End Select
Else
   If Sem_Ref = 2 Then
      Range("F3").Offset(0, -1).Value = "0" & Sem_Ref - 1 & "/" & Annee_Actuel
      Range("F3").Offset(0, -2).Value = NbTotSem & "/" & Annee_Actuel - 1
   Else
      If Sem_Ref >= 3 And Sem_Ref < 12 Then
         Select Case Sem_Ref
                Case Is <= 10
                     Range("F3").Offset(0, -1).Value = "0" & Sem_Ref - 1 & "/" & Num_Year_Actuel
                     Range("F3").Offset(0, -2).Value = "0" & Sem_Ref - 2 & "/" & Num_Year_Actuel
                Case 11
                     Range("F3").Offset(0, -1).Value = Sem_Ref - 1 & "/" & Num_Year_Actuel
                     Range("F3").Offset(0, -2).Value = "0" & Sem_Ref - 2 & "/" & Num_Year_Actuel
         End Select
      Else
         Range("F3").Offset(0, -1).Value = Sem_Ref - 1 & "/" & Num_Year_Actuel
         Range("F3").Offset(0, -2).Value = Sem_Ref - 2 & "/" & Num_Year_Actuel
      End If
   End If
End If
   
NBIteration = NbTotSem - Left((Cells(LiRef, Col_Sem_Ref).Value), 2)
  
If NBIteration > NB_Colonne_A_Traiter - Col_Sem_Ref Then '24
   NBIteration = NB_Colonne_A_Traiter - Col_Sem_Ref
Else
  If NBIteration = 0 Then
     NBIteration = NB_Colonne_A_Traiter - Col_Sem_Ref
     Sem_Actuel = 0
  Else
     NBIteration = NBIteration
  End If
End If

ReDim StockVal(NBIteration) 'On réalloue de manière dynamique le nbre d'éléments à stocker
  
Val_Sem_Ref = Val(Left((Cells(LiRef, Col_Sem_Ref).Value), 2))
  
If Val_Sem_Ref = NbTotSem Then
   Num_Year_Actuel = Num_Year_Actuel + 1
Else
   Num_Year_Actuel = Num_Year_Actuel
End If

For I = 1 To NBIteration
    Sem_Ref = Sem_Ref + 1
    If Len(Sem_Ref) > 1 Then
       Range("F3").Offset(0, I).Value = Sem_Ref & "/" & Num_Year_Actuel
    Else
       Range("F3").Offset(0, I).Value = "0" & Sem_Ref & "/" & Num_Year_Actuel
    End If
    StockVal(1) = Range("F3").Offset(0, I).Value
Next I
  
Val_Find = StockVal(1)
ValCelSem = Cells.Find(Val_Find, , , , xlByColumns, xlPrevious).Column
AdCelSem = Cells.Find(Val_Find, , , , xlByColumns, xlPrevious).Address
NewYear = Right(Range(adCelSem), 4) + 1
NBIteration = NB_Colonne_A_Traiter - ValCelSem
   
For I = 1 To NBIteration
    If Len(I) = 1 Then
       Sem_Actuel = I
       Range(adCelSem).Offset(0, I).Value = "0" & Sem_Actuel & "/" & NewYear
    Else
       Sem_Actuel = I
       Range(adCelSem).Offset(0, I).Value = Sem_Actuel & "/" & NewYear
    End If
Next I
 
End Function



 Historique

07 décembre 2006 05:09:54 :
Rien de plus sinon que cela fonctionne quelque soit le jour de l'année. Mon nouveau code est bientôt prêt et il ne fait plus que 50 lignes, défit à celui qui arrive à faire la même chose mais en plus court (je suis preneur).

 Sources du même auteur

VBA EXCEL - ATTRIBUÉ EN FONCTION DE L'ANNÉE UN N° DE SEMAINE...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) EXPORTER LES IMAGES DE WORD ET D' EXCEL par Le Pivert
Source avec Zip Source avec une capture JEUX DE VERITÉ ET DE FIDELITÉ par billatosco
Source avec Zip IMAGELOARDER par vkitumaini
Source avec Zip Source avec une capture Source .NET (Dotnet) CREER UN CALENDRIER DE POCHE par Le Pivert
Source avec Zip RECHERCHE D'UN ENREGISTREMENT DANS UNE DATATABLE ET POSITION... par erdna

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CALENDRIER EN VBA POUR EXCEL 2010 par nounou94
Source avec Zip Source avec une capture Source .NET (Dotnet) CALCULS DE DATES À PARTIR D'UN CALENDRIER par jcbouli
NUMÉRO DE SEMAINE par vb5zh
Source avec Zip Source avec une capture CALENDRIER PAR SEMAINE VBA ACCESS par pillsmen
VBA EXCEL - ATTRIBUÉ EN FONCTION DE L'ANNÉE UN N° DE SEMAINE... par fpetit25

Commentaires et avis

Commentaire de mortalino le 26/11/2006 05:47:02

Salut,

il y a beaucoup trop de code, en plus on ne sait pas vraiment comment utiliser ta fonction. Initié ? Bon, soit. Réseau & Internet ? Bon, admettons.

non sans rire, et sans être méchant, je pense que c'est pas une source, et perso, je ne l'aurai pas mise.

En fait, c'est plutôt un snippet (morceau de code) que l'on peut trouver là : www.codyx.org
Un snippet intitulé "Calculer le numéro de la semaine" existe déjà, et en plus performant (et en plusieurs langages) :
http://www.codyx.org/snippet_calculer-numero-semaine-date_152.aspx

Voici ma fonction, que je placerai en niveau débutant, et de catégorie "Date - Trucs et astuces" :

Function WeekNumber(Optional ByVal vDate As Variant) As Byte
    If IsMissing(vDate) Then vDate = Date
    
        Dim iNbJour     As Integer
        Dim iWeekDay    As Integer
        Dim bValTemp    As Byte
        Dim a           As String
        Dim b()         As String
    
    iWeekDay = Weekday(CDate("01/01/" & DatePart("yyyy", vDate)))
    
    Select Case iWeekDay
        Case 1: bValTemp = 5: Case 2: bValTemp = 6: Case 3: bValTemp = 0: Case 4: bValTemp = 1: _
        Case 5: bValTemp = 2: Case 6: bValTemp = 3: Case 7: bValTemp = 4
    End Select
    
    iNbJour = CLng(DateDiff("d", CDate("31/12/" & DatePart("yyyy", vDate) - 1), vDate))
    a = IIf((iNbJour + bValTemp) / 7 < 1, 53, CStr((iNbJour + bValTemp) / 7))
    If VarType(a) = vbString Then b() = Split(a, ","): WeekNumber = b(0): Erase b Else WeekNumber = a
End Function

Sub Exemple_Utilisation()
    MsgBox WeekNumber(#1/8/1990#)
    MsgBox WeekNumber()
End Sub


Pas besoins de 150 lignes !

++

Commentaire de dany108 le 26/11/2006 13:07:16

En ce qui me concerne je calcul un numéro de semaine comme ceci :
NumSem= Val(Format(MaDate, "ww", vbMonday, vbFirstFourDays))

Commentaire de MPi le 26/11/2006 15:16:39

Et moi, sous Excel, j'utilise l' "Utilitaire d'Analyse" dans les macros complémentaires qui permet d'utiliser cette fonction.

=NO.SEMAINE(D1;1)  ' où D1 est la date à vérifier

Pour l'instant, ça fonctionne très bien...

Commentaire de PCPT le 26/11/2006 19:33:44 administrateur CS

salut,
Dany108, MPi -> n'hésitez pas à ajouter vos proposition sur codyx :
http://www.codyx.org/snippet_calculer-numero-semaine-date_152.aspx

fpetit25 -> à moins que tu ne puisses dire en quoi (ou si) ton code est plus adapté (rapidité, paramètres régionaux, autre...) que ceux proposés, tu as dû te casser la tête mais je vais quand même devoir le désactiver.

tiens-moi au courant stp
++

Commentaire de NETSAGE le 27/11/2006 08:23:23

C'est trop compliqué, trop long. Je vous donne un tuyeau.
La semaine n° 1 est toujours la semaine du premier Jeudi de l'année. Il suffit de consulter un agenda. Partant de ce principe et tenant compte des années bisextiles on a plus besoin de semaine de référence.
Essayer d'ecrire un truc comme ça
    NumSem = NumeroSemaine(MaDate as date)


Commentaire de oommeeggaa3d le 27/11/2006 11:36:18

Personnellement j'utilise un controle MontView et la propriété Week (Monthview.week).
Il suffit de régler le monthview sur la date voulue auparavant et le tour est joué :
Monthview.Value = CDate(MaDate)
NumSemaine=Monthview.week

Commentaire de fpetit25 le 07/12/2006 04:48:18

Bonjour,

Je pense que la plupart des personnes n'ont pas compris à quoi cela servait. Ce code permet d'écrire les N° de semaine dans des cellules d'excel avec l'année correspondante et non pas calculer juste le N° des semaines sinon le code aurait fait que quelques lignes. De plus la fonction dans excel no.semaine à un bug (faites un test du 29/12/2007 !!!).
Maintenant je l'ai optimisé et il ne fait plus que 50 lignes.

Merci pour toutes ces remarques.

Commentaire de Kristof_Koder le 06/08/2007 15:20:41

Il est ou le bug de la fonction no.semaine de Excel ? avec le 29/12/2007, j'obtient 52 ! Cela me parait juste ! Non ?

Commentaire de SASC01 le 18/09/2007 11:19:24

Bonjour,

semaine = DatePart(DateInterval.WeekOfYear, Now) semble fonctionner !

Commentaire de jodeciters le 16/03/2009 09:24:47

Bonjour à tous,

Béotien je bricole un programme et je souhaite que les lignes triées (dont une colonne fait apparaître la date du jour), apparaisent de couleurs différentes en fonction des semaines paires et impaires.
J'ai bien trouvé différentes propositions mais je ne sais pas comment on fait le lien entre une macro qui commence par:
Sub ()
et les exemples donnés qui commencent par "Public Function"
merci pour votre aide

Commentaire de PCPT le 17/03/2009 08:48:15 administrateur CS

utilise plutôt le forum pour poser ce genre de question, elle n'a pas de rapport avec la source. merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

vba sous exceel - calcul simple mais je connais pas - assez pressé [ par sonexopteor ] Bonjour, je suis debutant total en programmationJe souhaite sous ecxcel effectué un calcul sur des données. J'ai deux colonnes, dans la première des d VBA - ACCESS : Faire apparaître le jour de la semaine dans une date [ par kharrat ] Salut,J'ai un champ de texte dans une table qui est en réalité une date (ne me demandez pas pourquoi, c'est pas moi qui est conçu l'appli ... ) au for [VBA] Identifier une date la + proche de fin de mois [ par altarez ] Bonjour à tous,Voila, je cherche un code VBA qui identifie parmis un liste de date, celle qui se rapporche le plus de la fin du mois.voici comment se Graph sous VBA [ par jack bauer 57070 ] Bonjour,   <p class="MsoNormal" st jour de semaine et date [ par thegrenouille ] Bonjour,Voil&#224; mon probl&#232;me : je voudrai conna&#238;tre le jour de la semaine correspondant &#224; une date donn&#233;e.Exemple : lje donne l calcul de jours entre deux date [ par mell01 ] bonjours,qql saurait-il calcul&#233; le nb de jour entre deux dates, soit avec une fction sql ou une fonction vba?merci d'avance ----===BESOIN AIDE Au bord du GOUFFRE REQUETE repondez plz [ par boaconsaxor ] Bonjour a tous et merci pour vos reponses...J'ai un probleme avec des requete sous access.En fait je dois faire une base de donn&#233;e avec ub formul Interface en VBA visible avant la feuille de calcul ?? [ par jpsonza ] Salut les forumeurs,Enkor moi et mes kestions stupides: Ya-t-il un moyen de faire apparaitre une interface (useform) Cr&#233;e en VBA d&#232;s l'ouver calcul de date [ par DarkRider26 ] Bonjour &#224; tous !!!Je souhaite faire un petit calcule sur des dates. En fait l'utilisateur choisira dans une liste d&#233;filante l'un des douze m 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


Nos sponsors


Sondage...

Comparez les prix

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 : 3,931 sec (3)

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