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. Si vous n'avez jamais construit de macro, il est indispensable de connaître les bases de la programmation dans cet article.
Voici le code utilisé dans le calendrier pour masquer les jours.
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
Si vous souhaitez un calendrier qui enregistre les données d'un mois sur l'autre, reportez-vous à cet article ou télécharger le fichier.
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 que nous pourrons lier 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

Ligne 4 : Test entre le mois calculé et le mois sélectionné
Toute l'astuce de la macro du calendrier 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.

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.

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)
sont 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
Conclusion
Comme vous l'avez constaté, même si la macro du calendrier est courte (8 lignes de code), chaque ligne est importante et à un rôle bien défini. Aussi, il est important de bien comprendre le code avant de faire des modifications.
16/02/2025 @ 16:00
Bonjour j'aimerais savoir pourquoi quand j'ouvre le visuel basic je ne vois aucune ligne de code comme vous ?
merci
16/02/2025 @ 17:05
Avez-vous enregistrer votre macro au format xlsm ?
17/01/2025 @ 16:12
Re-bonjour l'idée c'est de supprimer le contenu en passant au mois suivant et le conserver lorsque l'on revient au mois précédent.
Comment faire ?
Voici ma macro :
Sub Masquer_Jour()
Dim Num_Col As Long
Range("D7:AH14").ClearContents
For Num_Col = 32 To 34
If Month(Cells(6, Num_Col)) Cells(1, 3) Then
Columns(Num_Col).Hidden = True
Else
Columns(Num_Col).Hidden = False
End If
Next
End Sub
21/01/2025 @ 03:25
Bonjour, pour cela il faut que vous achetiez le calendrier automatique (lien dans l'article). Le travail est compliqué et a demandé plusieurs jours de développement en VBA. Le code fait plusieurs milliers de lignes pour prendre en considération tous les cas de figure (ajout d'un salarié, suppression d'un salarié, modification d'une valeur, suppression d'une seule valeur, ....)
17/01/2025 @ 16:03
Bonjour,
Comment fait-on pour que les données inscrites à chaque mois restent enregistrées et ne s'écrasent pas ? Lorsque l'on change de mois les données inscrites au mois précédent s'effacent ce qui est très contraignant... Y a-t-il une solution de contournement à cela ? Retirer le clear contents n'est pas suffisant pour information
voici ma macro :
Sub Masquer_Jour()
Dim Num_Col As Long
Range("D7:AH14").ClearContents
For Num_Col = 32 To 34
If Month(Cells(6, Num_Col)) Cells(1, 3) Then
Columns(Num_Col).Hidden = True
Else
Columns(Num_Col).Hidden = False
End If
Next
End Sub
Merci par avance pour votre retour.
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.
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.
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
26/04/2022 @ 00:45
Il faut supprimer la ligne de la macro ClearContents
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 !
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 >
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??
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
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
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
06/07/2021 @ 12:53
Attention, il manque le symbole "diffèrent de" :
If Month(Cells(23, Num_Col)) Cells(1, 3)
24/08/2021 @ 19:16
Merci beaucoup pour votre aide, cela fonctionne également pour moi.
Encore Merci !!!
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
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?
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
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
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
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://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.
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
07/02/2021 @ 13:10
Il suffit d'inverser l'écriture Cells(Num_Ligne,6) par Cells(6, Num_Ligne)
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
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
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
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 😉
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
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
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.
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
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.
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.
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
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 🙂
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é
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)
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
31/08/2020 @ 15:53
bonjour, je n'arrive pas a transferer la macro en mode verticale ??? pourriez vous m'aider !!
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.
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.
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.
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!