[VBA Excel] Calendrier "PlugAndPlay"

Bonjour le forum

Je vous partage ici un calendrier (édité sur un UserForm) reprenant un design similaire au calendrier de notre bon vieux Windows7. Effectivement je sais très bien que beaucoup d'entre nous travaillons avec les dates et je pense rendre service .

Le UserForm est "PlugAndPlay", exportez le UserForm et importez le directement dans votre projet ! Il ne vous restera plus qu'à insérer dans un module la variable Public TheDateSelected As Date pour récupérer la date sélectionnée.

https://www.excel-pratique.com/fr/telechargements/calendriers/calendrier-excel-no488

Vous pouvez naviguer dans le calendrier en choisissant un mois, une année ou un numéro de semaine spécifique !

calendrier

TAG : calendrier ; date ; jour ; jours ; semaine ; numéro ; numero ; mois ; années ; annee ; année ; excel ; vba ; userform ; calendar ; month ; day ; date ; year ; 52 semaines ; 53 semaines ; aujourd'hui ; aujourdhui ; today ; planning ; planing

Bonjour,

Très intéressant ...

Si tu en es l'auteur, il aurait été bon d'ajouter au début du code, dans le formulaire "Calendrier", ton nom ou ton pseudo et le site pour te joindre.

ric

J'en suis effectivement l'auteur, tu as raison je vais rajouté ça ;)

Bonsoir, et félicitation !

Moi qui essaie d'en faire un... Ce n'est pas encore le cas !

Par contre pour la fin d'année 2020 on a bien la semaine 53, mais pour le début d'année 2021 on a la semaine 1 en lieu et place de la 53, du coup avec le système "français" il y a un décalage d'une semaine... Système français qui, je crois, prend pour "semaine" une semaine avec 4 jours minimum, donc du 1 au 3 janvier 2020 c'est encore la semaine 53 de 2020.

Il faut que je regarde le code pour apprendre ! Merci pour ce partage !

@ bientôt

LouReeD

Il est vrai que j'ai eu du mal là dessus, je pensais avoir réussi mais quand on a le nez sur le même truc pendant des heures on ne voit plus les erreurs évidentes Merci du retour je regarde ça aussi de mon côté !

Bon je pense avoir corrigé le problème. Après quelque rehcerche j'ai cru comprendre que la norme est de 52 semaines. Dans le doute (la confiance n'exclue pas le contrôle) j'ai regardé dans mon calendrier Outlook, et là, l'année 2020 est bien en 52 semaines.

La semaine 52 de l'année 2020 commence le lundi 21 décembre et se termine le dimanche 27 décembre

La semaine 1 de l'année 2021 commence le lundi 28 décembre (de l'année 2020) et se termine le dimanche 3 janvier

sem

J'ai donc utilisé le paramètre vbFirstFullWeek qui me retourne bien mes 52 semaine avec la fonction DatePart.

Bonjour,

C'est à vérifier car mon calendrier "papier" m'affiche bien semaine 53 du 28 décembre 2020 au 3 janvier 2021... Le système français compte la semaine 1 de janvier dans la première semaine de janvier qui comporte au moins 4 jours de janvier, donc si le 1er janvier est un vendredi, la semaine 1 sera la suivante.

@ bientôt

LouReeD

"D'après la norme ISO 8601, une semaine débute un lundi et s'achève un dimanche, et une semaine dépend d'une année lorsqu'elle place une majorité de ses sept jours dans l'année en question, soit au moins quatre. Dès lors, la semaine 1 est la semaine du premier jeudi de l'année."

Vu sur le net.

@ bientôt

LouReeD

Merci pour les explications, ça commence à devenir plus clair, qui aurais cru que ça aurait été aussi compliqué de manipuler des dates

Je vais voir comment adapter mon code en conséquence

Donc déjà je viens de comprendre qu'il faut utiliser vbFirstFourDays au lieux de vbFirstFullWeek pour répondre à la norme, je n'ai plus qu'à retravailler l’animation ;)

Bonjour,

Ci-dessous la formule à privilégier pour le calcul de la semaine ISO avec DatePart.

Elle règle un souci d'année bissextile tous les 400 ans.

