Expert

Explication de la macro du calendrier automatique

Temps de lecture 3 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

Related posts

Macro et langage VBA

Frédéric LE GUEN

Comprendre les macros VBA

Frédéric LE GUEN

Forcer la mise à jour d’Office

Frédéric LE GUEN

33 commentaires

Steven 13/08/2021 at 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 !

Répondre
Erkan Zekiri 24/06/2021 at 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??

Répondre
Frédéric LE GUEN 24/06/2021 at 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

Répondre
Erkan 24/06/2021 at 23:27

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

Répondre
Galifde 06/07/2021 at 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

Répondre
Galifde 06/07/2021 at 12:53

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

Répondre
Laura Maggiore 24/08/2021 at 19:16

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

Répondre
Cezar 16/07/2021 at 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

Répondre
Nicolas 17/04/2021 at 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?

Répondre
simo 22/03/2021 at 18:19

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

Répondre
Frédéric LE GUEN 22/03/2021 at 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

Répondre
Célia 03/03/2021 at 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

Répondre
Kadafi 20/05/2021 at 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.

Répondre
Christophe 06/02/2021 at 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

Répondre
Frédéric LE GUEN 07/02/2021 at 13:10

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

Répondre
christophe 07/02/2021 at 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

Répondre
Cédric 17/05/2021 at 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

Répondre
Cédric 27/05/2021 at 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 at 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 ;)

JC 31/01/2021 at 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.

Répondre
Florence 15/12/2020 at 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

Répondre
Kadafi 20/05/2021 at 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.

Répondre
Kadafi 20/05/2021 at 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.

Répondre
Manuela Da costa 23/11/2020 at 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

Répondre
Sparadrap 30/10/2020 at 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 :)

Répondre
Frédéric LE GUEN 30/10/2020 at 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é

Répondre
Emy 10/09/2020 at 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)

Répondre
khalil 06/09/2020 at 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

Répondre
HP 31/08/2020 at 15:53

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

Répondre
Émilie 09/07/2020 at 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.

Répondre
Poussin 23/11/2020 at 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.

Répondre
Guest 27/06/2020 at 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.

Répondre
MOUALEK 24/06/2020 at 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!

Répondre

Laissez un commentaire

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