Comment créer un sapin de Noël sur Excel ?
Dans ce tutoriel, nous allons découvrir comment créer facilement un sapin de Noël sur Excel en utilisant une petite macro en VBA.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
Partie 1 : Construire le sapin de Noël;
Partie 2 : Illuminer le sapin de Noël;
1. Introduction
Comme nous venons de le voir dans l’introduction de ce tutoriel, nous allons maintenant découvrir comment créer un sapin de Noël sur Excel.
Bien entendu, nous pourrions de le créer directement à la main en colorant des cellules, et en utilisant des mises en forme conditionnelles.
Mais cela serait bien trop fatigant, surtout en cette période de fête, autant demander à Excel de le faire à notre place en construisant une toute petite macro-commande en VBA.
Pour que ce tutoriel soit accessible à tout le monde, nous allons revenir dans le détail sur chaque aspect de cette dernière.
Si vous souhaitez aller plus loin dans la découverte du langage VBA, vous pouvez évidemment consulter la formation disponible sur le blog en cliquant ici.
Mais avant de commencer le développement de la macro, nous allons devoir préparer la feuille de calcul pour recevoir notre sapin.
Pour cela, il va nous suffire de redimensionner les cellules pour leur donner une forme de carré.
Nous commençons donc par sélectionner toutes les cellules de la feuille en cliquant sur le petit bouton situé en haut à gauche, à l’intersection des en-têtes de lignes et des colonnes :
Puis il ne nous reste plus qu’à placer le curseur de la souris sur l’une des lignes de séparation des colonnes et de faire glisser le curseur de la souris vers la gauche, tout en maintenant le bouton de la souris enfoncé, jusqu’à obtenir des cellules carrées :
Cela étant fait, nous allons pouvoir créer notre macro-commande.
2. Création de la macro VBA
Pour commencer, nous allons lancer l’éditeur de code VBE (pour Visual Basic Editor), qui est l’éditeur de code intégré dans les différentes applications de la suite Office et qui permet de développer des macro-commandes en VBA.
Pour cela, nous appuyons simplement sur les touches [Alt]+[F11] :
VBE s’ouvre alors et nous allons commencer par créer un nouveau module.
Un module est une feuille de saisie de code dans laquelle nous allons pouvoir saisir nos macros et fonctions.
Pour insérer un nouveau module, nous nous rendons dans le menu Insertion > Module :
Une fois le module inséré, nous allons pouvoir y créer notre macro en utilisant le mot-clé Sub, suivi du nom de la macro :
Sub sapin()
End Sub
Lorsque nous validons la création de la macro en appuyant sur la touche Entrée, Excel ajouter automatiquement la ligne End Sub qui va marquer la fin de la macro.
Tout ce que nous allons saisir entre ces deux lignes sera exécuté chaque fois que nous appellerons notre macro.
Pour commencer, nous allons stocker la taille que nous voudrons donner à notre sapin, exprimé en cellules.
Pour cela, nous créons une variable que nous appelons tailleSapin et que nous typons en tant que nombre entier avec le mot-clé Integer :
Dim tailleSapin As Integer
tailleSapin = 30
Notre sapin mesurera donc 30 cellules de haut, et il suffira de modifier cette valeur pour modifier sa taille.
Ensuite nous allons créer une boucle pour dessiner le sapin, en déclarant une nouvelle variable i et en mettant en place une boucle For Next :
Dim i As Integer
For i = 0 To tailleSapin
Next
Nous verrons débuter le haut du sapin au nouveau de la cellule active, puis nous effectuerons un décalage de cellule avec la fonction Offset() pour modifier la couleur de la cellule :
Dim i As Integer
For i = 0 To tailleSapin
ActiveCell.Offset(i, 0).Interior.Color = 6805410
Next
Nous pouvons maintenant tester la macro en appuyant sur la touche [F5] :
Pour le moment, notre sapin semble être un peu plat, et nous allons lui donner un peu de volume.
Pour cela, nous insérons une seconde boucle dans la première :
Dim i As Integer, j As Integer
For i = 0 To tailleSapin
For j = -i To i
ActiveCell.Offset(i, j).Interior.Color = 6805410
Next
Next
Ici, la boucle commence par donner à la valeur j l’inverse de la valeur i et aura pour valeur maximale la valeur de i.
De cette manière, en utilisant cette variable j comme élément de décalage de la cellule, nous commencerons à distinguer la création d’un sapin… triangulaire :
Pour éviter que les lancements successifs de sapin ne se chevauchent les uns et les autres, nous insèrerons au tout début de la macro une ligne qui se chargera de supprimer tout le contenu de la feuille en supprimant toutes les cellules :
Cells.Clear
Maintenant, pour donner une forme plus « naturelle » à notre sapin, il suffit de diviser la valeur de début et de fin données à la valeur j dans la seconde boucle :
For j = -i / 2 To i / 2
ActiveCell.Offset(i, j).Interior.Color = 6805410
Next
À présent, si nous créons notre sapin en sélectionnant une cellule située proche du bord de la fenêtre, nous pourrons constater que cela aura pour effet de faire crasher la macro, car le sapin sortirait de la feuille de calculs :
Pour régler ce problème le plus simplement possible, il suffit d’insérer la ligne suivante juste avant la boucle :
On Error Resume Next
De cette manière, lorsque la macro-commande va rencontrer une situation génératrice d’une erreur, Excel pourra passer outre et continuer son déroulement normalement, sans s’en soucier.
Pour finir notre sapin, il ne reste plus qu'à ajouter le tronc pour le soutenir.
Pour cela, nous créons une nouvelle double boucle en dessous :
For i = tailleSapin + 1 To tailleSapin + 5
For j = -1 To 1
ActiveCell.Offset(i, j).Interior.Color = 1522363
Next
Next
Cela nous permettra de créer un rectangle de 3 cellules de large par 5 cellules de haut :
Celui-ci est placé juste en dessous du sapin, au centre.
Maintenant, pour simplifier la création du sapin, nous allons pouvoir créer un bouton sur la feuille de calcul qui se chargera de lancer la macro.
Pour cela, nous nous rendons dans le menu Insertion du ruban, afin de sélectionner l’objet zone de texte, et nous dessinons le bouton souhaité directement sur la feuille de calcul :
Ensuite, nous saisissons le texte souhaité sur le bouton et nous le mettons en forme.
Il ne reste plus qu’à effectuer une clic-droit sur la zone de texte nouvellement créée pour sélectionner l’option Affecter une macro :
Dans la fenêtre qui s’affiche à l’écran, nous choisissons la macro « sapin » et nous validons la création du lien avec le bouton en appuyant sur le bouton [OK].
Il ne reste plus qu’à lancer la macro en appuyant sur le bouton « Créer un nouveau sapin ».
Si vous trouvez que votre sapin est un peu trop long à être mis en place, il vous suffit d’utiliser les techniques découvertes dans l’article « Comment accélérer vos macros VBA sur Excel (jusque 25x plus rapide) ? », notamment celle qui consiste à stopper momentanément l’actualisation de l’affichage en insérant les lignes suivantes avant et après la boucle de construction du sapin :
Application.ScreenUpdating = False
…
Application.ScreenUpdating = True
3. Ajouter des boules dans le sapin
Maintenant que notre sapin est finalisé, il ne reste plus qu’à insérer des boules positionnées de manière aléatoire, avec des couleurs elles aussi aléatoires.
Pour cela, nos commençons par créer une variable dans laquelle nous allons stocker les couleurs à affecter à ces boules :
Dim tableCouleurs As Variant
tableCouleurs = Array(3, 4, 6, 7, 8)
Cette déclaration de variable est à insérer avant le lancement de la boucle.
Cette variable tableCouleurs est donc un Array dans laquelle nous stockons des index de couleurs que nous pourrons ensuite récupérer avec la propriété ColorIndex.
Pour retrouver toutes les couleurs utilisables avec cette propriété, il suffit de créer une toute petite macro, puis de la lancer :
Sub listeCouleurs()
Dim i As Integer
For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Cells(i, 1) = i
Next
End Sub
Et nous retrouvons alors la liste des couleurs directement sur la feuille de calculs :
Libre à vous de choisir vos propres couleurs ;)
Ensuite, nous revenons dans la boucle, juste après avoir modifié la couleur de fond de la cellule, afin d’insérer un caractère spécial qui nous donnera l’apparence d’une boule de sapin (un rond plein).
Pour cela, nous utilisons simplement la fonction ChrW() qui fonctionne comme la fonction Excel UNICAR() :
ActiveCell.Offset(i, j).Value = ChrW(9899)
Ensuite, nous lui affectons une couleur en piochant au hasard l’une des couleurs stockées dans la variable tableCouleurs :
ActiveCell.Offset(i, j).Font.ColorIndex = tableCouleurs(CInt(Rnd * 4))
Ici, nous utilisons la fonction VBA Rnd que nous multiplions par quatre pour obtenir une valeur aléatoire comprise en 0 et 4.
Nous encapsulons ce résultat à l’intérieur de la fonction CInt afin de n’en conserver que la partie entière.
Pour finir, nous donnons une taille aléatoire à ces boules en modifiant la taille des polices de caractères avec la propriété Font.Size :
ActiveCell.Offset(i, j).Font.Size = CInt(Rnd * 10) + 1
Pour être sûr que les boules soient bien centrées dans les cellules, nous modifions l’alignement vertical et horizontal avant le lancement de la boucle :
Cells.VerticalAlignment = xlCenter
Cells.HorizontalAlignment = xlCenter
Et voilà, les boules sont maintenant insérées dans notre sapin, nous pouvons relancer la macro en cliquant sur le bouton « Créer un nouveau sapin » :
4. Animer les boules
Maintenant que les boules de Noël trônent fièrement sur notre sapin, il ne reste plus qu’à les animer !
Pour cela, nous allons fortement nous inspirer de la technique d’animation que nous avions déjà utilisée dans le tutoriel dédié au déplacement de Pikachu sur la feuille de calculs.
Le fonctionnement de cette technique est très simple :
- Lorsque l’animation commence, nous saisissons un texte dans une cellule, par exemple « Joyeux Noël »
- Puis nous lançons la macro d’animation, laquelle se lance en boucle tant que ce texte reste inchangé
- Entre chaque lancement, nous insérons une mini-pause qui va permettre d’une part de limiter la vitesse d’animation afin que celle-ci reste bien visible, et d’autre part en y insérant l’instruction DoEvents, nous permettrons de conserver la possibilité d’effectuer des opérations en parallèle, comme le fait de cliquer sur un bouton
- Ce bouton nous permettra de modifier la valeur de la cellule dans laquelle le texte « Joyeux Noël » est inséré
Pour commencer, nous créons donc la macro demarrerAnimation qui va afficher le texte dans la cellule A1 :
Sub demarrerAnimation()
[a1] = "Joyeux Noël"
End Sub
Cette macro demarrerAnimation est à lancer directement depuis la macro de création du sapin (à la toute fin) :
Sub sapin()
…
demarrerAnimation
End Sub
Puis, nous créons une seconde macro animerSapin, que nous appelons directement depuis cette dernière :
Sub demarrerAnimation()
[a1] = "Joueux Noël"
animerSapin
End Sub
Sub animerSapin()
End Sub
Dans cette macro animerSapin, nous créons une boucle Do While… Loop.
Ce type de boucle permet de répéter une opération tant qu’une condition est remplie :
Do While [a1] = "Joyeux Noël"
Loop
Ici, l’instruction sera à répéter tant que la valeur de la cellule A1 contiendra le texte « Joyeux Noël ».
Enfin, dans cette boucle, nous modifierons simplement la taille des boules en jouant sur la propriété Font.Size.
Nous augmenterons ainsi cette propriété jusqu’à une taille de 11, après quoi celle-ci reviendra à 1.
Pour passer en revue toutes les cellules utilisées sur la feuille, nous lançons une boucle For Each à partir de l’objet ActiveSheet.UsedRange qui reprend la plage des cellules utilisées de la feuille de calcul :
Do While [a1] = "Joyeux Noël"
Dim c As Range
For Each c In ActiveSheet.UsedRange
Next
Loop
En utilisant cette méthode, nous modifierons également la taille des textes contenus dans les cellules contenant des boules de Noël, mais ce n’est pas grave, celle-ci étant vide.
Ensuite, nous incrémentons la taille des textes de la cellule c :
c.Font.Size = c.Font.Size +1
Et si cette valeur est supérieure à 11, nous lui affectons une taille de police de 5 :
If c.Font.Size > 11 Then
c.Font.Size = 5
End If
Bien entendu, nous pourrions raccourcir ce code en utilisant l’opérateur Mod qui permet d’obtenir le reste d’une division euclidienne, mais en procédant comme nous venons de le faire, le code sera bien plus simple à appréhender pour les débutants.
Ensuite, comme nous l’avons vu un peu plus tôt, nous allons maintenant mettre en place une pause dans l’exécution du code, en utilisant la macro dédiée que nous avions mise en place dans le tutoriel consacré à cette notion :
Sub pause(duree As Double)
Dim finPause As Double
finPause = Timer + duree
Do While Timer < finPause
DoEvents
Loop
End Sub
Nous allons par exemple insérer une pause de 0.2 seconde juste avant la fin de la boucle Do While :
pause (0.2)
Bien entendu, nous pourrons effectuer des tests afin de voir quelle est la durée idéale de la pause à mettre en place.
Comme pour la construction du sapin, si nous souhaitons que l’animation soit suffisamment fluide à l’écran, nous allons devoir stopper provisoirement le rafraichissement de l’affichage en insérant de part et d’autre de la boucle For Each les commandes :
Do While [A1] = "Joyeux Noël"
Application.ScreenUpdating = False
…
Application.ScreenUpdating = True
Loop
Attention de ne surtout pas lancer la macro à ce moment-là, car nous n’avons pas encore mis en place de méthode pour sortir de cette boucle !
Pour cela, il suffit de créer une macro que nous appelons arreterAnimation, laquelle se contentera de supprimer le texte contenu dans la cellule A1 :
Sub arreterAnimation()
[A1] = ""
End Sub
Il ne nous reste plus qu’à créer un bouton pour lancer cette macro directement depuis la feuille de calculs :
Bien entendu, et comme toujours lorsque nous mettons en place une animation sur une feuille de calculs, la fluidité et le rendu visuel de celle-ci dépendront fortement des ressources disponibles sur le poste de travail sur lequel elle est lancée.