IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Code pour semaine en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut Code pour semaine en VBA
    Bonjour,

    J'ai mis en place ce bout de code qui me permet lorsque le mois en cours correspond au n°, d'afficher ce mois.
    Je souhaiterai en faire autant avec le numéro de semaine correspondant à la semaine en cours.
    Comment puis-je faire ?
    "jj" pour jour, "mm" pour mois,"aaaa" pour année, mais pour semaine ????
    Merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mois_actuel = Format(Now(), "mm")
    If mois_actuel = 9

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Le numéro de semaine fait l'objet d'une norme. Voici un code que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Public Function NumeroSemaine(dateSemaine As Date) As Integer
        Dim NumJour             As Integer
        Dim NbJour              As Integer
        Dim nbpremier           As Integer
        Dim Jour                As Date
        Dim DernierJourSemaine  As Date
     
        '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 = Weekday(Jour, vbMonday)
     
        '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 = Weekday(DateSerial(Year(dateSemaine) + 1, 1, 1), vbMonday)
            'Si le 1er tombe avant le vendredi, le numéro de la semaine est le numéro 1
            If nbpremier < 5 Then NumeroSemaine = 1
            '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
    Je ne suis pas l'auteur de ce code et je m'excuse auprès de lui de ne pas savoir lui attribuer cette contribution.

    Cordialement,

    PGZ

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Juste pour info: pour récupérer le numéro du mois le plus simple reste encore de faire ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numero_mois = Month(Date)

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    voilà de quoi t'éclairer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MsgBox "N° de la semaine avec convention  ""4 jours au nmoins"" ===>> " & DatePart("ww", Date, vbFirstFourDays)
      MsgBox "N° de la semaine avec convention ""commençant le dimanche"" ===>> " & DatePart("ww", Date, vbSunday)
      MsgBox "N° de la semaine avec convention ""commençant le lundi"" ===>> " & DatePart("ww", Date, vbMonday)
      MsgBox "jour de la semaine  ===>>" & WeekDay(Date) & " (" & Format(Date, "dddd") & ")"
      MsgBox "jour du mois  ===>>" & Day(Date) & " (" & Format(Date, "dddd") & ")"
      MsgBox "mois  ===>>" & Month(Date) & " (" & Format(Date, "dddd") & ")"
      MsgBox "année  ===>>" & Year(Date)
      MsgBox "N° jour dans année  ===>> " & DateDiff("d", "01/01/" & Year(Date), Date)

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Il me semblait bien qu'il y avait une fonction toute faite qui permettait d'avoir le numéro de semaine mais je ne retrouvais plus laquelle c'était: merci uc.

    Le pire, c'est que je m'en suis déjà servi et que je suis passé juste à coté dans l'explorateur d'objets...
    Pas très en forme aujourd'hui.

  6. #6
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Ce n'est pas si simple.

    Regardez ce que donne ces formules pour le 31/12/2008 : toutes les 3 semaine 53 au lieu de 1.

    PGZ

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Mon dernier msgbox est inexact :

    Corriger par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "N° jour dans année  ===>> " & DateDiff("d", "31/12/" & Year(Date) - 1, Date)
    que l'on peut d'ailleurs avantageusement remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "N° jour dans année  ===>> " & DatePart("y", Date)
    Je pense que tout y est maintenant ...

  8. #8
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Pour info, le numéro de semaine suivant la norme ISO 8601 expliquée par Wiki ici

    PGZ

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Citation Envoyé par pgz Voir le message
    Ce n'est pas si simple.

    Regardez ce que donne ces formules pour le 31/12/2008 : toutes les 3 semaine 53 au lieu de 1.

    PGZ
    Ucfoutu n'a pas précisé le premier jour de la semaine dans sa première formule (qui est la bonne).

    Précise dans datepart que le premier jour de la semaine est lundi et tu verras que oh miracle ça te renverra 1 pour le 31 décembre 2008.

  10. #10
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Si une formule te donne le 31/12 semaine 53 et le 1/1 semaine 1, alors qu'il s'agit du mercredi et jeudi de la même semaine, c'est qu'il y a un problème, non?

    PGZ

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    La BONNE formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "N° de la semaine avec convention  ""4 jours au moins"" ===>> " & DatePart("ww", Date, vbMonday, vbFirstFourDays)
    Car en France la semaine commence le lundi, et pas le dimanche (qui est le paramètre par défaut, et le premier jour de la semaine chez les anglo-saxons il me semble).

    Testé ça me renvoie bien 1 pour le 31/12/2008.

    Avec dimanche comme premier jour de la semaine, ça fait jeudi/vendredi/samedi pour les 3 premiers jours de 2009 et dimanche/lundi/mardi/mercredi pour fin décembre 2008, et donc la semaine est considérée comme la n°53 de 2008.

    Or avec lundi premier jour de la semaine, ça fait jeudi/vendredi/samedi/dimanche pour début janvier et lundi/mardi/mercredi pour fin décembre, et là dans ce cas la semaine est considérée comme semaine N°1 de 2009.


    Voilà, donc j'en conclus que tout le code d'en haut ne sert pas à grand-chose...

  12. #12
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    La BONNE formule:

    Code :
    MsgBox "N° de la semaine avec convention ""4 jours au moins"" ===>> " & DatePart("ww", Date, vbMonday, vbFirstFourDays)Car en France la semaine commence le lundi, et pas le dimanche (qui est le paramètre par défaut, et le premier jour de la semaine chez les anglo-saxons il me semble).
    Cela semble bien fonctionner. Intéressant. Merci

    PGZ

  13. #13
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Merci tout le monde, avec tout cela je devrais pouvoir me débrouiller.
    Je suis épaté par votre savoir

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par decondelite Voir le message
    Voilà, donc j'en conclus que tout le code d'en haut ne sert pas à grand-chose...
    Pas de précipitation, decondelite (c'est toujours mauvais...)

    Un peu de lecture, d'abord :

    http://fr.wikipedia.org/wiki/ISO_860...9ro_de_semaine

    ensuite :
    A/
    1) attention : avec la norme iso la 1èere semaine d'une année peut commencer dans l'année ou l'année précédente
    2) une année peut compter dans certains cas 53 semaines
    3) tout dépend du millésime concerné.

    B/
    tous les pays n'ont pas adopté la même norme en ce qui concerne le point de départ de la 1ère semaine d'une année
    C'est la raison pour laquelle VB a prévu plusieurs arguments, justement (ils ne sont pas là pour amuser la galerie).

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Oui je sais, ça m'éviterait de trop éditer. Bon ça peut paraître idiot, mais les sujets intéressants ont tendance à m'emballer, et me font parfois dire n'importe quoi. Faut que je me pose d'avantage avant de répondre.

    Néanmoins, la fonction datepart prend bien en compte tous ces paramètres, alors pourquoi s'en priver, sauf si on veut réinventer la roue.

    PS: j'ai pas lu ton article je suis un inculte endurci

  16. #16
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Il semble que tout ce que nous avons proposé soit faux.
    La procédure donne S1 pour le 3/1/2010 qui est S53 suivant la norme.
    La formule qui paraissait bonne donne S53 pour le 31/12/2007 qui est S1 suivant la norme.
    On trouve une autre fonction fausse, au sens de la norme, en FAQ.
    Il faudrait peut-être faire quelque chose qui marche. Ce n'est pas si difficile...

    Cordialement,

    PGZ

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    A mon avis c'est dû au fait qu'il y a des décalages entre années bisextiles et compagnie. Après l'année bisextile, il y a aussi un jour de plus tous les 400 ans, etc... on s'en sort pas quoi.

    Il se peut que Microsoft n'ait pris en considération que les années bisextiles, et pas le jour en plus tous les 400 ans, ou je ne sais quoi d'autre.

    Dixit google: 1 année = 365,242199 jours
    Et encore la valeur exacte s'étend à des chiffres à l'infini après la virgule, qui plus est n'est jamais constante d'après les lois de la physique et compagnie

    Bref, comme dirait uc, je pense que le mieux ce serait se servir du "très probable", et que bon avoir une erreur une fois de temps en temps de relève pas de la fin du monde.

    Je conclus sur ce point: si on ne nous cassait pas les pieds régulièrement avec un jour de plus par an de façon plus ou moins régulière (ou pas), on en serait pas là.

    Si quelqu'un veut plancher là-dessus, eh ben à mon avis il a intérêt à programmer un truc béton qui prend en compte non seulement la norme ISO, mais en plus tout le bazar de gestion de la taille exacte d'un jour et de l'origine du compte.

  18. #18
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Finalement, j'ai commis une contribution sur le sujet.
    numérotation de semaine suivant ISO 8601
    Cela semblerait marcher. Mais je suis prudent.

    PGZ

  19. #19
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir


    tu peux tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    Debug.Print NumSemaine(CDate("29/12/2008"))
    End Sub
     
    Function NumSemaine(lngDate As Long) As Integer
        NumSemaine = Evaluate("=INT(MOD(INT((" & lngDate & _
            "-2)/7)+0.6,52+5/28))+1")
    End Function

    bonne soirée
    michel

  20. #20
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    J'ai testé depuis 1/1/1950.
    Je n'ai détecté aucune erreur jusqu'au 28/12/2104.
    A partir du 29, le résultat est systèmatiquement faux.
    Donc valable, pour ce siècle.

    PGZ

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E97]Code pour déprotéger une feuille de calcul
    Par blaiso dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/04/2007, 11h30
  2. Réponses: 8
    Dernier message: 08/03/2007, 16h54
  3. [VBA][SQL] code pour requete sql update en vba
    Par titocv723 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 24/10/2006, 17h45
  4. [VBA-A]Un code pour récupérer un type de donnée
    Par KEROZEN dans le forum VBA Access
    Réponses: 5
    Dernier message: 14/04/2006, 16h56
  5. [VBA -A]Code pour répondre au question des msg d'alertes
    Par soad029 dans le forum VBA Access
    Réponses: 8
    Dernier message: 23/03/2006, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo