Les fondamentaux VBA :

Introduction :

Combien de fois avez-vous réalisé une tâche rébarbative sur Excel aujourd'hui ? Vous savez, ces tâches fastidieuses qui nécessitent des actions répétitives et vous font perdre un temps précieux. Et si je vous disais qu'il existe une solution pour automatiser ces tâches en seulement quelques clics ? Intéressant, non ?

Dans ce cours, on va voir les fondamentaux du VBA, ou Visual Basic for Applications, un outil puissant intégré aux applications de Microsoft Office, qui est un langage de programmation qui vous permet d'automatiser des tâches répétitives, de créer des macros pour vous aider à manipuler et traiter vos données de manière efficace.

La particularité du VBA est qu'il est intégré directement à Excel. Même si vous n'êtes pas un exert en programmation, vous pouvez facilement apprendre à utiliser le VBA, car il utilise une syntaxe simple et intuitive. Vous pouvez par exemple rapidement automatiser des tâches telles que la génération de rapports, le tri et le filtrage de données, la création de graphiques, la consolidation de fichier, l'importation et l'exportation de données, et bien plus encore.

Imaginez le temps que vous pourriez gagner en évitant de faire manuellement ces tâches répétitives. Le VBA permet de gagner en productivité en automatisant les tâches !

VBA :

Commençons par une définition la plus simple possible. Le Visual Basic forApplication, ou VBA, est un langage de programmation dérivé du Visual Basic (VB) créé par Microsoft en 1993. C'est donc un langage de programmation qui utilise un programme comme hôte.

Souvent, les langages de programmation s'utilisent sans application tierce. Le VBA c'est exactement l'inverse, il a toujours besoin d'une application pour fonctionner, d'où la notion d'Application dans Visual Basic for Application, et non tout simplement du Visual Basic.

Dans notre cas, l'application va être Excel, Word, Access ou Outlook (tous les logiciels de la suite Office permettent d'exécuter du VBA). C'est pourquoi quand nous entendons "VBA", c'est souvent pour faire référence à une macro dans une application Office (macro Excel, par exemple).

Une macro Excel est simplement un morceau de code qui va s'exécuter pour faire des actions à notre place. La macro Excel est simplement du code VBA.

Avant de commencer à parler du VBA et de détailler quelques cas d'usage, nous allons essayer de comprendre pourquoi nous en avons besoin.

Que ce soit à titre personnel ou professionnel, il arrive parfois plusieurs fois les mêmes actions dans un projet. Et vous en conviendrez, cela a peu de valeur ajoutée de refaire toujours la même chose. Vous pourriez utiliser votre temps à faire autre chose. C'est pourquoi nous allons automatiser les tâches avec une macro Excel (donc du VBA).

Imaginons que vous êtes analyste dans une entreprise.

Tous les matins, après avoir pris votre café et être revenu à votre bureau, vous devez regarder les chiffres de vente de la veille. Tous les matins, vous devez faire les mêmes actions :

  • ajouter une nouvelle feuille;

  • renommer cette feuille en "Data";

  • ouvrir le fichier Excel contenant les données;

  • sélectionner la zone à copier dans le fichier puis copier les données;

  • coller les informations dans la feuille Data que vous venez de créer;

  • mettre en place un filtre sur la première ligne;

  • trier des produits du plus grand au plus petit (pour voir les top produits vendus)

  • créer une mise en forme conditionnelle (sous la forme rouge, jaune et vert en fonction de la quantité de produits vendus);

  • enregistrer le fichier dans le dossier.

Pour faire cela, vous allez prendre 10 minutes tous les matins à réaliser ces différentes actions. Si vous écrivez une macro Excel en VBA, vous pouvez faire tout cela de façon automatique et en quelques secondes !

Voilà tout l'intérêt du VBA :

  • Fiabilité : La macro va exécuter le code tous les matins de la même façon. Que ce soit vous ou une autre personne qui exécute le code, le résultat sera toujours le même.

  • Gain de temps : Vous n'aurez plus à perdre 10 minutes tous les matins pour des actions répétitives, votre code le fera pour vous.

  • Rapidité d'exécution : La séquence d'exécution du code est bien plus rapide à faire une fois qu'elle est programmée. Il est assez fréquent que l'utilisateur passe plusieurs minutes à faire plusieurs actions, et que la macro réalise les mêmes actions en seulement quelques secondes.

Mais le VBA ne peut pas avoir que des avantages, il a quelques inconvénients tout de même :

  • Périmètre d'utilisation : C'est le principal frein du VBA : c'est un langage qui s'utilise principalement avec les logiciels de la suite Office. Il y a bien d'autres applications qui utilisent un peu de VBA, mais c'est à la merge.

  • L'apprentissage : Rapidement, l'enregistreur de macro ne suffit plus et il faudra passer par l'apprentissage du VBA pour améliorer le fonctionnement d'une macro (c'est pour cela que nous sommes ensemble aujourd'hui).

Il y a une bonne nouvelle supplémentaire, l'apprentissage du VBA va vous ouvrir les portes de la programmation. Tous les langages fonctionnent plus ou moins de la même façon. On retrouve dans tous les langages des variables, des boucles, des sous-programmes, des bibliothèqyes, des objets, etc. Ce n'est donc pas perdu, au contraire ! Vous allez commencer par un des langages les plus simples à apprendre.

Identifiez les cas d'usage de VBA :

Maintenant que nous avons défini les différents concepts et l'utilisation que nous pouvons en faire, nous allons définir les cas d'usage du VBA. Quand allons-nous l'utiliser et dans quel but ?

Nous pouvons lister 4 principaux cas d'usage :

  • automatisation simple;

  • traitement automatique;

  • automatisation complète;

  • ERP (Enterprise Resource Planning) professionnel complet.

L'automatisation simple dans un fichier pourrait s'apparenter à la petite séquence que nous avons vue plus haut. Un utilisateur qui fait tous les jours différentes actions sur un fichier afin de faire une mise en forme, quelques copier-coller, un peu de nettoyage du fichier. Ce sont des actions simples mais récurrentes.

Vous commencerez souvent le VBA avec des macros qui permettent de faire une automatosation simple des différentes actions. Puis, quand vous êtes un peu plus à l'aise, on comprend tout l'intérêt d'aller plus loin dans l'automatisation. Vous passez donc à des traitements automatiques plus complexes, comme par exemple compiler plusieurs fichiers ensemble, faire du nettoyage des données, mettre à jour des reportings, créer des visualisations automatiquement, etc. Ce type de traitement est plus lourd et requiert de meilleures connaissances en VBA.

Puis quelques mois ou années plus tard, après avoir automatisé des traitements, vous commencez à vous dire que finalement vous pourriez aller encore plus loin. AU lieu de compiler des fichiers Excel, vous pourriez exécuter des requêtes SQL dans des bases de données, faire un nettoyage des données plus poussée, puis mettre à jour un reporting et faire une analyse que vous allez envoyer par e-mail automatiquement avec votre macro Excel. C'est ce que nous pouvons appeler une automatisation complète d'une tâche.

Mais en fait, on peut faire plein de choses avec le VBA ! Bientôt, je vais finir par vous dire qu'on peut faire fonctionner une entreprise avec du VBA ? Figurez-vous... que oui ! Il est tout à fait possible d'utiliser des macros VBA qui s'appuient sur la suite Office, pour fabriquer un petit ERP pour une entreprise. Il faut évaluer la cohérence entre notre projet et l'utilisation que l'on peut faire de cet outil. Cette solution est utilisée par certaines entreprises qui ont des besoins très spécifiques. Nous pourrions appeler cela un ERP d'entreprise. Avec, nous pourrions utiliser des macros Excel pour gérer la base de données clients via des formulaires par exemple, puis mettre à jour la base de données ou encore gérer la production d'une usine en fonction des besoins, des demandes des clients.

Vous seriez étonné de voir le nombre de grandes entreprises qui utilisent encore ce type d'outil pour des besoins spécifiques.

Définissez une séquence à automatiser :

Maintenant que nous avons défini le VBA et que vous avez compris son utilité, il est temps de commencer à l'utiliser. Vous allez commencer par utiliser l'enregistreur de macro dans Excel.

Un enregistreur de macro, c'est quelque chose qui enregistre du code ? Vous y êtes presque : l'enregistreur de macro est un outil qui va retranscrire tout ce que vous allez faire sur Excel en code VBA automatiquement. Ainsi, vous n'avez pas besoin d'écrire du code, le logiciel le fait pour vous.

C'est une bonne nouvelle, ça ! Pas besoin d'apprendre le VBA alors, puisqu'un outil va traduire nos actions en code ! Comme souvent, ce n'est pas aussi simple que cela : effectivement l'enregistreur de macro retranscrit des actions en code VBA, et c'est une bonne nouvelle. Vous allez pouvoir commencer par essayer de comprendre le code, puis apporter des modifications mineures. Il y a quand même une limitation à cela :

  • d'une part, le code n'est pas optimisé;

  • d'autre part, il ne permet pas d'utiliser des variables, des boucles, des tests, etc.

Nous verrons cela plus tard, mais c'est important de comprendre ce que vous pouvez faire ou ne pas faire avec l'enregistreur de macro. Finalement, une macro, ce n'est ni plus ni moins que du code VBA qui est écrit automatiquement en fonction des actions que vous allez faire avec votre souris ou votre clavier.

Bon OK, ce n'est pas aussi simple que ce que vous avez pensé au début; on l'enregistre quand cette macro ?! Nous y arrivons, mais avant cela, il nous reste encore une chose à définir. En effet, si nous voulons enregistrer une macro, c'est que nous allons faire des actions dans un ordre bien plus précis que nous souhaitons par la suite refaire automatiquement. Cela implique donc que cette séquence soit logique et bien définie dès le départ. Si vous faites une erreur dans votre séquence, elle sera enregistrée et donc répétée à chaque utilisation de notre macro.

C'est pourquoi il est très important de bien avoir en tête les différentes actions que vous souhaitez faire.

Dans notre cas, nous allons commencer par une séquence très simple :

  • lancer le logiciel Excel;

  • cliquer sur la cellule B1 et écrire "Bonjour";

  • changer la couleur du texte en bleu;

  • souligner ce texte.

Maintenant que vous avez défini la séquence, vous n'avez plus qu'à la faire une fois que vous avez lancé l'enregistreur de cette macro.

Enregistrez votre première macro :

Pour lancer un enregistrement, rien de plus simple. Il suffit :

  • d'aller dans l'onglet Affichage;

  • puis de cliquer sur la petite flèche en dessous de Macros;

  • puis de cliquer sur "Enregistrer une macro".

Onglet Affichage dans Excel

Une nouvelle fenêtre s'ouvre :

Fenêtre d'enregistrement d'une macro

Appelez votre macro "mise_a_jour",

  • puis cliquez sur "OK";

  • puis exécutez votre séquence que j'ai détaillée plus haut.

Une fois que c'est terminé, il suffit de :

  • retourner sur "Affichage";

  • puis cliquer sur la flèche vers le bas en dessous de "Macros";

  • et cliquer sur "Arrêter l'enregistrement".

Bravo ! Vous venez de créer votre première macro !!

Nous allons la tester ensemble, mais pour cela, il faut effacer la cellule B2.

