N’utilisez jamais la structure GoTo (enfin si quand même !) [#19 FORMATION EXCEL VBA COMPLETE]
Dans ce nouveau chapitre de notre formation sur l’apprentissage du développement d’application Excel en VBA, je vais vous présenter une nouvelle méthode de développement, que de nombreux développeur aiment à surnommer la méthode spaghetti ; tant celle-ci peut rapidement avoir pour conséquence de rendre le code abstrait ! À utiliser avec précaution !
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !
1. Présentation
Au cours des différents chapitres précédent de la formation sur l’apprentissage du développement de VBA, nous avons découverts un certain nombre de concepts qui permettent de mettre en place, ce que nous appelons dans le jargon des développeurs une « programmation structurée », c’est-à-dire que chaque portion de code (les « procédures » ou les « fonctions ») dispose d’un point d’entrée unique, et d’un point de sortie lui aussi unique :
- Chaque portion de code est saisie dans une procédure ou une fonction, qui peut être appelée à tout moment,
- Des tests If ou même Case permettent d’orienter les décisions prises par le programme,
- Des morceaux codes peuvent être répétés à volonté grâce aux boucles (For, While, Untile, boucles récursives)
Cela permet d’avoir un code simple à lire, à comprendre, à modifier et donc à améliorer.
À présent, nous allons découvrir un nouveau concept de programmation que nous pourrons tout à fait utiliser dans nos macros VBA, et nous verrons que même si ce concept dispose de son lot de défauts, il va également vite devenir essentiel de le maîtriser dans cas bien particuliers !
2. Étiqueter son code
Poser des étiquettes (également Labels) dans le code consiste à identifier des lignes ou des portions de codes en utilisant un nom unique en tout début de ligne, suivi de deux points (« : »).
Il est ainsi possible de numéroter les lignes d’une procédure :
Sub exempleEtiquettes()
1: Dim a As Integer
2: a = 10
3: a = a + 5
4: MsgBox a
End Sub
Ou encore de donner un nom à ces lignes :
Sub exempleEtiquettes()
declarationVariables: Dim a As Integer
affectationValeur: a = 10
modificationValeur: a = a + 5
affichageValeur: MsgBox a
End Sub
Bien entendu, les accents ou espaces sont à proscrire des étiquettes sous peine de générer des erreurs d’exécutions :
Dans cet exemple, les étiquettes permettent de repérer des lignes de codes, mais elles pourraient tout aussi bien se référer à un ensemble de lignes :
Sub exempleEtiquettes()
declarationVariablesEtAffecation:
Dim a As Integer
a = 10
modificationValeurEtAffichage:
a = a + 5
MsgBox a
End Sub
Cela permet de bien séparer chaque portion de code, mais nous pourrions tout aussi bien utiliser des commentaires.
Pour le moment, nous n’avons pas encore abordé la notion de commentaires, mais sachez juste qu’il s’agit de lignes ou partie de lignes qui seront ignorées par Excel lors de l’exécution d’une macro. Les commentaires sont identifiés par la présence de l’apostrophe au début (et VBE les affiche en vert). Rendez-vous dans le prochain chapitre à sortir la semaine prochaine pour tout savoir sur les commentaires ! :
Alors dans ce cas, pourquoi utiliser des étiquettes dans le code ?
3. Suivre les étiquettes : l’instruction Goto
En plus d’identifier chaque partie de code, comme nous venons justement de le voir juste avant, l’intérêt de poser ainsi des étiquettes dans notre code est que nous allons pouvoir nous rendre directement sur une ligne identifiée par une étiquette en utilisant l’instruction Goto !
Par exemple, imaginons que nous souhaitions contrôler la valeur de a afin de modifier celle-ci jusqu’à ce que sa valeur soit au moins égale à 20 :
Sub exempleEtiquettes()
declarationVariablesEtAffecation:
Dim a As Integer
a = 10
modificationValeurEtAffichage:
a = a + 5
MsgBox a
If a < 20 Then GoTo modificationValeurEtAffichage
End Sub
Si vous avez suivi les précédents chapitres de la formation, la structure du code que nous venons de mettre en place devrait en principe vous rappeler ce que nous y avons vu !
En effet, nous venons ici d’introduire un nouveau type de boucle !
Ainsi il serait bien plus adapté d’utiliser par exemple une boucle Do While, spécialement conçue pour ce type d’opération :
Do While a < 20
a = a + 5
MsgBox a
Loop
De cette manière, n’importe qui ayant un peu de connaissance en développement pourra clairement identifier en un seul coup d’œil l’objectif de cette boucle Do While, alors qu’il serait nécessaire de remonter au niveau de l’étiquette pour en comprendre l’objectif dans l’exemple donné juste avant.
Bien sûr, ici le code est très simple, mais imaginez fonctionner de cette manière sur une procédure constituée de plusieurs centaines, ou même milliers de lignes, la compréhension en serait réduite à un véritable jeu d’enquête !
En dehors du cas que nous verrons juste après, il sera possible et vivement préférable de se passer d’utiliser l’instruction GoTo !
4. Dans quel cas utiliser Goto ?
En revanche, il existe un cas dans lequel l’instruction Goto s’avère être indispensable : il s’agit de la gestion des erreurs d’exécution !
En effet, imaginons dans notre exemple que le nombre de départ soit à renseigner par l’utilisateur (via l’affichage d’une Inputbox que nous commençons maintenant à bien connaître) :
declarationVariablesEtAffecation:
Dim a As Integer
a = InputBox("Quel est le nombre de départ ?")
Do While a < 20
a = a + 5
MsgBox a
Loop
End Sub
Tant que l’utilisateur joue le jeu et saisi un nombre, alors le programme va effectivement être fonctionnel et pouvoir suivre le fil de son déroulement.
En revanche, imaginons que celui-ci décide de saisir un mot :
Immanquablement, lorsque Excel va tenter d’affecter cette valeur à la variable a qui pour rappel est typée en tant que Integer, c’est-à-dire que celle-ci ne peut avoir pour valeur qu’un nombre entier, alors nous seront forcément confrontés à une erreur d’exécution :
Pour éviter une interruption de la macro, pour pourrions plutôt intercepter cette erreur, informer l’utilisateur de son erreur et l’inviter à saisir un nouveau nombre !
Pour cela :
- 1 : Nous insérons une nouvelle étiquette saisieValeur juste avant la saisie de la valeur par l’utilisateur,
- 2 : Nous interceptons l’erreur éventuelle avec l’instruction On Error afin de rediriger le code vers l’étiquette erreurSaisie (voir point juste en dessous). La ligne On Error Goto 0 permet d’annuler l’effet de l’interception de l’erreur pour les lignes qui suivent, les erreurs d’affectation eventuelles engendront à nouveau une erreur d’exécution,
- 3 : Nous insérons une nouvelle portion de code, identifié par l’étiquette erreurSaisie,
- 4 : Puis nous remontons le fil du code jusqu’à retourner au niveau de l’étiquette saisieValeur
De cette manière, toute saisie incorrecte aboutie sur une nouvelle demande :
Par contre, si nous saisissons un résultat correct, ce message sera encore affiché ! La raison en est simple : une fois sorti de la boucle Do While, le code continu de s’exécuter jusqu’à arriver sur la ligne contenant le MsgBox, ainsi que le GoTo !
Il est donc nécessaire de quitter la procédure juste avant en utilisant l’instruction Exit Sub :
Sub exempleEtiquettes()
declarationVariablesEtAffecation:
Dim a As Integer
saisieValeur:
On Error GoTo erreurSaisie
a = InputBox("Quel est le nombre de départ ?")
On Error GoTo 0
Do While a < 20
a = a + 5
MsgBox a
Loop
Exit Sub
erreurSaisie:
MsgBox "Veuillez saisir un nombre"
GoTo saisieValeur
End Sub