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

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.

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)
) 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
9 commentaires
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
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 :)
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é
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)
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
bonjour, je n'arrive pas a transferer la macro en mode verticale ??? pourriez vous m'aider !!
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.
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.
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!