ISOweeknumber=Format("ww",Date-WeekDay(Date,2)+4,2,2)

Merci Jean-Eric, ça m'a l'air bien mieux !

Je rencontre maintenant une difficulté pour générer la date du du lundi de la semaine via le numéro de la semaine. Voilà la formule que j'utilise :

DateWe = DateSerial(CInt(Me.Annee), 1, 1) - Weekday(DateSerial(CInt(Me.Annee), 1, 1)) - 5 + 7 * CInt(Me.Sem)

Pour l'année 2020 ça m'a l'air de fonctionné pour pour l'année 2021 ça ne marche plus, la formule me retourne la date du 28/12/2020

et donc via la formule

NumSem = DatePart("ww", DateWe - Weekday(DateWe, 2) + 4, 2, 2)

me retourne la semaine 1. Alors que la semaine 1 de 2021 commence le 04/01/2021.

33calendrierv2.xlsm (66.64 Ko)

Bonjour,

Pas trop suivi la chose, mais ...

En civil, l'année débute le 1er. janvier et se termine le 31 décembre.

En ISO, c'est différent et l'année débute toujours un lundi (4 jours) et se termine un dimanche :

2019 : 31/12/2018 - 29/12/2019

2020 : 30/12/2019 - 3/1/2021

2021 : 4/1/2021 - 2/1/2022

Une année ISO comporte 364 ou 371 jours.

Alors, on est en civil ou en ISO ?

Bonjour à tous,

Ajouter une case à cocher : pas coché = ISO > coché = Civil

ric

Bonjour,

Pour le lundi en fonction de la semaine et de l'année :

DateWe = 7 * CInt(Me.Sem) + DateSerial(CInt(Me.Annee), 1, 3) - Weekday(DateSerial(CInt(Me.Annee), 1, 3)) - 5

Merci Jean-Eric pour l'aide qui n'est pas des moindres ! Par défaut se sera ISO, mais merci de l'idée de la case à cocher Ric ;)

Grace à vos contributions je pense avoir (peut-être) corrigé les petits problèmes de semaine. Je fais donc à nouveau appel à vos yeux de lynx pour repérer d'éventuels problèmes ;)

31calendrierv3.xlsm (65.64 Ko)

Bonjour,

A priori pas de souci majeur sur le fonctionnement.

Revoir la largeur du Textbox de la semaine (sem). le 2e.digit est tronqué.

Cdlt.

Merci, il me semblait effectivement avoir remarqué que les dimensions pouvais variées entre une version 2016 et 365 !

53calendrierv3.xlsm (55.55 Ko)

Re,

Pour la liste déroulante des numéros de semaine.

Il n'y a pas de semaine 53 en 2019 !...

Tu peux utiliser :

n=Worksheetfunction.IsoWeekNum(dateserial(Année,12,28))

Ou son équivalent avec DatePart.

Le 28 décembre est toujours dans la dernière semaine de l'année (?).

Cdlt.

Dans le doute de savoir si le 28 appartient toujours à la dernière semaine de l'année j'ai gardé mon idée de base de boucler tant que la semaine n'est pas supérieur ou égale à 52.

De cette manière ça à l'aire de fonctionner. Merci Jean-Eric, pour ta vive réaction !!

Private Sub Annee_Change()
Dim NbSem As Integer, cpt As Integer
Dim DateTempo As Date

    CalendarInit
    Me.Sem.Clear
    DateTempo = CDate("01/01/" & CInt(Me.Annee) + 1)
    NbSem = DatePart("ww", DateTempo - 1 - Weekday(DateTempo - 1, 2) + 4, 2, 2)
    If NbSem < 51 Then
        cpt = 0
        Do While NbSem < 51
            cpt = cpt + 1
            NbSem = DatePart("ww", DateTempo - cpt - Weekday(DateTempo - cpt, 2) + 4, 2, 2)
        Loop
    End If
    For i = 1 To NbSem
        Me.Sem.AddItem i
    Next i
End Sub

En tout cas via ce post j'en apprend beaucoup sur la gestion des dates, des semaines, etc. Je pense que le post sera utile pour plein de monde ! (enfin j'espère) :)

Rechercher des sujets similaires à "vba calendrier plugandplay"