Explication de la macro du calendrier automatique

Temps de lecture : 4 minutes

L'article sur la création du calendrier automatique est l'un des articles les plus lus de ce site. Et c'est aussi le plus commenté notamment à cause de la macro qui vous pose des problèmes.

C'est article va vous expliquer chaque lignes du code. Vous pourrez ainsi comprendre la logique et adapter le code à vos besoins.

Sub Masquer_Jour()
Dim Num_Col As Long
   For Num_Col = 30 To 32     ' Boucle sur les cellules des jours 29, 30 et 31
      If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then
         Columns(Num_Col).Hidden = True
      Else
         Columns(Num_Col).Hidden = False
     End If
   Next  
   Range("B6:AF13").ClearContents  'Supprime le contenu dans les cellules
End Sub

Mais si vous n'avez jamais construit de macro, il est indispensable de connaître les bases de la programmation dans cet article.

Ligne 1 : Création du nom de la procédure

C'est le nom qui va permettre d'identifier de façon unique la procédure.

C'est aussi grâce à ce nom qu'il sera possible de lié le menu déroulant à la macro.

Sub Masquer_Jour()

Ligne 2 : Déclaration de variables

Pour balayer plusieurs colonnes afin de lire la date qu'elles contiennent nous avons besoin d'utiliser une variable.

La variable Num_Col est déclarée (Dim) comme étant un nombre entier (As Long)

Dim Num_Col As Long

Ligne 3 : Début de la boucle

Nous allons écrire une boucle qui va faire varier la variable Num_Col de la valeur 30 et se terminer à la valeur 32

For Num_Col = 30 To 32 

La raison c'est parce que dans la construction de notre calendrier les journées du 29, 30 et 31 seront toujours calculées dans les colonnes 30, 31 et 32

Dates calculated for the column 30, 31 and 32

Ligne 4 : Test entre le mois calculé et le mois sélectionné

Toute l'astuce du programme est ici 😉😎

Comme vous le savez, tous les mois ont 28 jours, mais le mois de Février peu avoir 29 jours tous 4 ans et 4 mois ont 30 jours (Avril, Juin, Septembre, Novembre).

Présenté comme cela, le problème semble compliqué à résoudre. Mais d'un autre coté, Excel sait toujours adapter les dates si la fin d'un mois est dépassée. Par exemple, si on ajoute 30 jours au 1er Février, Excel va retourner la date du 3 Mars.

=DATE(2019;2;1)+30 => 03/03/2019

Donc dans notre calendrier, si on choisit le mois de Février, les colonnes 30, 31 et 32 vont afficher les dates du mois de Mars.

Dates calculated by Excel for the days 29, 30 and 31 for February

Nous allons donc écrire un test qui va comparer la valeur du mois (Month) dans les colonnes 30, 31 et 32 avec le mois retourné par le menu déroulant.

Modification de la valeur de la cellule liée en fonction du mois sélectionné

Le test va donc rechercher si la valeur du mois contenu dans les cellules AD6, AE6 et AF6 (ou encore Cells(6, 30), Cells(6, 31) et Cells(6,32)) est supérieures ou égale à la valeur contenue en A1 (la cellule liée du menu déroulant pour les mois).

      If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then

Alors bien sur, comme nous sommes à l'intérieur d'une boucle, la valeur Num_Col va tout d'abord avoir la valeur 30 et donc faire le test sur la cellule AD6, puis au deuxième passage dans la boucle, le test se fera sur la cellule AE6 et ainsi de suite.

Ligne 5 : Masquer la colonne

Si le test précédent est Vrai, la colonne Num_Col est masquée (Hidden = True Masquer = Vrai).

     Columns(Num_Col).Hidden = True

Ligne 6 et 7 : Afficher la colonne

Si le test est Faux (Else), alors la colonne Num_Col est affichée (Hidden = False)

      Else
         Columns(Num_Col).Hidden = False

