Nous avons étudié dans le chapitre précédent ce qu'était une variable, comment la déclarer et comment l'afficher grâce à MsgBox. Enfin on a vu les différents types de variables. Vous croyez que c'est fini ? Non, non, non, il reste encore pas mal de choses à connaître sur les variables et c'est pour ça qu'il y a ce deuxième chapitre consécutif concernant les variables. A la fin de celui-ci, vous devriez connaitre le plus important sur les variables.
Les tableaux
Pour l'instant, on a déclaré que des variables individuelles, c'est-à-dire des variables une à une. Imaginez que vous ayez une liste d'invités à faire. Vous allez certainement déclarer comme ceci :
1 | Dim invite1 As String, invite2 As String, invite3 As String, invite4 As String |
Sacrée soirée si vous n'avez que 4 invités !
Ouais mais bon, créer 50 variables c'est un peu galère…
Je ne suis pas tout à fait d'accord, il suffit d'avoir les bons outils. Bon j'avoue que je ne vous ai pas aidé pour l'instant, mais on va utiliser un outil très puissant : les tableaux.
Comment déclarer un tableau ?
C'est comme pour les variables simples, on utilise Dim puis le nom de la variable et enfin le type de la variable.
1 | Dim invite(50) As String |
Voilà, nous avons créé un tableau de 51 cellules sur une colonne. Un tableau fonctionne comme une feuille Excel, la colonne A est notre tableau et chaque ligne est une entrée. On peut ainsi mettre en cellule A1 le nom du premier invité en A2, le deuxième, ainsi de suite. En VBA, on n’utilise pas A1, A2… mais invite(0), invite(1)…
Un tableau commence à 0 et non à 1, c'est une source d'erreurs pour les néophytes en VBA.
Dans l'exemple précédent, on a donc créé 51 variables invite numérotées de 0 à 50 et de type String. On peut donc maintenant attribuer un nom à chaque invité.
1 2 3 4 5 | invite(0)="Robert" invite(1)="Marcel" invite(2)="André" invite(3)="Vital" ... |
Un tableau peut prendre tous les types de variables et il est limité à 32 767 éléments. !
Nous avons vu que les tableaux commençaient à 0. On peut modifier cette base avec la fonction Option Base. Comme pour la fonction Option Explicit, il faut la placer avant tout code dans un module dans la section de déclarations comme ceci :
1 | Option Base 1 |
Les tableaux commenceront alors à 1. Cette base de 1 peut être unique à un tableau en utilisant le mot-clé To.
1 | Dim mon_tableau(1 To 15) as String |
Ce tableau comprend 15 éléments de type String.
Les tableaux multidimensionnels
Les tableaux que l'on a vus pour l'instant sont à une dimension. Pour l'image, la dimension est la colonne A de notre tableur Excel. En VBA, on peut créer des tableaux à plusieurs dimensions. Pour un tableau à deux dimensions, c'est simple, on va renseigner le nombre de colonnes puis le nombre de lignes. Le tableau ressemble alors à une feuille de calculs classique.
1 2 3 4 5 6 | ' On crée un tableau de 11 colonnes et 5 lignes Dim mon_tableau(10, 4) As String ' On peut alors attribuer des valeurs aux différents éléments du tableau mon_tableau(0, 0) = "Première cellule" mon_tableau(4, 2) = "Cellule de la 5ème colonne et 3ème ligne" |
Ce n'est pas fini. Même si ce tableau comporte alors 55 cellules, on peut le dupliquer dans une troisième dimension. Reprenons l'exemple du classeur Excel, vous avez votre feuille qui est un tableau à 2 dimensions et pouvez la dupliquer ! À chaque fois, le nombre de cellules dans le tableau augmente. Ça fonctionne toujours de la même façon :
1 | Dim super_tableau(5, 3, 6) As String |
Ce tableau comporte donc 7 feuilles de 6 colonnes et 4 lignes. Ce qui nous fait 168 cellules et éléments qui peuvent prendre une valeur.
On dit que le nombre de dimensions peut monter jusqu'à 5, mais la gestion de ces tableaux devient très difficile. De plus, plus on donne de dimensions, plus on augmente l'espace utilisé par la mémoire. De ce fait, au bout d'une certaine quantité de mémoire utilisée, le programme peut ralentir le fonctionnement de la machine. Attention donc à ne pas utiliser de l'espace inutilement.
Portée d'une variable
Si vous déclarez une variable au sein d'une procédure, seul le code au sein de cette procédure peut accéder à cette variable. La portée est locale à cette procédure. Vous aurez souvent besoin de variables qui doivent êtres utilisées par plusieurs procédures ou même par la totalité de l'application. Pour toutes ces raisons, vous pouvez déclarer une variable au niveau local, au niveau du module ou bien au niveau global.
Les variables locales
Une variable locale est utilisée dans une procédure et uniquement dans cette procédure si bien qu’une fois la procédure terminée, la variable n'est plus accessible. De ce fait, une variable appelée ma_variable peut avoir une valeur dans une première procédure et ce même nom de variable utilisé dans une autre procédure peut avoir une autre valeur. En effet, on aura créé deux variables différentes puisque dans deux procédures différentes. Par défaut, on crée des variables locales.
Les variables de niveau module
Comme son nom l'indique, la variable de niveau module permet d'y accéder partout dans un module et donc dans toutes les procédures mais pas dans le reste de l'application. Elle reste en vie durant tout le temps d'exécution de l'application et conserve leur valeur. Pour qu'elle soit utile dans tout le module, la variable doit être déclarée avant toute procédure dans les déclarations.
Les variables globales
Les variables globales sont déclarées dans la section des déclarations comme pour les variables de module. Par contre, une variable globale va être précédée de Global au lieu de Dim. Les variables globales existent et conservent leur valeur pendant toute la durée de l'exécution de l'application. Cette variable globale est déclarée au début de n'importe quel module, car celle-ci est accessible dans tous les modules.
1 | Global ma_variable_globale |
Les variables statiques
Toutes les portées de variables que l'on vient de voir ont une durée de vie définie et finissent par mourir. Les variables locales sont réinitialisées quand la procédure se termine, les variables de module et globales sont réinitialisées et donc leurs valeurs sont détruites après la fin de l'exécution de l'application. Pour pallier à la destruction des variables, on peut remplacer Dim par Static pour que les valeurs soient préservées même après la fin de l'exécution de l'application ou de la procédure.
1 | Static ma_variable_statique |
Si vous ne voulez pas mettre le mot Static devant toutes les variables d'une procédure, vous pouvez ajouter Static avant la déclaration de procédure.
1 | Static Sub procedure_variables_statiques |
Conflits de noms et préséance
Une variable ne peut changer sa portée au cours de l'exécution du code. Vous pouvez cependant avoir deux variables du même nom, mais pas de la même portée. Par exemple, vous avez une variable ma_variable de type global et une autre variable ma_variable de type local dans une procédure. Dans cette procédure, on peut donc faire référence à deux variables différentes qui portent le même nom. La variable locale aura le dessus sur la variable globale. Si on veut appeler la variable globale dans cette procédure, il faut alors changer le nom d'une des variables. Cette notion de préséance est difficile à intégrer et est une source d'erreur. Le meilleur moyen de l'éviter, c'est de donner des noms différents à toutes les variables.
Les constantes
Les constantes sont en réalité des variables qui ne sont jamais modifiées. Elles contiennent des valeurs qui sont utilisées sans arrêt dans le code et fournissent des raccourcis pour ces valeurs constantes particulières.
On ne peut évidement pas modifier une constante et pour la déclarer on n'utilise pas Dim mais Const. Les constantes sont utiles dans plusieurs contextes à vous de voir dans lesquels elles vous seront utiles.
1 | Const nom_chemin = "D:\Utilisateur\" |
Il existe des constantes prédéfinies dans le modèle d'objet d'Excel que l'on étudiera plus tard dans ce cours.
Définir son type de variable
C'est vrai on peut créer nos types de variables ?
Si je vous le dis. Je ne vais quand même pas jouer avec votre cœur ! . Grâce au mot clé Type, on peut créer son propre type de variable à partir des types déjà existant. La définition du type doit être avoir lieu dans la section des déclarations d'un module.
1 2 3 4 5 | Type joueur tribu As String vies As Byte points As Integer End Type |
Ce code crée un nouveau type appelé joueur qui contient des informations sur la tribu, le nombre de vies et le nombre de points d'un joueur. Ce type s'ajoute automatiquement à la liste déroulante comme les autres types déjà existants. On peut l'utiliser comme les autres types. Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 | ' On déclare une variable joueur Dim bat538 As joueur ' On renseigne les différents champs du type bat538.tribu = "Zér0" bat538.vies = 5 bat538.points = 0 'On affiche un à un les paramètres MsgBox bat538.tribu MsgBox bat538.vies MsgBox bat538.points |
Notez que la variable bat538 créée comporte une liste déroulante qui recense les champs du type de données quand vous saisissez le nom de la variable dans le code.
Vous pouvez aussi créer un tableau à partir du nouveau type créé.
Ouf ! Enfin ! C'est fini ! On vient de terminer une grosse partie sur les variables, mais très importante puisqu'on les utilise à tout bout de champ dans les programmes. On va maintenant voir comment fonctionnent les fonctions, modules et sous-routines. Allez, hop c'est parti, on continue ! Enfin, je vous accorde une pause pour vous ressourcer…