Pour tester votre macro, vous avez besoin de retrouver l'état initial avant l'enregistrement de votre macro. C'est pourquoi vous avez fait dans l'enregistrement de votre macro.

Maintenant, il suffit simplement de relancer votre macro. Rien de plus simple, retournez dans l'onglet "Affichage" d'Excel puis cette fois, cliquez sur "Macros". Dans cette nouvelle fenêtre, votre macro "mise_a_jour" est présente. Cliquez une fois dessus puis appuyez sur "Exécuter".

Fenêtre contenant la liste de toutes les macros associées au classeur

Félicitations ! Vous venez d'exécuter votre première macro et si tout s'est bien passé, vous devez vous retrouver dans la cellule B1 "Bonjour", qui est colorée en bleu et soulignée.

Améliorez l'ergonomie :

Comme vous avez pu le voir, lancer une macro par l'onglet "Affichage", puis "Macros". Choisir la macro puis appuyer sur "Exécuter", ce n'est pas vraiment facile à utiliser...

Pour rendre l'utilisation plus intuitive, nous pouvons associer une macro à un bouton; ainsi il vous suffira de cliquer sur ce bouton pour que la macro s'exécute. Vous pouvez par exemple associer la macro, rien de plus simple, il vous suffit de faire un clic droit sur le bouton puis d'aller dans "Affecter une macro". Cliquez sur la macro "mise_a_jour" puis cliquez sur "OK".

Voici un exemple de bouton :

Exemple de bouton
Information

Pour insérer une forme rectangle, il faut aller dans l'onglet "Insertion" d'Excel, cliquer sur "Formes" et choisir le rectangle.

Pour lancer cette macro, il vous suffit simplement de cliquer sur votre rectangle et cela lance la macro "Mise à jour".

Vous pouvez personnaliser les boutons avec les différentes formes, couleurs ou encore effets. Si vous voulez aller plus loin dans la personnalisation, vous pouvez créer vos propres boutons sous forme d'image. Il ne vous reste plus qu'à associer une macro de la même façon que nous avons créée ensemble.

Information

Conseil : une fois que votre macro est associée à votre bouton ou photo, si vous souhaitez la modifier, cela va lancer la macro. Eh oui, le clic gauche sur l'objet lance la macro et ne le sélectionne plus. Si vous souhaitez y avoir accès, il faut faire un clic droit sur l'objet.

C'est bien d'avoir un bouton pour lancer une macro, mais il y a une autre solution simple pour le faire, le raccourci clavier.

Vous l'avez peut-être remarqué quand vous avez créé votre macro, il y avait une zone pour entrer une touche de raccourci.

  • Retournez alors dans la fenêtre Macros (pour rappel, c'esy dans l'onglet "Affichage" puis "Macros").

  • Sélectionnez votre macro mise_a_jour.

  • Puis cliquez sur "Options".

Une nouvelle fenêtre s'ouvre et vous retrouvez dans celle-ci la partie raccourci de la macro, ainsi que la partie commentaire sur la macro.

Dans la zone vide après le "CTRL +", écrivez "k" puis cliquez sur "OK".

Fenêtre d'option d'une macro

Cela signifie qu'à chaque fois que vous allez utiliser le raccourci clavier CTRL + K, vous allez lancer votre macro. Je vous laisse essayer !

Vous pouvez associer n'importe quelle touche sur votre clavier, il faut juste se rappeler que certaines ont déjà des actions, comme CTRL + V (coller) ou CTRL + A (tout sélectionner).

Passez des macros au langage de programmation VBA :

Vous venez de faire votre première macro dans Excel. Durant tout le processus de création de cette macro, nous n'avons jamais parlé de VBA. Pourtant cette macro, c'est bien du code VBA qui est exécuté par Excel.

Ah oui c'est vrai, mais où est le code VBA dans une macro ? De base, Excel ne montre pas le code VBA qui est généré. En effet, pour une utilisation simple comme notre exemple plus haut, vous n'avez pas besoin d'avoir accès au code VBA. Cependant, pour commencer à comprendre le VBA, votre macro simple va être parfaite.

Découvrez l'éditeur VBA :

Pour voir le code VBA qu'Excel a généré lors de votre enregistrement :

  • retournez dans l'onglet "Affichage" d'Excel;

  • cliquez sur "Macros";

  • cette fois, au lieu d'exécuter la macro, cliquez sur "Modifier".

Cette nouvelle fenêtre qui vient de s'ouvrir, c'est le Visual Basic Editor (nous utiliserons VBE à partir de maintenant).

Interface du Visual Basic Editor (VBE)

Que voit-on dans le VBE ? Une nouvelle interface avec 2 fenêtres :

  • à gauche, la fenêtre des projets (nous y reviendrons plus tard);

  • à droite c'est votre code VBA.

Voici le code que nous avons écrit avec une explication pour chaque ligne :

Sub Mise_a_jour
Le mot clé Sub permet de déclarer le début d'une fonction (d'un programme). Ici le programme s'appelle Mise_a_jour.
Mise_a_jour Macro
Cette ligne est en vert avec un apostrophe, c'est donc un commentaire qui ne sera pas lu.
Range("B2").Select
Range avec ("B2").select permet de sélectionner la cellule B2 dans Excel.
ActiveCell.FormulaR1C1 = "Bonjour"
ActiveCell.FormulaR1C1 permet d'écrire dans une cellule, donc notre cas d'écrire le mot "Bonjour" dans la cellule sélectionnée plus haut.
Range("B2").Select
Range avec ("B2").select permet de sélectionner la cellule B2 dans Excel.
With Selection.Font
Le mot With permet d'exécuter une série d'instructions. Dans notre cas, d'utiliser l'objet "font" sur la celluele sélectionnée.
.ThemeColor = xlThemeColorAccent5
On utilise la propriété Color et on lui affecte une couleur. Ici le paramètre xlThemeColorAccent5 correspond à du bleu dans ma version d'Excel.
.TintAndShade = 0
La propriété TintAndShade permet d'utiliser des dégradés de la couleur.
End With
Les mots-clés End et With permettent de fermer la série d'instructions.
Selection.Font.Underline = xlUnderlineStyleSingle
Selection.Font.Underline permet d'appliquer un soulignage de la cellule avec un seul trait.
End Sub
End Sub permet de mettre fin au programme.

Maîtrisez les concepts de base du langage VBA :

Comme vous avez pu le voir dans le détail du code ci-dessus, nous avons parlé d'objet pour le "font".

Pour moi, un objet c'est quelque chose de matériel, pourquoi on en parle dans de la programmation ? Faisons une pause ici pour expliquer un peu plus en détail le concept d'objet. Il est important de comprendre que le VBA est une programmation qu'on appelle programmation orientée objet (POO). Tout comme le Python, le Java, le C++ ou encore le PHP (avec quelques nuances pour le VBA).

Mais qu'est-ce qu'un objet, en programmation ? Si on prend notre exemple, font est donc un objet. Cet objet a plusieurs caractéristiques, comme par exemple :

  • la couleur;

  • si c'est en gras;

  • si c'est en italique;

  • le nom de la police;

  • la taille;

  • le soulignement;

  • etc.

Pour faire simple, un objet, c'est un ensemble de caractéristiques encapsulées dans un objet.

Information

À noter qu'un objet peut contenir lui-même un autre objet. Ainsi, l'objet range contient un objet font.

On peut faire le parallèle avec une recette de cuisine.

Notre recette de cuisine, c'est un peu comme notre application Excel.

En effet, pour faire notre "objet" recette de cuisine, nous avons besoin d'autres objets comme l'objet robot et l'objet four. Pour l'objet four, nous allons utiliser la méthode "Chauffer" avec les paramètres chaleur tournante, 180° et 40 minutes. Notre objet four contient également des événements, comme une minuterie qui permet au déclenchement d'arrêter le four.

Si nous résumons, notre objet four contient :

  • des caractéristiques (type de cuisson, température ou encore temps de cuissson);

  • des méthodes (chauffer, griller, etc.);

  • des événements (arrêt du four, etc.).

Et tout comme nos objets dans Excel, l'objet four ne s'utilise pas que pour cette recette, on peut utiliser cet objet dans plusieurs autres recettes.

C'est exactement pareil dans Excel, certains objets sont utilisés sur des graphiques, des cellules ou des zones de texte; pourtant c'est exactement le même objet à chaque fois, mais à des endroits différents, qui s'utilise de la même façon.

Voici les principaux objets pour Excel :

  • Workbook;

  • Sheets;

  • Range;

  • Windows;

  • Chart.

Je vous ai dit qu'un objet contient des caractéristiques ou d'autres objets. SI je veux être plus juste, un objet peut contenir plus d'informations.

Ainsi un objet peut contenir :

  • un autre objet;

  • des caractéristiques;

  • des méthodes;

  • des événements.

Si nous devions résumer :

  • une caractéristique est une propriété de notre objet :

    • (police : Times, courleur : bleu, gras : non, etc.);

  • une méthode est un verbe, une action que nous allons faire :

    • si on reprend l'exemple de notre texte, les différentes méthodes peuvent être remplacer, ajouter, trier, couper, coller, etc. Ce sont des actions que nous allons faire sur une cellule (avec l'objet range);

  • un événement est une action qui va se produire quand une condition va être remplie :

    • par exemple l'événement "newsheet" de l'objet "application" permet de déclencher le lancement d'un sous-programme à chaque fois qu'on ajoute une feuille.

Effectuez vos première manipulations en VBA :

Maintenant que vous avez vu en détail le concept d'objet, vous allez pouvoir faire des modifications sur votre objet font.

Imaginons par exemple que vous ne souhaitez plus écrire votre texte en bleu mais plutôt en rouge. Vous avez vu que l'objet font contient une méthode Color. La valeur de Color est xlThemeColorAccent5 pour du bleu. Si vous voulez avoir un texte orange, vous n'avez qu'à écrire 'xlThemeColorAccent2' et le texte sera écrit en orange à l'exécution de votre macro. Ici, pas la peine de refaire l'enregistrement de votre macro.

Voici le résultat du code :

Range("B2").Select
ActiveCell.FormulaR1C1 = "Bonjour"
Range("B2").Select
With Selection.Font
    .ThemeColor = xlThemeColorAccent2
    .TintAndShade = 0
End With
Selection.Font.Underline = xlUnderlineStyleSingle

Appréhendez l'éditeur VBA :

Vous allez passer pas mal de temps sur le VBE, c'est pourquoi il est important de comprendre rapidement comment il fonctionne et comment vous pouvez améliorer l'interface.

Nous avons vu plus haut qu'il y avait une fenêtre de projet et une fenêtre de code. Dans cette dernière fenêtre, vous pouvez voir que certains mots sont écrits en bleu, en noir ou en vert.

Mais qu'est-ce que cela veut bien dire ?

  • Bleu : Ce sont les mots-clés.

  • Vert : Ce sont

    les commentaires.
  • Noir : C'est le code classique.

Code créé par notre macro Mise à jour dans le VBE

Commençons par les mots-clés : ce sont des mots qui sont spécifiquement réservés par le VBE. Les mots en bleu ne peuvent pas être utilisés comme variables, par exemple (nous détaillerons plus loin le concept de variable). Ces mots ont une importance particulière pour le VBE.

