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

Articles complémentaires

Voici une liste d'articles qui pourrait également vous intéresser sur le même thème.

Lien Permanent pour cet article : https://www.excel-exercice.com/explication-de-la-macro-du-calendrier-automatique/


Laisser un commentaire

Your email address will not be published.

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