Ce test peut paraître inutile mais si vous passez d'un mois qui n'a pas 31 jours vers un mois à 31 jours, il faut afficher les précédentes colonnes masquées (malin 😉)

Ligne 8 et 9 : Fermer les instructions

En VBA, quand vous créer un test ou une boucle, il est indispensable d'indiquer où se termine les instructions.

Pour indiquer la fin d'un test If, il suffit d'écrire l'instruction End If, et pour une boucle For, il faut la terminer par l'instruction Next

     End If
   Next  

Ligne 10 : Effacer les données inscrites

A la fin du traitement pour masquer ou afficher les colonnes, le programme va effacer les valeurs ClearContents inscrites dans la plage de cellules B6 à AF13 Range("B6:AF13")

   Range("B6:AF13").ClearContents  

Ligne 11 : Terminer la procédure

Comme pour les tests ou les boucles, il faut terminer une procédure (et donc la fin de votre programme) par l'instruction End Sub

End Sub

40 Comments

  1. N'TAME
    01/07/2022 @ 10:57

    Un grand merci à vous. Ce tuto vient résoudre une de mes difficultés dans la gestion du pointage du personnel.

    Reply

  2. JEBLI
    02/05/2022 @ 16:14

    Bonjour,
    Merci infiniment pour vos efforts et pour tout ce que vous faites pour nous aider.
    Je vous estime beaucoup et je vous souhaite le bonheur du monde entier.
    Si vous le permettez, j'aimerai bien apprendre à faire l'enregistrement d'un mois sur l'autre de mes données(suivi du pointage du personnel).
    Encore une fois merci beaucoup.

    Reply

  3. souleymane cisse
    25/04/2022 @ 15:10

    Hello , je voudrais pouvoir changer de mois mais en actualisant a chque fois les données contenues dans chaque mois sans les écraser

    Reply

    • Frédéric LE GUEN
      26/04/2022 @ 00:45

      Il faut supprimer la ligne de la macro ClearContents

      Reply

  4. Steven
    13/08/2021 @ 07:14

    Bonjour et merci pour le tuto!

    J'ai besoin d'un coup de main! Comme plusieurs mon calendrier est à la verticale mais ce n'est pas mon problème j'ai adapter la macro. je sauvegarde et ca fonctionne! Sauf que tout les mois tombe a 28 jours. J'ai du effacer la ligne qui demande la suppression des celulles pour mes besoins et j'ai remarque que si je met tout a FALSE et bien tout les jour s'affiche je me demandais donc si il manquait pas quelque ligne à la macro j'ai limpression qu'il met seulement a 28 jour ou il affiche tout les jour...voici les codes

    Sub Masquer_Jour()
    Dim Num_Lignes As Long
    For Num_Lignes = 31 To 33 ' Boucle sur les cellules des jours 29, 30 et 31
    If Month(Cells(Num_Lignes, 3)) > Cells(1, 1) Then
    Rows(Num_Lignes).Hidden = True
    Else
    Rows(Num_Lignes).Hidden = False
    End If
    Next
    End Sub

    Ce code me permet de masquer les 29-30-31 et seulement 28 jours aparait peu importe le mois

    et celui la

    Sub Masquer_Jour()
    Dim Num_Lignes As Long
    For Num_Lignes = 31 To 33 ' Boucle sur les cellules des jours 29, 30 et 31
    If Month(Cells(Num_Lignes, 3)) > Cells(1, 1) Then
    Rows(Num_Lignes).Hidden = False
    Else
    Rows(Num_Lignes).Hidden = False
    End If
    Next
    End Sub

    Me permet d'afficher tout les jours peu importe le mois...

    Je peux m'adapter mais j'ai encore des lacunes en macro! Merci de votre coup de main !

    Reply

    • jarrier
      01/11/2021 @ 03:10

      bonjour
      mon tableau commence en C5 et se termine en AH15
      le menu déroulant n'affecte pas la macro, il est invisible dans le programme
      en C1 est renvoyé la valeur du mois, c'est celle-ci qui faut renseigner dans la macro

      IF Month (Cells(5,Num_Col)) > Cells (1 , 3 ) THEN
      I__> ce numéro 5 , correspond à la ligne des jours de la semaines du tableau

      Cell 1 est la première ligne d'excel et 3 la colonne numéro 3 d'excel

      n'oublier pas le signe >

      Reply

  5. Erkan Zekiri
    24/06/2021 @ 14:13

    Bonjour à tous,

    je ne comprends pas pourquoi lorsque je mets les macro, mon calendrier se coupe le 28 de chaque mois. Savez vous pourquoi??

    Reply

    • Frédéric LE GUEN
      24/06/2021 @ 14:30

      Le test sur les cellules est forcément toujours vrai. Il y a soit un problème avec la valeur des cellules, soit vous ne pointez pas sur la bonne ligne où sont vos dates

      Reply

      • Erkan
        24/06/2021 @ 23:27

        J’ai passé plus de 4heures à vraiment tout essayé, mais je ne comprends pas pourquoi mes mois se terminent toujours le 28

    • Galifde
      06/07/2021 @ 11:06

      Bonjour, J'ai eu le même problème, pour le résoudre, j'ai changer la cellule de référence du mois !
      Dans l'exemple :
      If Month(Cells(23, Num_Col)) Cells(1, 1) Then 'renvoie vers la Cellule A1

      Modification de la cellule de réf pour le mois :
      If Month(Cells(23, Num_Col)) Cells(1, 3) Then 'renvoie vers la Cellule C1

      ça marche nickel,
      Merci Frédéric

      Reply

      • Galifde
        06/07/2021 @ 12:53

        Attention, il manque le symbole "diffèrent de" :
        If Month(Cells(23, Num_Col)) Cells(1, 3)

      • Laura Maggiore
        24/08/2021 @ 19:16

        Merci beaucoup pour votre aide, cela fonctionne également pour moi.
        Encore Merci !!!

    • Cezar
      16/07/2021 @ 09:40

      il faut mettre seulement le symbole "est supérieur" dans cette ligne du test :

      If Month(Cells(6, Num_Col)) > Cells(1, 1) Then

      et non >= car si vous mettez >= alors pour chaque mois le test sera vrai

      Reply

  6. Nicolas
    17/04/2021 @ 13:03

    Bonjour, j'ai essayé de rentrer cette formule mais mon calendrier est à la verticale.
    J'ai tenté cette formule :
    Sub Masquer_Jour()
    Dim Num_Lignes As Long
    For Num_Lignes = 31 To 33 ' Boucle sur les cellules des jours 29, 30 et 31
    If Month(Cells(2, Num_Lignes)) >= Cells(1, 1) Then
    Lignes(Num_Lignes).Hidden = True
    Else
    Lignes(Num_Lignes).Hidden = False
    End If
    Next
    Range("B3:I33").ClearContents 'Supprime le contenu dans les cellules
    End Sub

    mais cela ne fonctionne pas.

    Pouvez vous m'aider svp?

    Reply

  7. simo
    22/03/2021 @ 18:19

    bonjour
    j'ai créé un calendrier comme cela mais j'ai besoin de sauvgarder des valeurs dans le tableau pour chaque mois

    Reply

    • Frédéric LE GUEN
      22/03/2021 @ 20:01

      CE N'EST PAS POSSIBLE. On ne peut pas à la fois saisir des valeurs dans des cellules et également rappeler le résultat d'un mois précédent. Ce n'est pas le but d'Excel

      Reply

  8. Célia
    03/03/2021 @ 16:44

    Bonjour,
    J'ai la même ligne de code que vous, hormis pour le numéro des cases qui changent (tableau décalé). Cependant, les cases 28-29-30 et même les 31, ne disparaissent pas.
    De plus, toutes les lignes du tableau deviennent rouge (couleur de mes week end).
    Avez vous une idée du problème,

    Merci

    Reply

    • Kadafi
      20/05/2021 @ 18:32

      Bonjour,

      Pour les colonnes qui ne disparaissent pas, c'est normal car vous n' avez pas terminer tout le tutorial.
      Pour cela rendez-vous ici https://www.excel-exercice.com/creation-dun-calendrier-automatique/ , puis accéder à l'étape "Etape 11 : Lier les menus déroulants à la macro"

      Une fois que vous aurez terminer cette étape tout fonctionnera.

      Pour les lignes qui se mettent en rouge, j'ai également la même chose. Je n'ai pour le moment pas réussi à trouver d'où cela vient.

      Je vous en prie.

      Reply

  9. Christophe
    06/02/2021 @ 19:22

    bonjour

    Après plusieurs heures de recherche je me décide à vous demander si il est possible de modifier cette macro
    pour un tableau ou les dates sont verticales, plutôt que de perdre mon temps sur quelque chose d'impossible.
    Merci d'avance pour votre réponse

    Reply

    • Frédéric LE GUEN
      07/02/2021 @ 13:10

      Il suffit d'inverser l'écriture Cells(Num_Ligne,6) par Cells(6, Num_Ligne)

      Reply

      • christophe
        07/02/2021 @ 14:48

        Bonjour

        Merci pour votre réponse rapide, cela fonctionne par contre cela supprime les formules dans les cellules et elles ne réapparaissent pas en changeant de mois ; est ce que cela ne devrait pas simplement masquer la ligne ?

        Merci d'avance pour votre réponse

      • Cédric
        17/05/2021 @ 10:47

        Bonjour,

        J'ai le même soucis que "christophe", la macro efface l'intégralité du tableau et non les jours voulus (ceux du mois suivant).

        Voici ma macro

        Sub Masquer_Jour()
        Dim Num_Ligne As Long
        For Num_Ligne = 33 To 35 ' Boucle sur les cellules des jours 29, 30 et 31
        If Month(Cells(Num_Ligne, 1)) >= Cells(1, 1) Then
        Rows(Num_Ligne).Hidden = True
        Else
        Rows(Num_Ligne).Hidden = False
        End If
        Next
        Range("A5:G35").ClearContents 'Supprime le contenu dans les cellules
        End Sub

        Merci

      • Cédric
        27/05/2021 @ 09:39

        Bonjour,

        Déjà je m'excuse car en regardant un peu plus attentivement on voit que la ligne :
        "Range("A5:G35").ClearContents 'Supprime le contenu dans les cellules" comme c'est écrit supprime le contenu... (pas de commentaire)
        Puis en lisant plus attentivement (et non vite fait comme la première fois) je me suis rendu compte qu'il ne me manquait qu'à changer les lignes de référence pour le mois :
        If Month(Cells(Num_Ligne, 1)) >= Cells(1, 1) Then
        et voilà régler.
        Merci pour le tuto et bonne continuation

      • Frédéric LE GUEN
        27/05/2021 @ 10:51

        Et bien voilà une réponse qui fait plaisir. Oui il faut un peu chercher par soi-même. Quand on réalise un projet avec Excel, il y a toujours une part qui sera spécifique et où une adaptation sera à réaliser. Toutes les réponses ne sont pas sur le web, il faut encore parfois réfléchir ;)

      • Crispim
        21/12/2021 @ 21:48

        Bonsoir
        Je me suis appuyer sur votre calendrier mais je les disposé avec les jours verticales.
        Je suis novices dans les macros pourriez vous stp m'aider
        Je vous remercie par avance
        Michel

      • Frédéric LE GUEN
        21/12/2021 @ 22:41

        C'est pourtant expliqué dans l'article. Dans toutes les instructions Cells(ligne, colonne) il faut que vous mettiez la variable sur le paramètre de la ligne et non pas de la colonne

  10. JC
    31/01/2021 @ 18:53

    Bonjour,

    Merci pour ce tuto et ces explications.
    Par contre, je constate (comme déjà évoqué dans un des commentaires) lorsque que je veux remplir mon planning, dés que je change de mois (ou d'année) tout s'efface et impossible de conserver une information d'un mois sur l'autre. Est ce que quelqu'un pourrait me conseiller et me dire comment conserver les données d'un mois sur l'autre ?

    Merci d'avance à toutes les personnes qui répondront à mon interrogation.

    Reply

  11. Florence
    15/12/2020 @ 11:53

    Bonjour,
    Merci pour votre Tuto qui m'a faciliter la vie mais j'ai problème !
    J'ai crée exactement le même calendrier que vous, mais lorsque je veux entrer la macro il y à une erreur syntaxe qui me bloque.
    Voici mon code :
    Sub Masquer_Jour()

    Dim Num_Col As Long
    For Num_Col = 30 To 32
    If Month(Cells(6, 30), Cells(6, 31), Cells(6, 32)> Cells(1, 1) Then
    Columns(Num_Col).Hidden = True
    Else
    Columns(Num_Col).Hidden = False
    End If
    Next

    End Sub

    Quelqu'un peut il m'aider à finaliser correctement ce calendrier ?? Merci d'avance

    Reply

    • Kadafi
      20/05/2021 @ 18:14

      Bonjour,

      Il manque une parenthèse dans l'instruction suivante :
      If Month(Cells(6, 30), Cells(6, 31), Cells(6, 32)> Cells(1, 1) Then

      Ecrivez plutôt :
      If Month (Cells(6, 30), Cells(6, 31), Cells(6, 32)) > Cells(1, 1) Then

      Vous avez en effet oublier de fermer les parenthèses de la fonction MONTH.

      Reply

    • Kadafi
      20/05/2021 @ 18:37

      Bonjour,

      Non vous n'avez pas créer le même calendrier que lui.
      Plutôt que d'écrire :
      For Num_Col = 30 To 32
      If Month(Cells(6, 30), Cells(6, 31), Cells(6, 32)> Cells(1, 1) Then

      Ecrivez :
      For Num_Col = 30 To 32
      If Month(Cells(6, Num_Col))> Cells(1, 1) Then

      Car dans votre code vous utilisez mal la boucle for.

      Je vous en prie.

      Reply

  12. Manuela Da costa
    23/11/2020 @ 14:37

    Bonjour,
    J'ai suivi votre tuto à la lettre même ligne même colonne. Seulement la macro ne fonctionne pas pour la premier ligne Sub MAsquer_Jour() elle s'affiche en jaune fluonje ne comprends pas pourquoi.
    Et les lignes à la suite du 30 et 31 sont toujours affichées.
    Merci d'avance pour votre retour

    Reply

  13. Sparadrap
    30/10/2020 @ 10:53

    Bonjour,
    J'aidais une amie à régler avancer dans ses exercices quand je me suis rendu compte que votre site web injecte des grosses erreur dans le code de vos macros. On a vite compris pourquoi elle avançait pas.

    la ligne :
    If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then

    Devrait etre remplacée par :
    If Month(Cells(6, Num_Col)) > Cells(1, 1) Then

    et la ligne :
    Range("B6:AF13").ClearContents 'Supprime le contenu dans les cellules

    Devrait être remplacée par :
    Range("B6:AF13").ClearContents 'Supprime le contenu dans les cellules

    La raison de ces injections est simple, vous ne gérez pas bien l'encodage des caractères de vos pages web, du coup certains caractères spéciaux ne s'affiche pas correctement, un simple guillemet se transforme en """ ou une simple flèche se transforme en ">"

    Pour le bien des débutants, ce serait sympa de corriger tout ça :)

    Reply

    • Frédéric LE GUEN
      30/10/2020 @ 11:22

      Mille mercis,
      C'est effectivement le genre de coquille qui peut arriver mais qui n'est visible qu'au moment de la publication.
      C'est corrigé

      Reply

  14. Emy
    10/09/2020 @ 12:09

    Bonjour,

    Je retourne tout dans tous les sens depuis 2 jours...concernant la macro. Mes colonnes AD AE AF sont bien masquées, mais TOUS les mois de toutes les années. Je ne comprends pas pourquoi. Quelqu'un pourrait-il m'aider ? Le premier jour des dates de mon tableau commence en B6, fini en AF (31 jours)

    Reply

  15. khalil
    06/09/2020 @ 18:20

    bonjour;
    j'ai bien suivi le tuto mais j'ai eu un soucis avec la macro pour masquer les jours car le calendrier que j'ai édité est inversement au votre (jours verticalement positionnés) est ce que ça affecte la macro.

    Merci par avance pour votre aide

    Reply

  16. HP
    31/08/2020 @ 15:53

    bonjour, je n'arrive pas a transferer la macro en mode verticale ??? pourriez vous m'aider !!

    Reply

  17. Émilie
    09/07/2020 @ 18:08

    Bonsoir,
    J’ai cree un document suite à votre tutoriel Excel mais je suis complètement perdue pour le macro : “masquer jour”
    pouvez-vous m’aider svp si je vous envoie mon document ?
    Merci bcp.

    Reply

    • Poussin
      23/11/2020 @ 16:09

      Tout partait si bien....

      Très très mais alors très déçu de la fin... alors que j'ai respecté le format du tableau, la macro masque systématiquement les derniers jours, mon tableau s'arrête à 28 jours...

      Je viens de perdre une après midi entière à essayer de résoudre le problème en vain...

      Je ne recommande donc pas votre tuto pour les prochains lecteurs.

      Reply

  18. Guest
    27/06/2020 @ 07:41

    Bonjour,

    Voici ce que nous avons écrit pour que la macro fonctionne (Suite Office 2016):

    Sub Masquer_Jour()

    Dim Num_Col As Long
    For Num_Col = 30 To 32
    If Month(Cells(12, Num_Col)) > Cells(1, 1) Then
    Columns(Num_Col).Hidden = True
    Else
    Columns(Num_Col).Hidden = False
    End If
    Next
    Range("B13", "AF15").ClearContents
    End Sub

    Mon calendrier commence à B12. Faire commencer le Range().ClearContents à B13 car sinon c'est toute la 1re ligne de B12 qui disparaît...

    Comme Moualek, j'ai espéré que le calendrier permettrait de garder les données en mémoire, mais passer d'un mois à l'autre ne fait que supprimer définitivement les données (si on revient sur le mois avec les données, il n'y a plus rien)...
    Par conséquent, pour ceux qui espèrent mettre en place un planning de congés pour une équipe ou mettre des données quelconque en mémoire au fur et à mesure du calendrier, ce n'est pas l'outil adéquat, en tout cas en l'état.

    Reply

  19. MOUALEK
    24/06/2020 @ 01:09

    Bonjour,

    Merci pour ce tuto. Franchement très bien fait!! Bravo!

    J'ai cependant deux questions :

    La ligne : "If Month(Cells(8, Num_Col)) >= Cells(1, 1) Then" apparait en rouge et semble faire buguer la macro. Le 8 correspond pourtant bien à la ligne des dates de mon tableau et Cells(1,1) correspond bien aux coordonnées de la cellule ou apparait le nombre du mois de mes listes déroulante.

    Par ailleurs, cette ligne de code semble non buguée : Range("C9:AG11").ClearContents mais celle-ci l'est : Range("C9:AG11").ClearContents
    J'ai testé les deux sans pour autant être sur de comprendre la nuance entre les deux. Je me disais que la deuxième pourrait permettre de clean le tableau quand on change de mois sans pour autant effacer les données définitivement. Ce qui permettrait de les retrouver en revenant sur le dit mois par la suite. Pur spéculation ou espoir de ma part.

    Encore merci pour tout!

    Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

MICROSOFT MVP

RECHERCHE D’EMPLOI AVEC

Back to top