Par exemple, dans notre cas, le mot "sub" permet de déclarer le début d'une procédure (un programme).

Les commentaires ont une importance toute particulière pour tous les langages de programmation. Ils permettent de comprendre ce que fait le code. Au début de l'écriture d'un code, c'est assez simple de comprendre ou de se rappeler; mais au bout de quelques dizaines de lignes et quelques jours, on se rend vite compte que c'est difficile de se rappeler ce que nous avons voulu faire. C'est pourquoi il est vraiment important de garder une rigueur sur les commentaires.

On peut, par exemple, expliquer une variable ou le rôle d'une variable, mais on peut surtout expliquer une partie de code ou de fonction entière.

Mais ça fait quoi un commentaire dans le code ? Le commentaire dans le code, c'est simple, c'est un morceau de code qui ne va pas s'exécuter. Une ligne qui ne sera plus lue par le code.

En VBA, on utilise l'apostrophe "'" pour que la ligne ne soit pas lue.

Ajout du commentaire Mise_a_jour_Macro à titre d'exemple

Mais parfois on a besoin de commenter plusieurs lignes d'un coup. Comme une grosse partie d'explication ou encore toute une partie d'un programme que vous ne souhaitez pas exécuter. Mettre des apostrophes devant chaque ligne, cela peut être long. Vous allez donc utiliser la fonction "Commenter bloc" ou "Ne pas commenter bloc" de l'éditeur VBE.

Pour faire apparaître cette option, il faut aller dans "Affichage" puis barre d'outils puis choisir "Édition". Vous avez maintenant accès dans cette nouvelle barre d'outils à l'option "Commenter bloc" !

Information

On remarque que suivant l'endroit où est placé le signe du commentaire, on peut ne mettre en commentaire qu'une partie d'une ligne.

Pour finir, le code écrit en noir, c'est du simple code classique qui va être exécuté.

Exécutez du code dans le VBE :

Contrairement à Excel où vous avez associé votre macro à un bouton et un raccourci clavier, il n'y a rien pour lancer votre macro de façon intuitive.

Dans le VBE, vous allez aller dans "Exécution" ouis cliquer sur "Exécuter la macro". Cela va avoir pour effet d'exécuter la macro entièrement. Vous pouvez également passer par le raccourci dans l'interface qui se matérialise comme le signe "play" en vert. Dernière façon de faire, utiliser le raccourci clavier F5.

Le bouton "Play"

Il arrive assez fréquemment de vouloir tester les lignes une par une pour comprendre le code. Il faut donc utiliser le mode pas à pas détaillé en passant par Débogage puis en cliquant sur "Pas à pas détaillé". À chaque fois que vous cliquez dessus, cela exécute une ligne et cela passe à la suivante. C'est bien pour tester une seule ligne, mais si on doit le faire à chaque fois, cela va être long et fastidieux. Il existe un raccourci clavier qui est F8. À chaque appui sur F8, la ligne s'exécute et le code passe à la ligne suivante.

C'est une bonne solution, mais imaginez que vous vouliez regarder les 10 dernières lignes de notre code. Il va falloir commencer par appuyer 30 fois sur F8 pour arriver à la partie qui vous intéresse ! Pour pallier ce problème, vous pouvez définir ce que l'on appelle un point d'arrêt dans le code.

Exemple de point d'arrêt dans le VBE

Ce point d'arrêt, matérialisé par un rond rouge dans la marge, s'ajoute en cliquant exactement là où est le point rouge dans la capture d'écran. Quand vous exécutez l'intégralité de votre code (F5), l'exécution va s'arrêter sur ce point d'arrêt et à partir de là vous pouvez utiliser le mode pas à pas (F8).

Appréhendez les erreurs en VBA :

QUand vous commencerez à écrire du code en VBA, vous ferez des erreurs. C'est tout à fait normal de ne pas écrire du premier coup une ligne parfaitement, et le VBE est justement là pour vous expliquer une erreur.

Bon, je préfère vous le dire tout de suite, il ne va pas vraiment vous expliquer l'erreur. Il va essayer de vous décrire brièvement le problèmme qu'il a rencontré, et il va surtout nous donner la ligne qui comporte l'erreur.

Avec la pratique on comprend plus facilement les erreurs et dans le pire des cas, vous pouvez toujours aller voir sur Internet pour expliciter cette erreur.

Bon, je préfère vous le dire tout de suite, il ne va pas vraiment vous expliquer l'erreur. Il va essayer de vous décrire brièvement le problème qu'il a rencontré, et il va surtout nous donner la ligne qui comporte l'erreur.

Avec la pratique on comprend plus facilement les erreurs et dans le pire des cas, vous pouvez toujours aller voir sur Internet pour expliciter cette erreur.

Dans le code que vous avez utilisé jusqu'à maintenant, j'ai supprimé le "t" du seelect, et voici l'erreur que nous a renvoyée le VBE :

Fenêtre d'erreur dans le VBE

Objectivement, l'erreur n'est pas vraiment parlante mais vous pouvez par contre appuyer sur "Débogage" pour que le VBE vous surligne la ligne avec une erreur.

Information

Avec le temps et la pratique, vous comprendrez de plus en plus vite les erreurs sur les lignes.

Sauvegardez vos scripts VBA :

Il est maintenant temps d'aborder une partie très importante, le stockage de votre code. Écrire du code pour automatiser des tâches c'est bien, mais encore faut-il pouvoir le stocker quelque part, sinon cela n'a pas grand intérêt.

Si vous avez déjà essayé de faire une macro VBA et d'enregistrer votre fichier, vous avez dû avoir un message comme celui-là :

Fenêtre d'enregistrement quand le format Excel ne peut pas contenir de VBA

Faisons un point sur les différentes extensions dans Excel pour comprendre ce problème.

Voici la liste des différentes extensions Excel :

  • classeur Excel (.xlsx);

  • classeur Excel prenant en charge les macros (.xslm);

  • classeur Excel binaire (.xlsb);

  • classeur Excel 93 - 2003 (.xls).

Important

Le format de base d'Excel, le XSLX, ne prend pas en charge les macros.

C'est-à-dire que si vous créez une macro et que vous enregistrez le fichier en classeur Excel (.xslx), votre macro ne sera pas sauvegardée dans le fichier Excel. Car oui, de base, quand on crée une macro, elle est directement stockée dans le fichier Excel. L'extension XSLX est la seule à ne pas prendre en charge les macros.

Information

Le fait que l'extension .xslx ne prenne pas en chagre les macros est une protection pour Excel. Le code peut parfois être malveillant, Microsoft a alors décidé d'utiliser une extension qui supprime tout le code dans les fichiers.

À quoi servent les 3 autres extensions, alors ? L'extension .xslm a exactement les mêmes caractéristiques que le .xslx sauf que cette fois, il accpete les macros dans le fichier Excel.

Le .xslb est similaire au XSLM sauf que celui-ci compresse beaucoup mieux les données. C'est personnellement l'extension que j'utilise le plus souvent (on peut facilement réduire la taille d'un fichier de moitié avec cette extension).

Pour finir, le .xls, c'est une vieille extension d'Excel qui date de 1997; cette version, même si elle n'est plus censée être utilisée, est encore assez répandue (malheureusement).

Vous venez de voir quelles extensions acceptent de stocker du code. Retour maintenant à notre VBA pour mieux comprendre où se trouve notre code dans le fichier. Regardons cette fois la partie de gauche, la fenêtre Projet. Dans cette fenêtre on voit le nom de notre fichier Excel et 3 dossiers :

  • Microsoft Excel Objets : avec la feuille actuelle et ThisWorkbook;

  • Feuilles;

  • Modules.

Onglet Projet dans le VBE

On peut voir que votre enregistrement de macro a créé un dossier Modules dans lequel on retrouve le module 1 qui contient votre code. Nous verrons par la suite pourquoi le stocker dans le module ou directement dans la feuil1 ou dans ThisWorkbook. Pour le moment, il faut juste savoir que les macros se créent automatiquement dans un nouveau module.

Sécurisez votre application VBA :

Maintenant que vous savez comment sauvegarder vos macros dans un fichier Excel, il faut les protéger. En effet, si vous laissez une macro dans un fichier et que quelqu'un ouvre le fichier et efface la macro, vous perdez votre code.

Nous verrons plus loin que nous ne sommes pas obligés de stocker le code de la macro directement dans un fichier. Cependant, une bonne pratique est dans tous les cas de mettre un mot de passe au VBE.

Pour ce faire, je vous invite à aller dans "Outils" puis "Propriétés de VBA Projet". Dans cette nouvelle fenêtre, il faut aller sur l'onglet "Protection". Vous voyez dans cette fenêtre que vous pouvez mettre un mot de passe (que vous devez taper deux fois). Vous avez également une option pour verrouiller le projet pour l'affichage qu'il faut cocher.

Une fois le mot de passe actif, enregistrez et fermez votre fichier Excel. Maintenant, ouvrez ce fichier, et surprise, vous ne pouvez plus éditer de macro, vous pouvez seulement l'exécuter.

Comment avoir à nouveau accès à l'édition alors ? Allez dans l'onglet "Développeur" et cliquez sur "Visual Basic". En allant de votre projet, vous aurez l'opportunité de rentrer votre mot de passe pour déverouiller le VBE.

Information

Si n'avez pas l'onglet "Développeur", il suffit d'aller dans "Fichier", puis "Options" et "Personnaliser le ruban". Dans la fenêtre de droite, il vous suffit de cocher "Développeur", et un nouvel onglet arrive sur l'interface d'Excel.

Important

Attention, il existe différentes façons de casser les codes dans Excel, que ce soit pour une feuille de calcul, un classeur ou encore l'éditeur VBE. Cette technique va protéger votre code dans 99% des cas mais attention, ce n'est pas infaillible. Internet regorge de techniques pour casser ces différents codes.

Appréhendez les grands types de variables :

Précédemment, vous avez vu comment réaliser des macros avec l'enregistreur de macro intégré à Excel, et faire quelques modifications.

L'enregistrement des macros, c'est très bien pour des macros "simples", mais quand vous voulez rajouter des fonctionnalités ou optimiser les macros, il faut commencer à écrire du code... Les variables sont la première chose que nous allons voir ensemble. Cela va vous permettre de faire des boucles, des tests, ou encore d'utiliser un formulaire.

Déclarez une variable :

LE VBA ne fait pas exception à la règle : comme tous les langages de programmation, il utilise des variables. Prenons une définition simple : une variable, c'est un élément auquel on affecte une valeur.

Par exemple, je peux créer une variable qui s'appelle annee_de_naissance dans laquelle je vais stocker un nombre comme 1987.

Mais pourquoi utiliser une variable pour stocker un nombre ? Autant l'utiliser directement, non ? Effectivement, si nous ne l'utilisons qu'une seule fois dans notre code, autant écrire directement le nombre. Mais si je vous dis maintenant que cette variable, ce n'est pas moi qui vais la définir, mais qu'à terme, cela va être automatiquement mis à jour en fonction de différentes informations dans le projet ?

Vous commencez peut-être à comprendre...

Distinguez les grands types de variables :

Comme vu précédemment, une variable est un élément qui peut contenir des informations, elle n'est pas statique. Le nombre peut changer en fonction d'événements extérieurs ou en fonction d'une information dans le code. Nous pouvons donc associer à une variable une valeur (on charge une variable avec une valeur). En VBA, il faut définir le type d'une variable avant de pouvoir l'utiliser.

Voici un tableau (non exhaustif) avec les principales variables que nous allons utiliser :

Type Type de variable Détails
Texte String Texte
Date Date Date et heure
Boolean Boolean Vrai ou faux
Numérique Byte Nombre entier allant de 0 à 255
Numérique Integer Nombre entier allant de -32768 à +32767
Numérique Long Nombre entier allant de -2,1 millards juqu'à +2,1 milliards
Numérique Float Nombre à virgule
Objet Objet Objet

Vous pouvez donc définir une variable pour contenir du texte, des nombres entiers, des nombres à virgule, des booléens, etc.

Mais alors, si en type texte je peux également stocker des nombres, à quoi ça sert tous les autres types de variables ? Afin de comprendre l'importance des types de variables, je vous propose un exemple.

Je crée deux variables :

  • Annee_de_naissance en 'string' où je stocke la valeur 1987;

  • Age en 'integer' où je stocke la valeur de 35.

Maintenant, je vous demande d'additionner les deux variables. Quelle réponse me donnez-vous ?

"2022", et vous avez raison !

Maintenant, demandons la même chose en VBA. Nous allons avoir comme résultat "35".

Pourquoi ? Simplement car nous ne pouvons pas additionner un type string (texte) avec un type integer (Numérique). Le VBA va additionner seulement le 35 avec rien.

Vous comprenez l'importance de bien définir les variables dès le début du projet. En fonction du type de variable, nous ne pourrons pas les utiliser de la même façon ni pour faire les mêmes choses. Certaines actions ne sont possibles qu'avec un type de variable spécifique.

Maintenant que vous avez compris l'importance des types, vous allez créer votre première variable.

Écivez votre première ligne de code !

Voici le code pour créer la variable annee_de_naissance :

dim annee_de_naissance as integer

On y retrouve 4 lots différents :

  • "Dim" : (raccourci de "Dimension"), permet de faire comprendre à l'éditeur VBA qu'on va créer un nouvelle variable, et déclarer ses dimensions (nom, type etc.);

  • "annee_de_naissance" : nom de la variable que nous souhaitons créer;

  • "As" : permet d'associer un type à la variable;

  • "Integer" : type de la variable.

Information

Notez qu'à la création, la variable est vide, il n'y a d'information à l'intérieur.

Il y a plusieurs bonnes pratiques à mettre en place quand vous créez des variables dans un projet :

  1. Un nom explicite de ce que va contenir la variable.

  2. Pas d'espace. Si vous voulez utiliser deux mots, séparez-les avec un "_".

  3. Pas de majuscule.

C'est bien joli de savoir déclarer une variable, mais à quoi ça sert si elle est vide, et comment je la charge ? Eh bien, cette partie est très simple, si on reprend notre exemple. Il suffit simplement d'écrire :

annee_de_naissance = 1987

Voilà, vous venez de charger le nombre 1987 dans votre variable.

Si vous voulez voir le contenu de votre variable, utilisez la commande "msgbox".

MSgBox (annee_de_naissance)

Cette commande va vous afficher "1987" dans une fenêtre Windows dans Excel.

Vous pouvez également voir la valeur de cette variable en utilisant le panneau des variables locales dans l'éditeur VBA.

Information

Si celui-ci n'est pas dans votre interface, allez dans "Affichages" puis cliquez sur "Afficher les variables locales".

Comme vous pouvez voir dans le panier des variables locales de mon exemple, la variable age contient 35. Le 35 est entre guillemets alors que le 1987 n'a pas de guillemets. Si on regarde le type, on voit que annee_de_naissance est un 'integer' et age une 'string'. Les guillemets autour du 35 nous indiquent que le nombre est stocké comme une chaîne de caractères (donc entre guillemets).

Utilisez les opérateurs conditionnels :

Précédemment, nous avons vu comment déclarer une variable avec les différents types qui existent. Voyons maintenant ensemble le vrai intérêt d'une variable, et comment cela va vous aider dans votre code de tous les jours.

Nous allons commencer par utiliser des opérateurs conditionnels, puis nous les utiliserons au travers de conditions avec des If puis, pour finir, avec des Select Case.

Maîtrisez les opérateurs conditionnels :

Je crois que c'est le moment où cela va se compliquer... non ? Figurez-vous que non, pas vraiment; les mots "opérateurs conditionnels" peuvent à première vue vous faire peur, mais en fait c'est assez simple.

Les opérateurs conditionnels permettent de faire des actions avec des variables, comme par exemple les comparer.

Comme par exemple regarder si une variable est plus grande qu'une autre ? Tout à fait, ce n'est pas plus difficile que cela. Regardons ensemble les différents types d'opérateurs et analysons ensemble la syntaxe. On retrouve des opérateurs :

  • arithmétiques;

  • de comparaison;

  • logiques;

  • de concaténation.

Commençons ensemble par les opérateurs arithmétiques. Ces opérateurs permettent de faire des calculs entre deux variables. Par exemple, additionner la variable 1 avec la variable 2.

Les opérateurs arithmétiques :

Toutes les opérations arithmétiques classiques s'utilisent avec des nombres (integer, float, etc.) :

Calcul Opérateur à utiliser en VBA
Addition +
Soustraction -
Multiplication *
Division /
Modulo mod
Division donnant un entier \
Puissance ^
Affectation d'une valeur =

Reprenons notre exemple précédent : nous allons chercher à retrouver l'année de naissance en effectuant une soustraction entre l'âge et l'année actuelle. Voyons comment faire cela :

Code de la macro :

Sub annee()

Dim age As Integer
Dom calcul As Integer

age = 36
calcul = 2023 - Age
Msg(calcul)

End Sub

Tous les opérateurs s'utilisent de la même manière que notre exemple. Je vous laisse faire différents tests pour mieux vous familiariser avec les opérateurs.

Maintenant que vous savez faire des calculs, il est temps de comparer les variables avec les opérateurs de comparaison.

Les opérateurs de comparaison :

Il existe plusieurs opérateurs de comparaison en VBA; en voici une liste non exhaustive :

Calcul Opérateur à utiliser en VBA
Inféreur à <
Inférieur ou égal à <=
Supérieur à >
Supérieur ou égal à >=
Égal à =
Différent à <>
Comparer deux strings like

Le résultat de cette opération renvoie un True (vrai) ou False (faux) dans la vairable.

SI nous continuons avec notre exemple, nous avions calculé un résultat de 2023, nous souhaitons savoir si ce résultat est supérieur ou égal à 2000.

Sub annee()
Dim age As Integer
Dim calul As Boolean
Dim annee_test As Integer

age = 36
annee_test = 2000

calcul = (2003 - age) >= annee_test

MsgBox (calcul)

End Sub
Information

Petite précision, le résultat renvoie "faux" car la variable résultat est déclarée en 'boolean'. Si cette variable était un 'integer', alors le résultat serait 0.

Vous pouvez également comparer autre chose que des chiffres, comme par exemple vous demander si deux chaînes de caractères sont identiques. Essayez les différents opérateurs.

Continuons le tour des opérateurs avec les opérateurs logiques. Ils sont particulièrement importants en programmation.

Les opérateurs logiques :

Voici la liste des principaux opérateurs logique :

Calcul Opérateur à utiliser en VBA
Conjonction And
Négation logique Not
Disjonction Or
Xor Exclusion

Essayons à présent, avec notre exemple, de savoir si la date de l'année est égale à 2022 et si l'âge est inférieur à 30 ans. Pour faire cela, utilisez l'opérateur logique de conjonction 'And'. Le 'And' est simplement un "Et", il faut que les deux conditions soient réunies pour que cela renvoie un "vrai" cette fois.

Vérifiez toujours si la date de naissance est bien inférieure à l'année 2000 et ajoutez la condition de ville. Car on souhaite que le programme nous renvoie "vrai" si c'est une personne qui viet de Montpellier.

Sub annee()
Dim age As Integer
Dim calcul As Integer
Dim annee As Integer
Dim resultat As Boolean
age = 35
annee = 2000
ville_naissance = "Montpellier"

calcul = 2023 - age
resultat = calcul <= annee And ville_naissance = "Montpellier"

MsgBox (resultat)
End Sub

Je vous laisse ici aussi faire des tests, comme mettre Paris dans la ville de naissance (cela va vous renvoyer "faux", normalement) puis changeer l'opérateur en OR et voir ce que cela change. Si tout se passe bien, cela doit vous dire "vrai". Pour l'opérateur OR, si une des deux conditions est validée, alors il renvoie "vrai".

Pour finir, voyons ensemble les opérateurs de concaténation.

Les opérateurs de concaténation :

Nous avons déjà évoqé ce sujet précédemment avec des chaînes de caractères. La concaténation se fait généralement sur du texte (donc des strings). On peut utiliser l'opérateur + ou &. L'opérateur + s'utilise pour additionner des nombres, donc par convention on va plutôt utiliser le & et laisser le + aux nombres, même si les deux versions fonctionnent.

Appréhendez la notion de condition :

Si tout va bien, vous comprenez maintenant l'intérêt des variables et ce que nous pouvons en faire avec les différents tests. Nous avons vu ensemble que nous pouvons les additionner, faire des tests entre deux variables ou encore les concaténer. Nous allons maintenant voir un nouvel élément, les conditions. C'est très important de bien comprendre le fonctionnement, car vous allez très souvent l'utiliser tel quel ou avec certaines déclinaisons.

Trève de bavardage, essayons la condition If.

Le IF (en français, si) permet de venir tester des hypothèses.

Par exemple, imaginons que je souhaite tester l'âge de quelqu'un et faire une action différente en fonction de son âge.

Si l'âge de la personne est supérieur ou égal à 18 ans,

alors je lui dis qu'il peut créer un compte,

sinon je lui dis qu'il est trop jeune pour créer un compte.

Cette syntaxe permet de faire des actions différentes en fonction de la valeur de la variable âge.

Regardons maintenant comment cela se matérialise en VBA :

Sub annee()
Dim age As Integer
Dim age_minimum As Integer
age = 16
age_minimum = 18

If age >= age_minimum Then
    MsgBox ("Tu peux créer ton compte")
    Else
    MsgBox ("Tu es trop jeune pour créer ton compte")
End If

End Sub

Notre fonction If s'écrit toujours de la même façon. Commençons par lui donner le test que vous voulez faire. Ici je lui dis que je souhaite que la variable âge soit supérieure ou égale à 18. Le résultat, comme nous l'avons vu plus haut, renvoie un booléen "vrai" ou "faux".

Utilisez ensuite le mot Then (qui veut dire "alors") : alors si le résultat du test est vrai, exécuter la ligne qui est en dessous, qui écrit à l'utilisateur "Tu peux créer ton compte".

Pour finir, utilisez le mot Else (qui veut dire "sinon") : sinon je dis à l'utilisateur "Tu es trop jeune pour créer ton compte". Puis je termine par un End If pour lui dire que le if est terminé.

En changeant la valeur de la variable âge, vous pouvez voir que cela fonctionne bien.

Vous remarquerez que les données écrites à l'intérieur du if ne sont pas alignées avec le If (If age <> End If). Ce n'est pas une erreur de la mise en page mais bien une bonne pratique. Cela s'appelle l'indentation. Cette pratique consiste à ajouter des espaces en début de ligne pour créer une structure. Cela permet d'améliorer la lisibilité et la compréhension du code. Nous pouvons ainsi voir ce qui est "à l'intérieur" du if facilement sans avoir à regarder les parenthèses. Dans notre exemple, nous n'avons qu'un seul If. Imaginez maintenant plusieurs if imbriqués ensemble, sans l'indentation : c'est très compliqué.

Dans notre exemple, je n'ai utilisé qu'une seule condition, mais vous pouvez bien évidemment utiliser les opérateurs logiques pour rajouter des conditions.

Vous venez de tester si une valeur est vraie ou fasse. Mais imaginons maintenant que vous souhaitez tester plusieurs valeurs. Vous allez devoir faire plein de petits if, et cela va être assez fastidieux. Heureusement pour nous, il existe une variante du if qui permet de faire du multichoix, le ElseIf.

Revenons à notre exemple, nous souhaitons maintenant faire des actions différentes en fonction de la ville de naissance d'une personne.

Sub annee()

Dim departement_naissance As string
departement_naissance = Range("A1").Value

If departement_naissance = 34 Then
    MsgBox ("Tu es rattaché à l'agence Occitanie")
    ElseIf departement_naissance = 75 Then
    MsgBox ("Tu es rattaché à l'agence d'Île-de-France")
    ElseIf departement_naissance = 33 Then
    MsgBox ("Tu es rattaché à l'agence de Nouvelle Aquitaine")
    If departement_naissance = 69 Then
    MsgBox ("Tu es rattaché à l'agence Auvergne Rhône-Alpes")
    Else
    MsgBox ("Nous n'avons pas l'information")
End If

End Sub

Le début de la syntaxe est la même, sauf que cette fois au lieu de rajouter un else, nous avons rajouté un elseif avec une nouvelle condition. Ainsi, à chaque nouvel elseif vous pouvez ajouter une condition; le code va passer sur chaque test jusqu'à arriver à celui qui permet de valider la condition, puis afficher le message.

Information

Vous remarquerez que vous ne pouvez valider qu'un seul elseif, car une fois qu'une condition est validée, le VBE va automatiquement sauter toutes les autres conditions pour arriver sur le End If et sortir de ce test.

J'ai volontairement rajouté à la fin de ce if un else, qui permet de dire à l'utilisateur que nous n'avons pas cette information. Si nous n'avions pas ajouté ce else et qu'un utilisateur venait du 35, il n'y aurait même pas eu de message pour l'utilisateur.

Information

Quand vous travaillez sur des conditions, il faut toujours essayer de couvrir tous les cas possibles de chaque valeur que vous souhaitez tester en entrée.

Allez plus loin avec Select :

Comme vous venez de le voir, la combinaison des elseif n'est pas vraiment élégante (oui oui je vous assure qu'on peut dire élégante du code).

Il existe une autre solution qui donne les mêmes résultats mais qui est plus simple d'utilisation, c'est le Select Case.

Reprenons le même exemple qu'avec le ElseIf mais en l'adoptant avec le Select Case.

Sub Association_region()

Dim departement_naissance As String
departement_naissance = Range("A1").Value

Select Case departement_naissance
    Case 9, 11, 12, 30, 31, 32, 34, 46, 48, 65, 66, 81, 82
    MsgBox ("Tu es rattaché à l'agence Occitanie")
    Case 75, 77, 78, 91, 92, 93, 94, 95
    MsgBox ("Tu es rattaché à l'agence d'Île-de-France")
    Case 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87
    MsgBox("Tu es rattaché à l'agence de Nouvelle Aquitaine")
    Case 1, 3, 7, 15, 26, 38, 42, 43, 63, 69, 73, 74
    MsgBox ("Tu es rattaché à l'agence Auvergne Rhône-Alpes")
    Case 2, 4, 5, 6, 8, 10, 13, 14, 18, 20, 21, 22, 25, 27, 28, 29, 36, 37, 39, 41, 44, 45, 49, 5O, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 67, 68, 70, 71, 72, 76, 80, 83, 84, 85, 88, 89, 90, 97
    MsgBox ("Nous n'avons pas d'agence dans ton département")
End Select

End Sub

Avec ce code, vous arriverez rapidement à couvrir facilement tous les cas de la version avec le if, et à ajouter tous les départements pour chaque région sans alourdir le code. Comme vous le remarquez, cela ne prend pas beaucoup plus de place que le ElseIf alors que vous couvrez beaucoup de départements.

Information

Notez que vous pouvez utiliser des plages de valeurs, comme par exemple les 'case 1 to 10', ou encore des conditions, comme 'case is < 10'.

Maîtrisez les boucles :

Maintenant que vous avez vu comment définir une variable et comment vous pouvez l'utiliser en faisant des tests, passons à une nouvelle étape cruciale dans l'apprentissage de la programmation, avec les boucles.

Une boucle permet de refaire plusieurs fois une même action. Tout comme le test des hypothèses que nous avons vu plus haut (le IF et le Select Case), il existe plusieurs boucles qui ont des résultats assez similaires mais une mécanique différente. Voyons ensemble la boucle For, la boucle Do, et pour finir la boucle While.

Appréhendez les boucles conditionnelles :

Les boucles permettent de gagner beaucoup de temps sur le traitement et sur l'écriture de votre code. En effet, il est assez commun de dire que nous ne souhaitons pas écrire plusieurs fois la même ligne de code. Pour commencer, cela n'est pas optimisé, et puis ce n'est pas élégant.

Élégant, élégant... ça reste du code quand même ! Oui je suis d'accord avec vous, mais je ne doute pas qu'à un moment, quand vous allez écrire, vous trouverez vous aussi que votre code est élégant.

Revenons maintenant à notre boucle. Vous avez un tableau de 10 départements dans lequel vous souhaitez leur rattacher automatiquement leur région. Pour ce faire, vous pouvez écrire du code qui va aller chercher chaque ligne une par une.

Exemple de départempents dans Excel

Le code va ressembler à cela pour la cellule B3 :

Sub Association_region()

Dim departement_naissance As Integer

departement_naissance = Range("A3").Value

Select Case departement_naissance
    Case 9, 11, 12, 30, 31, 32, 34, 46, 48, 65, 66, 81, 82
    Range("B3").Value = "Occitanie"
    Case 75, 77, 78, 91, 92, 93, 94, 95
    Range("B3").Value = "Île-de-France"
    Case 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87
    Range("B3").Value = "Nouvelle Aquitaine"
    Case 1, 3, 7, 15, 26, 38, 42, 43, 63, 69, 73, 74
    Range("B3").Value = "Auvergne Rhône-Alpes"
    Case 2, 4, 5, 6, 8, 10, 13, 14, 18, 20, 21, 22, 25, 27, 28, 29, 36, 37, 39, 41, 44, 45, 49, 5O, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 67, 68, 70, 71, 72, 76, 80, 83, 84, 85, 88, 89, 90, 97
    Range("B3").Value = "Pas d'agence"
End Select

End Sub

Après avoir exécuté ce code, vous allez avoir le mot "Occitanie" dans la cellule B3.

Sans les boucles, vous devriez écrire ce code pour chaque ligne. Le code ci-dessus fait le travail pour la première case "A3". Puis vous auriez à écrire le même code qui fait le travail pour cette fois A4, puis encore A5, et ainsi de suite. La boucle va permettre de passer sur toutes les cellules sans écrire beaucoup plus de code.

Maîtrisez la boucle FOR :

Commençons par la boucle FOR. La syntaxe de cette boucle est assez simple, nous commençons par...

FOR ! Effectivement c'est bien le mot "For" qui va permettre de débuter cette instruction, puis vous allez mettre une condition.

Par exemple :

For i = 1 to 15

Cette boucle va donc fonctionner tant que i n'est pas égale à 15. Vous pourriez me dire, mais pourquoi il y a un i et pourquoi 15 ? Si vous revenez dans le fichier Excel, vous pouvez voir que la dernière cellule que nous souhaitons remplir est la quinzième; c'est pour cela que vous vous arrêtez à 15. C'est une convention, dans un for nous utilisons une variable qui s'appelle i. Nous allons détailler la mécanique de cette variable juste en dessous.

Ensuite utilisez le select case que nous avons déjà vu pour remplir la cellule. Cependant, dans notre cellule nous avions une référence à la cellule B3, et le problème c'est que nous souhaitons automatiser cela. Vous allez donc changer le code pour qu'il s'adapte : au lieu d'utiliser le code Range("B3").Value = "Occitanie", écrivez Range("B" & i).Value = "Occitanie".

Cela va permettre d'obtenir en valeur :

  • B3, quand i va être égale à 3;

  • B4, quand i va être égale à 4.

Pour finir une instruction For, il vous faut écrire Next. Vous souhaitez ici incrémenter la valeur de i, pour qu'elle balaie toutes les valeurs de 1 à 15. Écrivez alors Next i. Le VBE va alors incrémenter automatiquement la variable de i de 1.

Voici le code avec la boucle For :

Sub for_Association_region()

Dim departement_naissance As Integer
Dim i As Integer
i = 3

For i = 3 To 15
    departement_naissance = Range("A" & i).Value
    Select Case departement_naissance
        Case 9, 11, 12, 30, 31, 32, 34, 46, 48, 65, 66, 81, 82
        Range("B" & i).Value = "Occitanie"
        Case 75, 77, 78, 91, 92, 93, 94, 95
        Range("B" & i).Value = "Île-de-France"
        Case 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87
        Range("B" & i).Value = "Nouvelle Aquitaine"
        Case 1, 3, 7, 15, 26, 38, 42, 43, 63, 69, 73, 74
        Range("B" & i).Value = "Auvergne Rhône-Alpes"
        Case 2, 4, 5, 6, 8, 10, 13, 14, 18, 20, 21, 22, 25, 27, 28, 29, 36, 37, 39, 41, 44, 45, 49, 5O, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 67, 68, 70, 71, 72, 76, 80, 83, 84, 85, 88, 89, 90, 97
        Range("B" & i).Value = "Pas d'agence"
    End Select
Next i

End Sub

Si vous avez également essayé ce code chez vous, vous devez normalement avoir les différentes cellules remplies avec les bonnes informations.

Pour implémenter cette boucle, nous avons dû faire des changements par rapport au code initial. Nous avons commencé à partir de la ligne 3 dans le For, car il n'y avait pas de données avant cette ligne.

Si vous comparez la taille du code entre la version pour une seule cellule et celle-ci pour les 15, il y a 4 lignes de plus seulement. Et à la place de 15 nous pourrions avoir une liste de cent mille lignes, cela ne change pas la taille du code, juste le temps d'exécution qui est plus long.

Le nom de la variable qui permet de faire des itérations n'a pas d'importance. Communément, cette variable s'appelle i, mais nous pourrions très bien utiliser une variable qui s'appelle catapulte. Vous auriez alors For catapulte = 3 to 15 et un next catapulte. Ce code fonctionne parfaitement.

