Les tableaux sont des structures de données très utiles en programmation. En VBA (Visual Basic for Application), ils permettent de stocker une collection de données de même type (nombre, chaîne de caractère, …) dans une seule variable. Si vous souhaitez plus d’informations sur les types de variables, j’en parle dans un article ici. Dans cet article, nous allons découvrir comment manipuler les tableaux en VBA et plus précisément comment les déclarer, les remplir et y accéder automatiquement.
Déclaration d’un tableau
La première étape pour manipuler les tableau en VBA consiste à déclarer votre tableau. Lors de la déclaration vous pouvez déclarer la dimension de celui-ci et son type. Nous verrons que la dimension peut également être faite dans un second temps. Voici la syntaxe pour déclarer un tableau.
Dim nom_tableau(dimension) as type
VB« nom_tableau » est le nom de votre variable tableau que vous utiliserez tout au long de votre programme. « dimension » représente la taille de votre tableau. La dimension représente aussi le nombre d’éléments que vous pourrez mettre dans votre tableau. Et enfin, « type » est le type de variable qui sera mis dans le tableau. Par exemple, vous pourrez définir un tableau rempli d’entiers (« Integer » ou « Long ») ou de nombre réels (« Single » ou « Double »). Voici un exemple de déclaration de tableau de 10 entiers :
Dim tableau_entier(9) as Integer
Dim autre_tableau(0 to 9) as Integer
VBVoici deux manières de déclarer un tableau. La première exemple consiste à déclarer la dimension supérieure du tableau seulement. En effet, la dimension inférieure est implicite. Par défaut, elle est égale à 0. Vous pouvez la modifier avec l’option « base 0 | 1 ». En spécifiant une valeur de 1, le premier indice sera donc 1 et non pas 0. Néanmoins, comme je l’indique dans mon article sur les bonnes pratiques en VBA, je vous conseille de conserver cette valeur à 0. De cette manière, votre manière de programmer sera cohérente avec Python qui gère les indexes de la même façon.
La second exemple vous montre que vous pouvez aussi définir manuellement la dimension inférieure. Avec cette méthode, vous pouvez vous affranchir de l’option « base 0 | 1 ». Cependant, je vous déconseille fortement de gérer différemment vos tableaux dans votre programme. Il n’en sera que plus difficile à lire.
Au final, nous avons bien 10 éléments possibles dans les tableaux. Ils ont juste été déclarés de manière différentes. Nous allons voir maintenant comment les remplir.
Remplir un tableau en VBA
Une fois que les tableaux ont été déclarées, il faut maintenant les remplir avec des données. Les données doivent bien entendu être du même type que celui déclaré pour votre tableau. Dans le cas contraire, vous aurez une erreur. Pour affecter une valeur dans un tableau, il suffit d’utiliser l’index du tableau que nous souhaitons remplir. Comme nous l’avons vu précédemment, l’index comme à 0 pour le premier élément.
tableau_entier(0) = 21
VBPar contre, il n’est pas judicieux de remplir tous les éléments, un par un. Nous allons utiliser une boucle « for » pour remplir les valeurs automatiquement.
Sub exemple()
Dim tableau_entier(9) As Integer
Dim i As Integer
For i = 0 To 9
tableau_entier(i) = i ^ 2 - 1
Next
End Sub
VBPour accéder et remplir un élément d’un tableau, il faut donc utiliser le nom de la variable tableau suivant de l’index entre parenthèses. Voici le résultat en utilisant l’espion dans VBA avant que le programme ne s’arrête.
Accéder aux éléments d’un tableau en VBA
Une fois que votre tableau est rempli, vous aurez besoin d’accéder aux valeurs stockées à l’intérieur. Comme précédemment, nous utiliserons l’index de l’élément mais cette fois pour appeler la valeur. L’exemple suivant va stocker la valeur de l’élément du tableau dans la variable « nombre » puis cette variable sera affichée via la fonction « MsgBox ». Si vous souhaitez plus d’informations sur la fonction « MsgBox », je vous invite à lire l’article dédié sur le sujet.
Sub exemple()
Dim tableau_entier(9) As Integer
Dim i As Integer, nombre As Integer
For i = 0 To 9
tableau_entier(i) = i ^ 2 - 1
Next
nombre = tableau_entier(5)
MsgBox nombre
End Sub
VBTableaux à plusieurs dimensions
Un tableau à une dimension c’est bien mais un tableau à plusieurs dimensions c’est mieux ! Lors de la déclaration de votre variable tableau, vous pouvez lui donner le nombre de dimensions que vous voulez. Attention toutefois, VBA n’est pas fait pour gérer une trop grosse quantité de données. Vous serez alors limité par la mémoire et par Excel lui-même. Il faut regarder du côté de logiciel de gérant les bases de données (SQL par exemple). Le langage Python est aussi une alternative à ce problème, cela tombe bien on en parle aussi sur ce site :). Voyons maintenant un exemple de tableau à deux dimensions ainsi que son remplissage.
Sub exemple2D()
Dim tableau_entier(5, 2) As Integer
Dim i As Integer, j As Integer
For i = 0 To 5
For j = 0 To 2
tableau_entier(i, j) = i ^ 2 + j ^ 2
Next
Next
End Sub
VBRedimensionner un tableau en VBA
Il est d’usage et conseillé de déclarer en début de procédure toutes les variables utilisées. Cependant, il est fort possible que vous ne sachiez pas à l’avance la dimension de vos tableaux. Vous devrez donc déclarer vos tableaux sans préciser la dimension. Vous aurez donc juste le nom de la variable suivi de parenthèses comme sur l’exemple suivant.
Dim tableau() as Integer
VBEnsuite, une fois que votre programme aura récupéré ou calculé les dimensions nécessaires du tableau, vous devrez alors redimensionner le tableau avec l’instruction « redim ». De plus, il faut savoir qu’avec l’instruction « redim », vous ne pourrez pas changer le type de variable mais seulement la dimension du tableau.
Sub exemple_redim()
Dim tableau() As Integer
Dim i As Integer, j As Integer
i = 5
j = 2
ReDim tableau(i, j)
For i = 0 To 5
For j = 0 To 2
tableau(i, j) = i ^ 2 + j ^ 2
Next
Next
End Sub
VBL’utilisation de l’instruction « redim » a pour effet de réinitialiser le tableau. Toutes les données à l’intérieur seront donc effacées de la mémoire. Voici un exemple :
Sub exemple_redim()
Dim tableau(5,2) As Integer
Dim i As Integer, j As Integer
For i = 0 To 5
For j = 0 To 2
tableau(i, j) = i ^ 2 + j ^ 2
Next
Next
ReDim tableau(2, 2)
MsgBox tableau(1, 1) ' Renvoie la valeur 0, au lieu de 1 normalement
End Sub
VBDans le cas où vous souhaiteriez conserver les données, vous pouvez utiliser l’argument « Preserve » qui conservera les données dans le tableau. Malheureusement, cet argument comporte quelques limitations. Si vous utilisez « Preserve« , vous ne pourrez modifier que la dernière dimension du tableau.
Si vous savez à l’avance que vous aurez besoin de redimensionner en cours de route votre tableau, il faudra alors bien déterminer la manière dont vous remplirez le tableau. En effet, la dernière dimension sur laquelle vous allez réaliser votre boucle doit être celle qui sera mise à jour.
Sub exemple_redim()
Dim tableau(5,2) As Integer
Dim i As Integer, j As Integer
For i = 0 To 5
For j = 0 To 2
tableau(i, j) = i ^ 2 + j ^ 2
Next
Next
ReDim Preserve tableau(5, 3)
MsgBox tableau(1, 1) ' Renvoie la valeur 1 cette fois-ci
MsgBox tableau(5, 3) ' Renvoie 0 car c'est la valeur par défaut
End Sub
VBGlobalement, si vous pouvez connaître à l’avance les dimensions de vos tableaux sans avoir à les redimensionner, c’est idéal. Dans la mesure du possible il faut éviter l’argument « Preserve » pour ne pas trop dégrader les performances. Pour conclure, il faut absolument éviter un « ReDim Preserve » dans une boucle et dans la mesure du possible essayer d’organiser votre code pour déterminer les dimensions de vos tableaux avant leur déclaration.
Conclusion sur les tableaux en VBA
Les tableaux sont des structures de données puissantes et flexibles en VBA. Leur utilisation peut vous faciliter grandement la manipulation de grandes quantités de données. En comprenant comment déclarer, remplir et accéder aux tableaux en VBA, vous serez en mesure d’écrire des programmes efficaces et élégants. Enfin, si vous souhaitez plus de détails sur les tableaux, voici le lien vers la documentation officielle.
N’hésitez pas à partager ou laisser un commentaire, j’y répondrai avec plaisir.
A bientôt,
Benjamin