Dans ce chapitre, nous allons aborder des concepts de base en VBA qui vous permettront de comprendre comment Visual Basic for Applications (VBA) fonctionne: comment et où le code est placé, comment il est distribué et comment il peut être lancé…
Pour se tenir du concept "Droit au but", je vous présente les informations nécessaires (et les plus utiles) et j'ajoute les liens vers les articles plus détaillés là, où c'est utile (en bleu). À la fin de ce module, vous serez prêts pour la programmation de vos premiers macros…
Sommaire
Code VBA & type de fichiers Excel
Le Microsoft Excel utilise différent types de fichiers (une grosse dizaine). Mais lors de l'utilisation "normale", vous en croiserez probablement deux:
le .XLSX
et le .XLSM
.
La principale différence entre ces deux types de fichiers est la prise en charge des macros VBA. Jadis, il y avait un seul format principal, le .XLS
. Depuis, pour des raisons de sécurité, Microsoft a séparé les fichiers en .XLSX
qui ne contiennent que des données et n'exécutent donc rien (risque pour l'utilisateur = zéro), et en .XLSM
qui peuvent contenir du code qui s'exécute (et qui peut, soyons honnêtes, être potentiellement dangereux).
Conseil: pour des fichiers XLSM
dont vous ne connaissez pas la source, méfiez-vous. Vérifier le code avant de le lancer. Et attention au code qui s'auto-exécute à l'ouverture (voir la section suivante & voir le chapitre 5.9. Les ÉVÉNEMENTS en VBA (Events)).
Ce qui nous intéresse donc, c'est que pour vos fichiers contenant des macros, vous devrez utiliser le format .XLSM
et non .XLSX
. Si vous ajoutez du code VBA dans un fichier .XLSX
et vous le sauvegardez, le code VBA ne sera pas sauvegardé et sera perdu.
Options de sécurité d'Excel
Comme c'est mentionné plus haut, le code VBA peut être malveillant (tout comme n'importe quel autre code qui peut être exécuté sur votre ordinateur). Microsoft en est conscient et prend les mesures assez strictes pour éviter des abus.
La première mesure était de séparer les fichiers en XLSX
et XLSM
(voir plus haut). La suivante est que l'exécution des macros doit être autorisée explicitement par l'utilisateur. Cela se fait au niveau des Options d'Excel.
Selon la version de votre Excel, le chemin à utiliser pour accéder au menu de sécurité peut légèrement varier (mais en gros, cela n'est pas difficile à trouver dans aucune version).
Dans Office 365, allez dans le volet "Fichier", ensuite, tout en bas dans "Options".
Vous continuez en ouvrant le volet "Centre de gestion de la confidentialité" tout en bas et ensuite le vous cliquez sur "Paramètres du Centre de gestion de la confidentialité" à droite).
Vous choisissez le volet "Paramètres des macros" et ça y est…
Comme vous pouvez le voir, vous avez 4 possibilités d’autorisation des macros:
- Désactiver toutes les macros sans notification – avec cette option, vous ne ferez pas beaucoup de programmation en VBA 🙂 Vous ne pourrez pas non plus exécuter les macros.
- Désactiver toutes les macros avec notification – avec ce choix, lors de la première ouverture d'un fichier contenant des macros, un message apparaîtra vous demandant la confirmation d'autorisation des macros pour ce fichier en particulier.
- Désactiver toutes les macros à l'exception des macros signées numériquement – seuls les fichiers contenant un "certificat" (ou signature électronique si vous préférez) seront autorisés. Tous les autres fichiers avec macros seront ignorés. Mais comme la plupart des macros ne sont pas "signées", vous risquez d’être fort limités…
- Activer toutes les macros (non recommandé; risque d'exécution de code potentiellement dangereux) – ce choix a pour conséquence que toutes les macros de tous les fichiers seront autorisés et exécutés. A utiliser uniquement si vous travaillez seulement avec vos propres macros ou avec des macros de sources tout à fait fiables. Avec cette option, le code VBA qui s'exécute automatiquement à l'ouverture du fichier sera effectivement exécuté sans que vous ayez la possibilité de voir / vérifier le code auparavant. Microsoft dit: "pas recommandé". Et je suis tout à fait d'accord avec eux…
Pour une utilisation normale, que ce soit pour vous en tant que développeur VBA ou pour les utilisateurs de vos macros, je vous conseille de choisir la deuxième option: "Désactiver toutes les macros avec notification". C'est un bon compromis entre la flexibilité et la sécurité.
Activer le contenu & autoriser les macros
Si vous avez choisi l'option de "Désactivation des macros avec notification" comme je vous le conseille plus haut, vous aurez droit à une "barre d'avertissement" lors de la première ouverture de chaque fichier Excel contenant des macros (.XLSM
).
Excel va vous avertir que les macros sont désactivé et vous aurez la possibilité de les activer. Une fois que vous aurez cliqué sur le bouton "Activer le contenu", les macros seront utilisables.
Pour votre information: ce message n'apparaît que lors de la première ouverture du fichier. Excel va retenir votre réponse et va l'appliquer automatiquement lors des ouvertures suivantes. Si cependant, vous changez le nom du fichier, le message apparaîtra à nouveau car le fichier avec le nouveau nom sera considéré par Excel comme un nouveau fichier qui n'a pas encore été ouvert.
Où placer le code VBA dans votre Projet
Maintenant que l'on sait qu'il faut utiliser les fichiers .XLSM
qui peuvent stocker des macros VBA, voici quelques explication sur la manière dont les macros sont "stockées" dans un fichier .XLSM
.
Le contenu VBA d'un fichier Excel s'appelle un "Projet VBA" (VBAProject
en anglais).
Le Projet est divisé en plusieurs objets – les voici dans une capture d'écran prise dans l'éditeur du code VBA:
Vous avez donc 4 groupements:
- Objets Microsoft Excel – vous trouverez ce groupe dans chaque fichier, qu'il contient du code VBA ou pas. Un "Objet Microsoft Excel" est soit le Classeur (
ThisWorkbook
) soit chaque Feuille de ce Classeur. Chaque Objet peut contenir du code VBA qui le concerne en particulier. En gros, ceci sert notamment à placer le code utilisé pour gérer des événements (voir le chapitre 5.9. Les ÉVÉNEMENTS en VBA (Events)). - Feuilles – les "Feuilles", ce sont en fait les "Formulaires VBA". Je trouve l'utilisation du mot "Feuille" plutôt contre-productif car elle prête à confusion avec les Feuilles (
Sheets
) dans le Classeur. En anglais, cette confusion n'a pas lieu (car il y a desSheets
= feuilles du classeur, et desUserForm
= formulaires VBA). Dans le groupe "Feuilles", vous trouverez la liste des Formulaires VBA disponibles dans votre Classeur. S'il y en a pas, vous ne verrez pas ce groupement… Le concept des "Formulaires VBA" est un puissant outil qui vous permettra de créer des véritables applications en VBA. On abordera ce sujet dans le chapitre "5.8. Utilisation des FORMULAIRES en VBA". - Modules – les Modules sont des "conteneurs" principaux pour votre code. Vous pouvez stocker toutes vos Macros dans un seul Module. Mais si votre code est plus complexe et/ou volumineux, les Modules servent à structurer et regrouper votre code pour une utilisation plus facile. Sachez que la manière de grouper les macros dans les Modules n'influence pas leur manière de fonctionner. Il s'agit d'une fonctionnalité purement organisationnelle (mais bien utile!) – pour se retrouver plus facilement dans le code, pour pouvoir importer/exporter plus facilement le code VBA etc.
Remarque: dans un fichier Excel vierge il n'y a pas de Module. Vous devez commencer par en créer un ou plusieurs (dans l'éditeur VBA, clic droit sur votre Projet & "Insertion" & "Module") - Modules de classe – les Modules de classe servent à stocker le code VBA qui constitue des Classes (qui l'aurait dit! 😉 ). Les Classes sont un concept assez particulier qui est utilisé par les programmeurs très avancés qui gèrent des grands projets. On ne va pas s'occuper des Classes dans le cadre de ce cours. Sachez que vous pouvez passer toute votre vie à programmer en VBA sans jamais devoir les utiliser…
ThisWorkbook
(événements liés au Classeur – ouverture, fermeture, sauvegarde,…) ou dans un ou plusieurs Objets Feuil
(événements liés à une Feuille – changement dans la Feuille,…). Le code pourra être stocké dans les “Formulaires VBA” si vous les utilisez. Tout le reste de votre code sera à places dans un ou plusieurs Module(s)
. La manière de regrouper votre code dans les Modules
est personnel et sert principalement à vous faciliter le travail. Principales pièces de code VBA: Fonction & Procédure
Maintenant que vous savez où et pourquoi placer le code VBA dans le fichier .XLSM, on peut passer à la suite… C'est-à-dire l'organisation du code VBA lui même. Dans le langage courant, on entend le plus souvent parler d'une "Macro VBA". C'est un terme générique qui désigne un code relativement court qui exécute une action spécifique – le plus souvent il s'agit de l'automatisation d'une suite de tâches en Excel.
Deux principales unités de code en VBA sont des Procédures (ou Routines) et des Fonctions.
En gros, il y a trois différences principales entre ces deux concepts:
- Une Procédure effectue une ou plusieurs actions. Une Fonction peut effectuer une action ou un calcul et (en plus) retourne un résultat.
- Une Fonction, contrairement à une Procédure, peut être utilisée directement dans des cellules de la Feuille Excel (cette possibilité est développée dans le chapitre 5.6. Les UDF en VBA (User Defined Function))
- Les Fonctions et les Procédures ne sont pas lancées de la même manière: La Procédure est en quelque sorte un "programme autonome" qui peut être lancé indépendamment de plusieurs manières (voir la section suivante). La Fonction ne peut pas être lancé indépendamment et doit faire partie d'une Procédure. ( >> C'est en fait comme si la Procédure était l'application Word et la Fonction un fichier .docx : vous pouvez ouvrir Word même si vous ne disposez d'aucun fichier .docx. Vous pouvez ouvrir le fichier .docx à partir de votre Word. Par contre il est impossible d'ouvrir un fichier .docx si vous n'avez pas de Word… )
Pour des simples macros, il vous suffira d’une Procédure (et éventuellement des Fonctions si vous effectuez des calculs spécifiques). Mais plus votre Projet devient complexe, plus vous ressentirez le besoin de diviser le code en plus petites parties… Surtout si elles sont réutilisables! Inutile de se répéter et d’écrire le même code plusieurs fois (voir chapitre 8. Faites du VBA comme un PRO). Vous verrez cela tout le long de ce cours VBA dans les exemples qui seront utilisés.
Procédure VBA & Exemples concrets
Comme mentionné plus haut, le code d'une Procédure VBA commence par Sub
suivi du nom de la procédure et éventuellement des arguments à utiliser. Cela va donc donner par exemple Sub FermerFichierSansSauvegarde()
: c'est donc une Procédure (Sub
) qui s'appelle FermerFichierSansSauvegarde
et qui ne contient pas d'arguments ( ()
).
Le code de la Procédure se termine par End Sub
(voir l'exemple d'une routine VBA plus loin).
La Procédure peut également contenir des arguments. Sa première ligne ressemblera à: Sub SupprimerUtilisateur(NomUtilisateur As String)
C'est donc effectivement une Procédure (Sub
) qui s'appelle SupprimerUtilisateur
et qui utilise un argument de type texte qui contient le nom de l'utilisateur à supprimer (NomUtilisateur As String)
.
Sachez que si une Procédure utilise des arguments, vous ne pourrez pas l’exécuter telle quelle. Vous devez “l’appeler” dans une autre Procédure qui lui fournira les valeurs pour ses Arguments.
On verra ce concept plus en détail tout le long de ce cours…
Et voici donc un exemple très simple d'une Procédure VBA… Une fois exécutée, elle affichera une fenêtre pop-up avec n message. Vous pouvez simplement la copier/coller dans votre Projet pour la tester.
1 2 3 4 5 |
Sub DisBonjour() MsgBox "Bonjour tout le monde!" End Sub |
Comme vous pouvez voir, la Procédure DisBonjour()
n'utilise ni un input particulier (elle n'a pas d'arguments) ni ne retourne aucune valeur (ce n'est pas une Fonction). La première ligne ( DisBonjour()
) marque son début et la dernière ligne sa fin ( End Sub
). Le code qui se trouve entre ces deux lignes sera exécuté quand la macro est "lancée" (dans cet exemple ce n'est qu'une seule instruction).
Fonction VBA & Exemples concrets
Le code d'une Fonction VBA est facilement reconnaissable: il commence par Function NomDeFonction()
et se termine par End Function
. La Fonction VBA peut utiliser des Arguments mais vous trouverez également des Fonctions sans Arguments. Mais, par la nature même de la Fonction, vous verrez plus souvent des Fonctions avec des Arguments.
Comme expliqué plus haut, une Fonction retourne toujours un résultat. Ce résultat peut être sous forme d'un chiffre, d'une chaîne de caractères, d'un Boolean
(Vrai / Faux) etc.
Voici des exemples concrets de Fonctions VBA. Une sans et une avec des Arguments pour bien voir la différence.
Exemple d'une Fonction qui n'utilise pas des arguments.
1 2 3 4 5 6 7 8 9 10 11 12 |
Function UtilisateurEstAdmin() 'extraction du nom d'utilisateur du PC NomUtilisateur = Environ("UserName") 'si le nom d'utilisateur du PC est Dupont ou Duval, il sera considéré come "admin" If NomUtilisateur = "Dupont" Or NomUtilisateur = "Duval" Then UtilisateurEstAdmin = True Else UtilisateurEstAdmin = False End If End Function |
Cet exemple va donc retourner True
ou False
(= Vrai
ou Faux
) selon si l'utilisateur est considéré comme administrateur ou pas. La fonction n'a pas d'argument car le seul input qu'elle utilise se trouve dans le code même de la fonction ( NomUtilisateur = Environ("UserName")
). La fonction n'a donc pas besoin d'aucune information "venant de l'extérieur" lors de son exécution.
Exemple d'une fonction VBA qui utilise des arguments (deux dans ce cas-ci)
1 2 3 4 5 6 7 8 9 |
Function PlusGrandNombre(Nombre1, Nombre2) If Nombre1 > Nombre2 Then PlusGrandNombre = Nombre1 Else PlusGrandNombre = Nombre2 End If End Function |
Cette fonction compare deux nombres et renvoie comme résultat la valeur du plus grand nombre des deux. Logiquement donc, cette Fonction utilise comme input deux arguments: Nombre1
et Nombre2
. Si ces deux valeurs ne sont pas fournies, la fonction ne va pas fonctionner car elle ne pourrait pas déterminer le résultat à envoyer.
Pour pouvoir tester cette Fonction chez vous, vous devez créer également une Procédure qui va "appeler" la Fonction en lui fournissant les valeurs input.
Voici donc le code complet qui vous permettra de tester le fonctionnement de cette Fonction (avec des nombres 50 et 37 comme exemple).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub TesterNombres() MsgBox PlusGrandNombre(50, 37) End Sub Function PlusGrandNombre(Nombre1, Nombre2) If Nombre1 > Nombre2 Then PlusGrandNombre = Nombre1 Else PlusGrandNombre = Nombre2 End If End Function |
Vous devez lancer la Procédure TesterNombres()
pour voir le résultat. Comment faire? L'explication sur l'exécution du code VBA se trouve dans la section suivante!
Remarque: Sachez que vous pouvez/devez combiner les différentes pièces de code (des deux types : Fonctions & Procédures) afin d’obtenir un résultat souhaité. Une Procédure peut faire appel à des Fonctions mais aussi à d'autres Procédures. Tout comme une Fonction peut faire appel à d'autres Fonctions et même à des Procédures (même si cette dernière combinaisons n'a pas vraiment d'utilité).
Le déclenchement du code VBA: comment lancer une macro VBA
Il existe plusieurs manières de lancer une macro VBA, qu'elle soient manuelles ou automatiques. Le choix de la méthode d'exécution du code VBA dépend du contexte et de la situation. Voici donc les explications…
Déclencher une macro à partir de la liste des macros disponibles
De votre fenêtre principale d'Excel, vous pouvez accéder à la liste des Macros disponibles. Sur cette liste, vous avez la possibilité de sélectionner une macro et de lancer son exécution.
Vous pouvez accéder à cette liste soit avec le raccourci clavier Alt + F8
, soit via le Ruban: onglet "Affichage" ensuite "Macros" (voir capture d'écran) et ensuite "Afficher les Macros"…
Les deux vous mèneront donc vers la liste des macros disponibles. Dans celle-ci, vous pouvez sélectionner une macro et lancer son exécution.
Utiliser un bouton pour lancer la macro
Une autre méthode, la plus "facile" pour l'utilisateur, c'est d'ajouter un bouton quelque part sur une Feuille dans votre Classeur et associer une Macro au clic sur ce bouton. C'est très simple, visuellement agréable et ne requiert aucune connaissance particulière de l'utilisateur.
Le hic est qu'il faut trouver un endroit approprié pour placer votre bouton. Cela n'est donc pas très utile dans des fichiers qui ne contiennent que des tableaux de données. Une solution facile: ajouter une Feuille supplémentaire au Classeur et placer le(s) bouton(s) sur cette Feuille là ce qui n'impactera point les feuilles existantes avec des données…
Déclenchement automatique lors d'un Événement (Event)
Une autre possibilité qu'offre VBA sont les "Événements" (en anglais Events
) – il s'agit d'une série d'actions qui exécutent automatiquement le code VBA qui leur est attribué. Ces événements peuvent être par exemple: l'ouverture d'un Classeur, changement de valeur d'une cellule, sauvegarde de fichier,…
Ce concept sera expliqué en détail dans le chapitre: 5.9. Les ÉVÉNEMENTS en VBA (Events) de ce tutoriel car il s'agit d'une fonctionnalité très importante qui élève les possibilités de VBA à un niveau bien plus impressionnant.
Déclenchement à partir de l'éditeur VBA
La dernière manière de lancer une macro VBA que je vais vous présenter ici est le déclenchement à partir de l'éditeur VBA (le VBE).
Il vous suffit placer votre curseur dans le code de la macro que vous voulez lancer et soit utiliser la touche F5
de votre clavier, soit cliquer sur le triangle vert (ou flèche si vous préférez) qui se trouve dans la barre de menu (voir la capture d'écran).
Cette manière de faire est destinée aux développeurs plutôt qu'aux utilisateurs. L'avantage principal est le gain de temps car vous pouvez rester dans le même fenêtre (l'éditeur de VBA) pendant les tests etc.
Conclusion du Chapitre 3
Avec les informations de ce chapitre du "Cours VBA: Droit au but" vous connaissez maintenant les bases de fonctionnement de VBA qui vous permettront de vous lancer enfin dans de développement de vos propres scripts VBA.
Donc pour résumer…
- pour développer, stocker et distribuer vos macros VBA, utilisez le fichier Excel .XLSM
- vous et les utilisateurs de vos macros devez autoriser leur exécution. Cela se fait dans le “Centre de gestion de la confidentialité” et je vous conseille d’utiliser l’option Désactiver toutes les macros avec notification qui est un bon compromis entre la sécurité et la facilité d’utilisation
- placez votre code VBA dans un des “Microsoft Excel Objects” pour gérer les Événements et dans les Modules pour le code principal. Si vous utilisez les Formulaires VBA, chaque formulaire va contenir son propre code VBA.
- principales “unités” de code VBA sont une Procédure et une Fonction. La différence principale est que la Fonction, contrairement à une Procédure, renvoie une certaine valeur en tant que son résultat une fois l’exécution terminée. La Procédure exécute une suite de tâches et des calculs à l’aide de, entre autres, Fonctions et aussi d’autres Procédures. Votre code VBA sera, dans la plupart de cas, une combinaison des Procédures et des Fonctions…
- il existe plusieurs manières de “lancer” une macro VBA dans Excel: vous pouvez ouvrir la liste des macros disponibles et en exécuter une, vous pouvez créer un bouton qui lancera une macro une fois que l’on a cliqué dessus, vous pouvez créer des Macros qui s’exécutent automatiquement lors d’un événement ou pour finir, lancer le code VBA à partir de l’éditeur VBE (triangle vert).
Vous voilà parés pour le développement en VBA. Le chapitre suivant vous familiarisera avec votre outil de travail:
l'éditeur VBA connu sous le nom de VBE
3. Concepts de base en VBA
25 commentaires sur “Cours VBA: 3. Concepts de base de VBA”
Bonjour!
à quand la suite? 🙂
Merci
Bonjour Naf,
pour le moment, je suis malheureusement très (trop?) occupé. Pourtant, ce n'est pas l'envie de continuer qui manque 😉
Normalement, je devrais pouvoir ajouter 1 ou 2 chapitres suivants d'ici la fin de l'année…
Cordialement, Martin
PS: n'hésitez pas à vous inscrire pour être avertie par email de la sortie de nouveaux chapitres (il y a un formulaire à la fin de la table de matières pour cela)
Bjr cher maître… Cours très très compréhensible. Félicitation pour ton expertise. Mais quelles sont les conditions à remplir pour avoir la suite.
Bonjour Médard,
Merci pour votre retour.
La seule condition est, malheureusement, le temps pour que je puisse écrire la suite.
J'ai été un peu trop optimiste dans l'estimation du temps libre dont je disposerais.
Mais le chapitre 4 est presque fini donc c'est pour bientôt !
Cordialement, Martin
Très intéressant, et enfin un cours pratique et détaillé.
Merci Maxime!
J'essaie d'accélérer la publication des chapitres suivants…
Cordialement, Martin
Oh noooooooooooon !
Ca s'arrête net, comme ça, alors que ça commençait juste à me titiller 🙂
Vivement la suite, courage !
Bonjour Coco,
merci pour ce retour!
La suite est prévue et j'aimerai pouvoir avancer plus vite. Le problème est que je fais Excel-Malin.com dans mon temps libre et pour le moment, je n'en ai pas beaucoup.
Mais de manière générale, les réactions sont très positives donc cela m'encourage à continuer…
Donc je fais au plus vite!
Surtout que, vu le monde qui s’inscrit pour être averti de la parution de la suite, de nombreuses personnes semblent profiter du confinement pour commencer à apprendre le VBA.
Cordialement, Martin
je suis debutant en vba et j ai parfaitement compris ce cous jusqua present merci infeniment
Merci pour ton retour Hassan!
Je vais essayer de vite avancer avec les chapitres suivants.
Cordialement, Martin
excusez moi je voudrais contunuier se cours profitant de se momont de confinnement comment je poursuivre le reste du cours merciz
Re-bonjour,
je suis seulement en train d'écrire les chapitres suivants…
Je fais au plus vite…
Cordialement, Martin
Intéressant, en attendant la suite qui ne va pas tarder j'espère. Car là je suis resté sur ma faim.
Bonjour Saïd, je fais au plus vite 😉
Merci infiniment pour ces explication très explicite et je vous remercie pour vos précieux efforts.
dans l'attend des chapitre suivante agréez moi mes profond et sincère respect.
je sens que je vais adorer coder grâce à vous
Super! Bienvenu dans le club! 🙂
Merci infiniment pour toutes ces explications. Juste ce qu'il me fallait.
Merci beaucoup pour ce cours très instructif
j’ai trouvé très intéressant, et enfin un cours pratique et détaillé.Vivement la suite j'ai hate
Super intéressant !!! Dommage que la suite ne soit pas encore terminée…
J'ai découvert la programmation et j'ai hate de faire plus !
Merci beaucoup !
Wow! Super bien expliqué et facile avec les exemples (toutefois j'aimerai un complément d'explication sur la Fonction Administrateur. Suis-je correct en pensant que mon nom n'étant pas Dupont ou Duval, c'est que la Fonction vérifie par elle-même qui est Adm. de mon ordi. et retourne FAUX). J'ai 80 ans et + et j'adore continuer à remplir mon cerveau. À bientôt pour la suite, Bonne continuité.
Merci beaucoup pour cet article très didactique. J'attends la suite du cours avec impatience !
Lors de l'exécution de Sub TesterNombres() Message suivant dans Msgbox:
Erreur de compilation:
Nom ambigu détecté:PlusGrandNombre
Bonjour TOLITTE,
vous avez probablement le code de la fonction
PlusGrandNombre
deux fois dans votre projet VBA.Vous ne pouvez pas avoir plusieurs fois la même fonction dans votre code. Ni des fonctions différentes portant le même nom.
Bien à vous, Martin