Information

Vous remarquerez que j'ai changé toutes les références à la cellule 3 par le i. J'ai également déclaré la variable i.

Information

Notez qu'il existe une variante de cette boucle qui s'utilise avec des tableaux ou des collections avec l'instruction For Each ... Next...

Utilisez les boucles Do et While :

Les boucles sont très utilisées en général en programmation car cela permet de répéter une action facilement.

Il existe deux autres types de boucles en VBA, le Do et le While. Nous allons commencer par le Do.

La boucle Do :

Le Do a un fonctionnement assez similaire au For, à la nuance près qu'il n'y a pas d'incrémentation automatique.

Écrivez la commande Do While i <= 15. C'est-à-dire "faire tant que i est inférieure ou égale à quinze".

À la fin, rajoutez une incrémentation de i avec i = i + 1, puis clôturez l'instruction par un loop.

Sub do_Association_region()

Ce code donne exactement le même résultat que la boucle For.

Voici le code :

Sub do_Association_region()

Dim departement_naissance As Integer
Dim i As Integer
i = 3

Do While i <= 15
    departement_naissance = Range("A" & i).Value
    Select Case departement_naissance
        Case 9, 11, 12, 30, 31, 32, 34, 46, 48, 65, 66, 81, 82
        Range("B" & i).Value = "Occitanie"
        Case 75, 77, 78, 91, 92, 93, 94, 95
        Range("B" & i).Value = "Île-de-France"
        Case 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87
        Range("B" & i).Value = "Nouvelle Aquitaine"
        Case 1, 3, 7, 15, 26, 38, 42, 43, 63, 69, 73, 74
        Range("B" & i).Value = "Auvergne Rhône-Alpes"
        Case 2, 4, 5, 6, 8, 10, 13, 14, 18, 20, 21, 22, 25, 27, 28, 29, 36, 37, 39, 41, 44, 45, 49, 5O, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 67, 68, 70, 71, 72, 76, 80, 83, 84, 85, 88, 89, 90, 97
        Range("B" & i).Value = "Pas d'agence"
    End Select
    i = i + 1
Loop

End Sub

Si vous êtes un peu joueur, vous pouvez essayer d'enlever le i = i + 1 puis de relancer le code. D'après vous, qu'est-ce qu'il va se passer ?

Vous imaginez que le code va remplir la ligne 3, car nous avons déclaré i = 3 et il n'y a pas d'incrémentation, puis c'est tout. C'est une bonne lecture du code effectivement, mais tout est dans le "c'est tout". En réalité, votre code va rester bloqué et remplir indéfiniment la même cellule (B3). En effet, la seule chose qui peut nous faire sortir de la boucle c'est d'arriver à 15; tant que nous ne sommes pas arrivés à ce chiffre, la boucle essaie toujours d'exécuter une action. Elle refait donc la même action... en boucle.

Information

Si vous avez exécuté le code sans l'incrémentation, vous avez sûrement un Excel qui est figé ainsi que l'éditeur VBE. Pour forcer le VBE à sortir de la boucle, vous pouvez utiliser la touche ECHAP puis appuyer sur Débogage.

Information

Il y a différentes variantes de cette boucle, comme le Do Until... Loop ou encore le Do... Loop While et pour finir le Do... Until Loop.

La boucle While :

Pour en finir avec les boucles, utilisons ensemble la dernière : le While... Went. Cette boucle fonctionne comme le Do While... Loop.

Voici le code :

Sub While_Association_region()

Dim departement_naissance As Integer
Dim i As Integer
i = 3

While i <= 15
    departement_naissance = Range("A" & i).Value
    Select Case departement_naissance
        Case 9, 11, 12, 30, 31, 32, 34, 46, 48, 65, 66, 81, 82
        Range("B" & i).Value = "Occitanie"
        Case 75, 77, 78, 91, 92, 93, 94, 95
        Range("B" & i).Value = "Île-de-France"
        Case 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87
        Range("B" & i).Value = "Nouvelle Aquitaine"
        Case 1, 3, 7, 15, 26, 38, 42, 43, 63, 69, 73, 74
        Range("B" & i).Value = "Auvergne Rhône-Alpes"
        Case 2, 4, 5, 6, 8, 10, 13, 14, 18, 20, 21, 22, 25, 27, 28, 29, 36, 37, 39, 41, 44, 45, 49, 5O, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 67, 68, 70, 71, 72, 76, 80, 83, 84, 85, 88, 89, 90, 97
        Range("B" & i).Value = "Pas d'agence"
    End Select
    i = i + 1
Went

End Sub

J'ai fait fait 3 fois le même travail avec 3 types de boucles différentes pour faire la même chose, alors laquelle je dois choisir ? For, Do ou While ?

Comme souvent en programmation, il n'y a pas qu'une réponse. J'ai envie de vous dire que l'important c'est d'utiliser la méthode qui vous convient. Il n'y a pas de méthode vraiment meilleure qu'une autre dans les 3 que nous avons présentées.

Interrompez une boucle :

Un peu plus haut, nous avons supprimé l'itération du i et nous sommes restés coincés dans la boucle. À ce moment, je vous ai dit que la seule chose qui pouvait vous faire sortir du code c'est d'arriver à 15, c'est-à-dire la condition initiale.

J'ai volontairement omis de vous dire que vous pouvez sortir des boucles avec des instructions spécifiques, Exit For pour les boucles For et Exit Do pour les boucles Do.

Voyons ensemble le fonctionnement du code et l'utilisation que nous pouvons en faire.

Maintenant quand un département n'est pas trouvé, vous ne souhaitez pas continuer à remplir les départements, mais avertir l'utilisateur qu'il y a une erreur.

Voici le code que vous allez utiliser :

Sub for_Exit_Association_region()

    Dim departement_naissance As Integer
    Dim i As Integer
    i = 3
    
    For i = 3 To 15
        departement_naissance = Range("A" & i).Value
        Select Case departement_naissance
            Case 9, 11, 12, 30, 31, 32, 34, 46, 48, 65, 66, 81, 82
            Range("B" & i).Value = "Occitanie"
            Case 75, 77, 78, 91, 92, 93, 94, 95
            Range("B" & i).Value = "Île-de-France"
            Case 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87
            Range("B" & i).Value = "Nouvelle Aquitaine"
            Case 1, 3, 7, 15, 26, 38, 42, 43, 63, 69, 73, 74
            Range("B" & i).Value = "Auvergne Rhône-Alpes"
            Case 2, 4, 5, 6, 8, 10, 13, 14, 18, 20, 21, 22, 25, 27, 28, 29, 36, 37, 39, 41, 44, 45, 49, 5O, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 67, 68, 70, 71, 72, 76, 80, 83, 84, 85, 88, 89, 90, 97
            MsgBox ("Attention, il n'y a pas d'agence dans ce département !!!")
            Exit For
        End Select
    Next i
    
    End Sub

Comme vous pouvez le voir, seules les quatre premières cellules se sont remplies avec cette ligne de code. À la cinquième, le code :

  • est entré dans le dernier Case;

  • vous a indiqué avec un messagebox qu'il y a un problème;

  • puis il est sorti du For avec le Exit For sans terminer toute la procédure.

Vous pouvez dans vos scripts utiliser cette instruction pour ne pas rester dans ce que nous appelons une "boucle infinie".

Maîtrisez les fonctions et les événements :

Nous allons maintenant nous aventurer sur des sujets plus "simples" en pratique. Nous allons voir ensemble comment nous pouvons appeler des fonctions ou des procédures pour clarifier notre code.

Appréhendez les procédures :

Si nous devions définir ce qu'est une procédure, nous pourrions dire que c'est un morceau de code que nous souhaitons extraire du code initial.

C'est un sous-programme, en gros ? Tout à fait, c'est un sous-programme dans votre code VBA. Vous pouvez faire cela pour augmenter la lisibilité du code ou encore parce que vous utilisez le même code deux fois dans deux macros différentes. Afin de ne pas réécrire le code, nous préférons l'extraire.

Devinez quoi ? Comme d'habitude, il existe plusieurs façons de faire un sous-programme. Je vous ai dit en introduction que c'était un peu plus simple, et c'est vrai. Nous avons deux façons de faire des sous-programmes :

  • une subroutine (Sub) (que vous utilisez depuis le début dans votre code);

  • une fonction (Function).

Voici un petit tableau qui résume assez simplement ce que peuvent faire une subroutine et une fonction :

Particularité Subroutine Fonction
Elles peuvent contenir des méthodes ou des instructions ? Oui Oui
Elles peuvent être appelées depuis un autre sous-programme ? Oui Oui
Elles acceptent des arguments ? Oui Oui
Elles retournent une valeur ? Non Oui

Vous voyez rapidement que ce qui distingue une subroutine d'une fonction, ce sont les valeurs qu'elles peuvent retourner.

Mais revenons un instant sur la troisième ligne de ce tableau avec la question "Elles acceptent des arguments ?".

Oui effectivement, cela veut dire quoi, accepter un argument ? L'utilisation d'un sous-programme pose un problème : les variables que vous utilisez dans votre programme général ne sont pas disponibles dans ce nouveau sous-programme.

Prenons un exemple :

Je souhaite modifier la date de mon reporting, en transformant le mois 02 en février. Le problème, c'est que je n'ai pas envie de voir ce code avec le gros Select Case directement dans mon code, je souhaite en faire un sous-programme.

Dans mon code, j'ai besoin de lire cette variable du mois qui contient "02" et que je dois transformer.

Sub changement_mois()

Dim date_reporting As Date
Dim transformation_date As Integer
Dim mois As String
Dim jour As Integer
Dim annee As Integer

date_reporting = Range("A1").Value
transformation_date = Month(date_reporting)
jour = Day(date_reporting)
annee = Year(date_reporting)

Select Case transformation_date
    Case 1
    mois = "janvier"
    Case 2
    mois = "févrirer"
    Case 3
    mois = "mars"
    Case 4
    mois = "avril"
    Case 5
    mois = "mai"
    Case 6
    mois = "juin"
    Case 7
    mois = "juillet"
    Case 8
    mois = "août"
    Case 9
    mois = "septembre"
    Case 10
    mois = "octobre"
    Case 11
    mois = "novembre"
    Case 12
    mois = "décembre"
End Select

Range("D1").Value = "Reporting du " & jour & " " & mois & " " & annee

End Sub

Cette fonction vous permet d'écrire la date dans un titre, "Reporting du mois du 1 février 2023".

Imaginons que vous ayez besoin de cette fonction dans une autre macro, vous n'aurez pas envie de l'écrire à nouveau. C'est pourquoi vous pouvez en faire un sous-programme que vous aurez seulement besoin d'appeler pour transformer le mois.

Le problème, c'est que la lecture de la date se fait dans le programme principal; vous avez deux solutions, soit :

  • relire dans votre sous-programme la valeur de la cellule qui contient la valeur du mois;

  • passer comme argument le mois que vous avez déjà récupéré à votre sous-programme.

Pour ce premier test, vous allez relire la variable dans le sous-programme.

Voici ce que cela peut devenir avec une subroutine.

Sub changement_mois_SP()

Dim date_reporting As Date
Dim transformation_date As Integer
Dim mois As String
Dim jour As Integer
Dim annee As Integer

date_reporting = Range("A1").Value
jour = Day(date_reporting)
annee = Year(date_reporting)

transformation_mois

mois = Range("B1").Value

Range("D1").Value = "Reporting du " & jour & " " & mois & " " & annee

End Sub

Sub transformation_mois()

Dim date_reporting As Date
Dim transformation_date As Integer
Dim mois As String

date_reporting = Range("A1").Value

transformation_date = Month(date_reporting)

Select Case transformation_date
    Case 1
    mois = "janvier"
    Case 2
    mois = "février"
    Case 3
    mois = "mars"
    Case 4
    mois = "avril"
    Case 5
    mois = "mai"
    Case 6
    mois = "juin"
    Case 7
    mois = "juillet"
    Case 8
    mois = "août"
    Case 9
    mois = "septembre"
    Case 10
    mois = "octobre"
    Case 11
    mois = "novembre"
    Case 12
    mois = "decembre
End Select

Range("B1").Value = mois

End Sub

Vous avez fractionné le programme initial qui est maintenant bien plus petit et on peut voir qu'il appelle le sous-programme transformation_mois. Le sous-programme :

  • récupère les informations de la date dans le fichier;

  • passer par le Select Case;

  • puis stocke la valeur de sa transformation dans la cellule B2.

Le programme principal n'a plus qu'à récupérer cette valeur en B2 et écrire le titre du reporting.

Information

Félicitations ! Vous venez de faire votre premier sous-programme !

Nous allons faire une légère digression avant de passer aux arguments.

Vous pouvez limiter la portée des appels pour les différents sous-programmes en utilisant la procédure :

  • Private : utilisable seulement par les programmes d'un même module;

  • Public : utilisable par tous les modules;

  • Static : permet d'utiliser les variables pendant toute la durée du programme (les variables sont globales et non plus locales pour un sous-programme).

Mais dans l'exemple, il n'y a rien d'écrit : pas de private, public ou static. C'est normal ? Effectivement, de base quand on ne rajoute rien, le sous-programme est par défaut en public.

Si vous souhaitez limiter l'appel de votre programme à votre module, vous écrirez :

Private Sub transformation_mois()

Voyons comment fractionner notre code pour le rendre lisible.

Maîtrisez les arguments de vos fonctions :

Comme nous l'avons vu plus haut, vous pouvez fractionner un morceau de programme que vous êtes susceptible de réutiliser, ou tout simplement pour rendre le code plus lisible.

Je ne sais pas si vous avez fait attention, mais dans le sous-programme que nous avons utilisé, nous avons écrit volontairement le résultat de notre Select Case dans la cellule B2. Les sous-programmes ne permettent pas de renvoyer une valeur à un autre sous-programme, c'est pour cela que nous avons écrit dans une cellule sur Excel pour stocer la valeur.

Pour pallier ce problème, nous pouvons utiliser des fonctions. L'utilisation des fonctions est très similaire à la subroutine, à la différence qu'elle peut renvoyer à un autre programme avec la transformation des données.

Regardons ensemble ce que cela va changer sur notre programme initial avec la subroutine.

Sub changement_mois_Fonc()

Dim date_reporting As Date
Dim mois As string
Dim jour As Integer
Dim annee As Integer

date_reporting = Range("A1").Value
jour = Day(date_reporting)
annee = Year(date_reporting)

mois = transformation_mois_fonc(date_reporting)

Range("D1").Value = "Reporting du " & jour & " " & mois & " " & annee

End Sub

Private Function transformation_mois_fonc(ByVal transformation_date As Date) As string

transformation_mois_fonc = Month(transformation_date)

Select Case transformation_mois_fonc
    Case 1
    transformation_mois_fonc = "janvier"
    Case 2
    transformation_mois_fonc = "février"
    Case 3
    transformation_mois_fonc = "mars"
    Case 4
    transformation_mois_fonc = "avril"
    Case 5
    transformation_mois_fonc = "mai"
    Case 6
    transformation_mois_fonc = "juin"
    Case 7
    transformation_mois_fonc = "juillet"
    Case 8 
    transformation_mois_fonc = "août"
    Case 9
    transformation_mois_fonc = "septembre"
    Case 10
    transformation_mois_fonc = "octobre"
    Case 11
    transformation_mois_fonc = "novembre"
    Case 12
    transformation_mois_fonc = "décembre"
End Select

End Function

Vous voyez dans le code ci-dessus que la fonction est déclarée comme une Private Function. Et cette fois, dans les parenthèses de la fonction nous avons ajouté une variable que nous avons déclarée. Elle s'appelle transformation_date, et c'est une date. Cette déclaration vous permet de dire à la fonction que quand vous allez l'appeler dans le programme principal, vous lui donnez une valeur qui sera une date et qui sera automatiquement transférée dans cette nouvelle variable transformation_date.

Dans la déclaration de la fonction, j'ai également ajouté As String à la fin de la déclaration.

Ce n'est pas une erreur, ça ? Vous ne voyez pas le rapport entre une déclaration de variable et une fonction. Eh bien non, ce n'est pas une erreur. En faisant cela, j'utilise le nom de ma fonction comme une variable et je vais justement retourner cette variable transformation_mois_fonc dans mon programme principal. Vous pouvez également voir que j'ai remplacé la variable qui contient le résultat de mon Select Case par cette nouvelle variable.

Retournons maintenant du côté du sous-programme. J'ai seulement changé l'appel de ma fonction :

mois = transformation_mois_fonc(date_reporting)

Je passe dans ma fonction la variable date_reporting pour que ma fonction puisse la récupérer. Vous voyez que je stocke la valeur de ma fonction dans la variable mois. En effet, la fonction va nous renvoyer une valeur au travers d'une string (que nous avons déclarée dans la fonction).

Je n'ai volontairement pas encore parlé du ByVal que j'ai ajouté dans ma fonction, c'est vrai. Je garde le meilleur pour la fin.

Vous pouvez ajouter soit un ByVal soit un ByRef, sachant que si vous ne mettez rien, c'est que vous utilisez un ByRef. En ajoutant un ByVal, je protège ma variable initiale qui ne va pas changer. En effet, la valeur qui est renvoyée par ma fonction est une nouvelle variable.

En utilisant un ByRef, je modifie la variable initiale en la remplaçant par ma transformation.

Information

L'utilisation du ByRef est plus performante, car j'utilise toujours la même variable, alors que l'utilisation du ByVal est protectrice, car j'utilise une nouvelle variable.

Interagissez avec les utilisateurs via des forlulaires :

Nous avons vu ensemble, tout au long de ce cours, les différents variables, opérateurs, boucles et fonctions. Il nous reste à voir une dernière partie importante : comment interagir avec les utilisateurs ?

Ça va être plus visuel, car vous allez voir les boîtes de dialogue et les formulaires.

Interagissez avec Excel en créant votre boîte de dialogue :

Depuis le début de ce cours, vous avez déjà utilisé des boîtes de dialogue sans vraiment les nommer.

Information

Une boîte de dialogue est une fenêtre qui permet d'interagir avec les utilisateurs.

Vous avez au début utilisé les msgbox. C'est la boîte de dialogue la plus simple pour Excel.

Le code est très simple. C'est seulement :

Sub premier_message()
msgbox ("Hello World")
End Sub

Quand vous exécutez ce code, vous obtenez une petite fenêtre qui vous dit :

Exemple de messagebox dans Excel

Rappelez-vous que nous avions utilisé la msgbox pour donner à l'utilisateur son département de rattachement. C'est une version simple des différentes interactions que nous allons voir avec les utilisateurs.

Vous pouvez customiser un peu ce bouton pour qu'il soit plus sympa pour l'utilisateur. Vous pouvez rajouter par exemple le bouton Annuler :

Sub deuxieme_message()
msgbox ("Souhaitez-vous confirmer la fermeture de l'onglet ?", vbYesNo + vbQuestion)
End Sub

Dans cette deuxième version, j'ai rajouté vbYesNo qui permet d'afficher les boutons Oui et Non, ainsi que l'icône vbQuestion qui vous permet d'avoir un point d'interrogation :

Exemple de messagebox avec un choix (oui ou non)

Voici les principales personnalisations rapodes que vous pouvez faire :

  • Bouton :

    • vbOKOnly → bouton OK

    • vbOKCancel → boutons OK et Annuler

    • vbAbordRetryIgnore → biutons Abandonner, Répéter et Ignorer

    • vbYesNoCancel → biytons Oui, Non et Annuler

    • vbYesNo → boutons Oui et Non

  • Icône :

    • vbCritical → icône Interdit

    • vbQuestion → icône Question

    • vbExclamation → icône Exclamation

    • vbInformation → icône Information

Cette boîte de dialogue peut vous renvoyer également le bouton que l'utilisateur a choisi :

  • 1 : OK

  • 2 : Annuler

  • 3 : Abandonner

  • 4 : Répéter

  • 5 : Ignorer

  • 6 : Oui

  • 7 : Non

Voici le code pour récupérer la réponse de l'utilisateur avec une variable :

Sub deuxieme_message_recup()
Dim valeur_msgbox As Integer

valeur_msgbox = msgbox ("Souhaitez-vous confirmer la fermeture de l'onglet ?", vbYesNo + vbQuestion, "Demande utilisateur")
End Sub
Exemple de messagebpx avec l'événement beforesave

Et voici l'état de la variable :

Exemple de récupération du choix de l'utilisateur dans le messagebox

Vous pouvez également demander des informations à l'utilisateur en ouvrant une InputBox en lui demandant de saisir une information.

Allez par exemple demander à l'utilisateur de saisir lui-même son département de naissance :

Sub demande_utilisateur()

Dim departement As Integer

departement = InputBox("Quel est votre département de naissance ?", "demande du département", 0)
End Sub
Exemple d'InputBox dans Excel

La première partie de l'InputBox permet de poser la question à l'utilisateur, puis ensuite de saisir le titre de cette fenêtre. La dernière partie permet de saisir une valeur par défaut. Nous stockons cette information dans une variable, puis vous pouvez maintenant l'utiliser dans la suite de votre programme.

Utilisez les boîtess de dialogue Excel :

Certaines boîtes de dialogue sont propres à Excel. C'est le cas des deux boîtes de dialogue que vous allez voir maintenant.

La première s'appelle GetOpenFileName, et elle permet quand vous l'utilisez d'ouvrir une fenêtre pour choisir le fichier à ouvrir.

L'utilisation est très simple :

Sub ouverture_fichier()

Application.GetOpenFilename Title:="Sélectionner le fichier à ouvrir pour la mise à jour"

End Sub

Ce code va ouvrir la fenêtre qui permet d'ouvrir de nouveaux fichiers Excel. J'ai ici personnalisé le texte de cette fenêtre.

La deuxième s'appelle GetSaveAsFileName. Vous l'aez peut-être deviné : elle permet d'ouvrir la fenêtre "Enregistrer sous" d'Excel. Elle fonctionne exactement de la même manière.

Est-ce qu'il y a aussi une boîte de dialogue pour imprimer ? Non effectivement, il n'existe pas de boîte de dialogue toute faite pour imprimer une page. Cependant, comme d'habitude en VBA, il y a une solution à tout !

Vous pouvez utiliser une ligne de code pour choisir l'imprimante et une deuxième qui lance l'impression (ou qui vous demande où il faut enregistrer le fichier si c'est une impression PDF).

Voici le code :

Sub Impression()

Application.Dialogs(xlDialogPrinterSetup).Show
ActiveSheet.PrintOut Copies:=1, Collate:True, _
IgnorePrintAreas:=False
End Sub

Utilisez les formulaires :

Pour finir, nous allons voir ensemble les formulaires. C'est un outil puissant mais assez compliqué. Nous n'allons pas pouvoir faire un exemple très compliqué maintenant mais peut-être un peu plus tard dans le cours. L'idée est plutôt que vous puissiez vous rendre compte de la grande capacité des formulaires en VBA.

Jusqu'à maintenant vous avez vu des fenêtres ou des boîtes de dialogue propres à Microsoft. Les formulaires vous permettent de créer vous-même de nouvelles boîtes de dialogue en insérant différents objets.

Pour commencer, vous allez ajouter un userform. C'est une feuille spéciale qui permet de fabriquer votre boîte de dialogue. Pour cela, il faut aller dans "Insertion" puis "UserForm".

Vous avez maintenant une fenêtre vide que vous allez pourvoir paramétrer en ajouter différents contrôles, comme :

  • du texte;

  • des listes;

  • des cases à cocher;

  • des boutons d'options;

  • des boutons à bascules;

  • des onglets;

  • des barres de défilement;

  • etc.

Voici un petit formulaire qui permet de demander à l'utilisateur de choisir dans une litse son département de naissance :

Exemple de formulaire
Information

J'ai fait différents paramètres dans les boutons, que nous allons voir ensemble ainsi que sur la liste.

Information

Pour accéder au code d'un bouton, il faut cliquer dessus.

Voici le code associé au bouton OK :

Private Sub Bouton_OK_Click()
Dim choix_departement As string

choix_departement = ComboBox1.Value
Unload Me
Association_region_formulaire (choix_departement)

Je déclare une variable choix_departement qui vous permet de récupérer la valeur de la combobox1 en utilisant le .value.

Le code Unload me permet de fermer le userform, puis j'appelle un sous-programme que nous avons vu précédemment. Il va vous renvoyer avec une msgbox l'agence à laquelle vous vous êtes rattaché.

Information

J'ai modifié le début du code pour qu'il puisse prendre une variable, car je souhaite lui envoyer la valeur de notre liste. Voici le début du code jusqu'au Select Case :

Sub Association_region_formulaire(departement_naissance As Integer)

Select Case departement_naissance

Concernant le bouton Annuler, j'ai simplement utilisé une msgbox qui dit à l'utilisateur qu'il a abandonné la procédure.

Enfin, concernant la liste, j'ai seulement passé la liste des départements que j'ai stockés dans une feuille Excel en utilisant les propriétés de la combobox.

Quand vous cliquez sur la combobox, sur la gauche du VBE vous avez toute la liste des propriétés. C'est assez large, cela va du nom et de la valeur du bouton, en passant par la couleur et les bordures, etc.

Pour la combobox, vous avez également une propriété qui est RowSource. De mon côté, j'ai chargé pour la plage de cellules "Feuil1!A2:A46".

Une fois que vous avez fini le paramétrage, vous pouvez, quand vous êtes sur le userform, utiliser le bouton "Play" pour tester le userform.

Transférez vos compétences d'Excel à Google Sheets :

Utilisez vos compétences Excel dans Google :

Depuis le début de ce cours, nous parlons beaucoup de VBA et de programmation dans Excel. Depuis quelque temps, il y a d'autres logiciels qui permettent de faire comme Ecvel. On retrouve bien sûr la version en ligne d'Excel avec Microsoft 365, mais Google a également sorti sa suite bureautique avec Google Sheets.

Google a donc également sorti sa version des macros. Vous pouvons donc faire la même chose qu'avec Excel direrectement dans Google Sheets en utilisant cette fois du JavaScript.

Information

Le JavaScript est un langage de programmation utilisé principalement sur les pages internet.

Comme nous l'avions abordé au début de ce cours, vous allez pouvoir confirmer que l'important, c'est d'apprendre un premier langage de programmation. Le JavaScript est bien sûr différent du VBA dans les mots à utiliser, mais il reste fondamentalement similaire au VBA dans la conception.

Si on fait le parallèle avec le langage humain, la prmeière langue que l'on va apprendre va être difficile. Vous aurez par contre des facilités d'apprentissage pour les autres langues que vous apprendrez. C'est exactement pareil pour la programmation ! C'est pourquoi je vous propose de traduire un de vos premiers scripts en JavaScript, et de l'exécuter sur Google Sheets.

Écrivez votre premier script sur Google Sheets :

Allez sur Google Sheets et créez un nouveau sheet. Pour les besoins de notre exemple, nous allons refaire le code VBA que nous avons déjà vu plus haut :

Sub annee()

Dim departement_naissance As string
departement_naissance = Range("A1").Value

If departement_naissance = 34 Then
    MsgBox ("Tu es rattaché à l'agence Occitanie")
    ElseIf departement_naissance = 75 Then
    MsgBox ("Tu es rattaché à l'agence d'Île-de-France")
    ElseIf departement_naissance = 33 Then
    MsgBox ("Tu es rattaché à l'agence de Nouvelle Aquitaine")
    ElseIf departement_naissance = 69 Then
    MsgBox ("Tu es rattaché à l'agence Auvergne Rhône-Alpes")
    Else
    MsgBox ("Nous n'avons pas l'information")
End If

End Sub

Dans ce code, vous avez déclaré une variable, puis vous l'avez chargée avec la valeur de la cellule A1. Vous avez ensuite testé pour 4 départements (34, 75, 33 et 69), et vous avez indiqué l'agence de rattachement. Si on ne connaît pas le départelent, vous indiquez que nous n'avons pas l'information.

Afin de commencer à écrire votre macro, vous allez écrire dans un premier temps 34 dans la cellule A1 de votre Google Sheets.

Allez ensuite dans l'éditeur de macro. Pour faire cela, il faut aller dans Extensions puis cliquer sur Apps Script. Cela vous ouvre un nouvel onglet vers l'apps script, l'éditeur de macro de Google Sheets.

Information

Avant de vous spoiler avec la suite du cours, je vous encourage fortement à faire quelques recherches et à tester par vous-mêmes les différentes lignes de commande qu'il faut trouver. Le code utilisé est du JavaScript, vous pouvez aller voir sur Internet tout un tas de ressources pour comprendre comment faire pour récupérer une valeur, déclarer une variable ou encore utiliser un IF.

Vous trouverez ci-dessous un corrigé du code en JavaScript, qui fait exactement la même chose. Vous pouvez vous amuser à regarder les similitudes entre les deux langages.

VBA JavaScript
SUb annee() function annee() {
Dim departement_naissance As String
departement_naissance = Range("A1").Value var departement_naissance = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A1").getValue();
If departement_naissance = 34 Then if (departement_naissance == 34) {
MsgBox ("Tu es rattaché à l'agence Occitanie") SpreadsheetApp.getUi().alert("Tu es rattaché à agence Occitanie");
ElseIf departement_naissance = 75 Then } else if (departement_naissance == 75) {
MsgBox ("Tu es rattaché à l'agence d'Île-de-France") SpreadsheetApp.getUi().alert("Tu es rattaché à l'agence d'Île-de-France");
ElseIf departement_naissance = 33 Then } else if (departement_naissance == 33) {
MsgBox ("Tu es rattaché à l'agence de Nouvelle Aquitaine") SpreadsheetApp.getUi().alert("Tu es rattaché à l'agence de Nouvelle Aquitaine");
ElseIf departement_naissance = 69 Then } else if (departement_naissance == 69) {
MsgBox ("Tu es rattaché à l'agnence Auvergne Rhône-Alpes") SpreadsheetApp.getUi().alert("u es rattaché à l'agence Auvergne Rhône-Alpes");
Else } else {
MsgBox("Nous n'avons pas l'information") SpreadsheetApp.getUi().alert("Nous n'avons pas l'information");
End If }
End Sub }

Comme vous pouvez le voir sur cet exemple, le code est très similaire. Ce sont deux langages de programmation qui sont différents, mais vous remarquez que dans la manière, chaque ligne de VBA est associée à une ligne en JavaScript.

Comme nous l'avons dit au début de ce cours, l'important en programmation c'est de comprendre les concepts. Vous pourrez rapidement vous adapter à un nouveau langage de programmation si vous avez compris la logique.

Prolongez votre apprentissage de VBA :

Précédemment, vous avez vu comment utiliser le VBA pour automatiser des tâches. Bien évidemment, cela n'est pas encore suffisant pour se lancer dans de l'analyse de données. Pour certaines parties comme les objets, nous n'avons qu'effleuré les possibilités.

Poursuivez votre apprentissage :

Comme dans tous les apprentissages, vous pouvez toujours continuer à apprendre de nouvelles choses. La programmation ne fait pas exception, bien au contraire. Le code évolue tellement vite qu'il faut toujours essayer de rester au courant des nouvelles tendances. Parfois cela permet d'ouvrir sur des choses qu'on ne pensait alors jamais faire, ou encore accélérer le traitement d'une tâche avec une nouvelle manière de procédéder.

Information

Vous trouverez énormément de ressources sur le site de Microsoft sur le VBA.

L'avantage du VBA, c'est que ce code est utilisé depuis plusieurs dizaines d'années. Il y a plusieurs millards de lignes de code disponibles sur internet sur des miliers de forums. L'important, c'est d'arriver à faire ce que vous voulez avec votre code.

Depuis le temps que ce code existe, je me dis toujours que je ne dois pas être tout seul à avoir eu tel ou tel problème, et que cette question a déjà dû être posée sur internet. Une simple recherche sur internet permet le plus souvent de trouver une solution à votre problème.

Utilisez VBA en dehors d'Excel :

Nous l'avons dit en introduction, le langage VBA est un langage principalement utilisé par Microsoft pour les applications Microsoft.

Nous l'avons pour le moment uniquement utilisé au travers d'Excel, mais en réalité vous pouvez interagir avec différentes applications à partir du VBE Excel.

Pour terminer notre projet, vous pourriez imaginer un dernier bouton qui serait "Envoi du reporting". Le code permettrait de passer à Outlook la liste des destinataires, l'objet, le corps du mail ainsi que la pièce jointe, puis pour finir, de l'envoyer directement.

Nous reviendrons sur cet exemple prochainement dans la suite de cours qui sera consacrée à l'analyse de données.

Nous en profiterons également pour exécuter des requêtes dans une base ACCESS.

Bravo ! Vous venez de terminer la partie de ce cours sur la découverte des fondamentaux du VBA. Nous avons vu comment nous pouvons automatiser des tâches simples en VBA avec l'aide des vairables, des opérateurs, des boucles et des fonctions.

Si vous souhaitez apprendre à toujours plus automatiser votre récolte de données, vos analyses et votre reporting, suivez-moi dans la deuxième partie de ce cours sur le VBA : >Analysez vos données avec VBA.