Tableaux
Les tableaux permettent de stocker un grand nombre de valeurs contrairement aux variables qui ne peuvent stocker qu'une seule valeur à la fois par variable.
Un tableau peut être considéré comme une variable, différente des autres, mais une variable tout de même.
Remarque : Typiquement dans l'environnement AutoCAD on va se servir d'un tableau pour tout ce qui est liste de coordonnées, par exemple : listing de coordonnées de polylignes en 2D ou en 3D.
Les tableaux peuvent avoir plusieurs dimensions, mais je ne parlerai ici que des deux premiers, une et deux dimensions, après ça devient difficile à visualiser et ce n'est encore que le début des pages VBA. (on se retrouvera sans doute dans la cinquième dimension !)
Un tableau peut se visualiser mentalement comme une feuille Excel ou un tableau quadrillé en lignes et colonnes.
Les lignes et les colonnes sont numérotées en commençant par 0 (zéro), sauf utilisation de l'instruction "OptionBase" mais j'en parlerai plus tard.
Un tableau d'une dimension est un peu comme une liste, une seule colonne de lignes
Un tableau de deux dimensions a des lignes et deux (ou plus) colonnes.
Attention : Il n'est pas possible de mélanger les types dans un tableau, on ne peut pas mettre des "String" en première colonne et des "Double" dans la deuxième, c'est une grosse limitation de l'usage des tableaux.

Option Base
Une petite interruption pour parler de Option Base qui sert à définir la limitée inférieure des indices des tableaux.
La base par défaut est 0 (zéro), ce qui signifie que la première ligne d'un tableau est 0 (zéro).
Option Base n'attend que deux valeurs 0 ou 1.
Option Base 1 signifie que la première ligne d'un tableau est 1.
L’instruction Option Base n’est pas obligatoire. Si elle est utilisée, l'instruction doit figurer dans un module avant toute procédure, dans le silence elle est considérée à 0 (zéro).
Option Base peut apparaître une fois seulement dans un module et doit précéder la déclaration des tableaux qui contiennent des dimensions. La laisser à 0 (zéro) est une bonne pratique, à mes yeux.
L’instruction Option Base concerne seulement la limite inférieure des tableaux du module ou se trouve l’instruction.
Tout ce qui est expliqué ci-après prend comme hypothèse Option Base non déclarée et donc à 0 (zéro).
La syntaxe pour définir un tableau est le nom de la variable suivi d'un ou de chiffres entre parenthèses puis du type de données qu'on va mettre dans chaque "case".
Dim Jours_Semaine (6) as String > Tableau une dimension contenant le type "String"
Dim Tableau_Coord (2,3) as Double > Tableau deux dimensions contenant le type "Double".
Cette dernière ligne de code fait un tableau de deux lignes et trois colonnes.
Pour remplir un tableau, la syntaxe de base est :
nom du tableau puis position de l'élément avec entre parenthèses en premier le numéro de ligne, une virgule, puis le numéro de colonne et enfin la valeur à insérer.
Une dimension :
Jours-Semaine (0) = "Lundi"
Jours-Semaine (1) = "Mardi"
Jours-Semaine (2) = "Mercredi"
Deux dimensions :
Tableau_Coord (0,0) = 100.00
Tableau_Coord (0,1) = 200.00
Tableau_Coord (0,2) = 300.00
Cela semble quelque peu fastidieux et je vous le concède, je ne parle là que de théorie.
Rapidement je reviendrai sur une façon beaucoup plus efficiente de remplir les tableaux au fur et à mesure de la création des pages sur les diverses instructions à votre disposition en VBA.
Pour trouver le premier indice et le dernier indice d'une dimension d'un tableau les instructions sont LBOUND et UBOUND,
Le L pour le plus petit, Lower Bound (borne basse)
Le U pour Upper Bound (borne haute)
La syntaxe est :
Lbound (NomTableau, 2) Renvoie la limite inférieure du tableau.
LBound provoque une erreur si les dimensions des tableaux n'ont pas été initialisées.
1 sera la valeur par défaut si l'argument dimension n'est pas spécifié.
Pour trouver la première dimension (ou un tableau à dimension unique) vous pouvez donc écrire :
Lbound (NomTableau)
Idem pour Ubound.
Tout ceci sera explicité et détaillé plus avant dans les futures pages ou mises à jour en fonction de l'avancement de la théorie et de l'explication d'autres instructions. Je dois parler des boucles For...
Array
La fonction Array permet de créer une liste d'éléments, séparés par des virgules.
Lorsqu'un "tableau" Array est affecté à une variable, cette variable doit obligatoirement être de type Variant.
Sub Exemple_Array()
Dim NomTableau As Variant
NomTableau = Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche")
MsgBox NomTableau(0) 'Renvoie "Lundi"
MsgBox NomTableau(2) 'Renvoie "Mercredi"
End Sub
Pour vérifier si vous avez compris, trouvez ce que renverra MsgBox NomTableau(6)
Comme pour le reste de la page ce n'est que le début, au fur et à mesure, je développerai toutes ces instructions et fonctions...
Tableaux Dynamiques
Comme je disais plus haut, c'est fastidieux de remplir un tableau et a fortiori quand on ne sait pas combien de valeurs il va falloir renseigner.
Exemple typique : le dessin d'une polyligne résultante de points sélectionnés à l'écran, en effet, pour créer une polyligne VBA a besoin d'un tableau de point dont le nombre de lignes est le nombre de sommets, mais combien de sommets aura la polyligne ?
Ça va être l'occasion d'utiliser un tableau dynamique.
Redim
Un tableau dynamique se déclare en premier comme un tableau vide, c’est-à-dire sans préciser les dimensions (lignes et colonnes), comme ceci : Dim Tabl_Int () As Integer
Le nom du tableau est suivi de parenthèses vides, mais il est nécessaire d'indiquer le type de données à mémoriser, en l'occurrence des nombres entiers (integer).
J'ai pris le soin de renseigner dans le nom du tableau ce qu'il contient, ça peut aider lors de recherches d'erreurs (voir débogage).
Ensuite on va renseigner les valeurs, soit en dur comme dans mes exemples, soit avec des boucles comme il sera expliqué plus tard.
Une fois que le tableau est fini de renseigner il faudra utiliser REDIM qui comme son nom le laisse entrevoir var redimensionner le tableau, si tle tableau est déclaré "dynamique" on lui donne des dimensions, si le tableau a déjà des dimensions il est possible d'en modifier la valeur.
Dans ce code, je déclare un tableau dynamique, je renseigne trois lignes, ensuite une MsgBox affiche la valeur de chaque contenu de ligne du tableau.

Tout se passe comme il faut, mais ce tableau n'est pas encore déclaré en dimensions.
Dans ce code je déclare un tableau dynamique, je renseigne trois lignes, puis je redimensionne par REDIM avec quatre lignes, ensuite une MsgBox affiche la valeur de chaque contenu de ligne du tableau. D'abord le code et ensuite une animation qui va mettre en évidence les erreurs.
Vous remarquerez (parce que vous avez l'oeil affuté) que j'ai déclaré les trois variables sur une seule ligne, les affectations séparées par deux points superposés sauf à la fin de la dernière.
Sub Tableau2()
Dim Tabl_Int() As Integer
ReDim Tabl_Int(2)
Tabl_Int(0) = 1000: Tabl_Int(1) = 2000: Tabl_Int(2) = 3000
ReDim Tabl_Int(4)
MsgBox Tabl_Int(0)
MsgBox Tabl_Int(1)
MsgBox Tabl_Int(2)
End Sub
Voyons ce qui en sort :

Ah ben là, c'est pas correct ! Une fois REDIM passé le tableau n'affiche que des 0 (zéro) dans les valeurs. Ça ne va pas du tout... où sont passées les valeurs 1000, 2000 et 3000...
Malheureusement elles sont PERDUES, Voyons ce qui suit pour s'en protéger.
Redim Preserve
Pour conserver les valeurs déjà existantes en redimensionnant un tableau,
c'est REDIM PRESERVE qu'il faudra utiliser.
Ça s'utilise exactement comme REDIM mais en conservant les données, ouf ! Et le tableau devient vraiment dynamique.

Tout fonctionne normalement, les trois premières valeurs sont conservées, la quatrième est à 0 (zéro) car pas renseignée précédemment et dans un tableau INTEGER les valeurs ne sont pas vides, VBA pose un 0 (zéro) a minima.
Voyons ce qui se passe avec un tableau dynamique déclaré en STRING (chaînes de caractères)
Lors de mes essais, j'ai constaté qu'il fallait redimensionner en fixe le tableau dynamique (REDIM) quand il était déclaré en STRING, je n'ai pas la preuve absolue de ce que j'écris aussi je préfère en parler avant. J'ai donc fait ainsi et je reviendrai corriger si je trouve la preuve du contraire.

Tout se passe normalement, notez la dernière chaine "vide".
J'ai pris cet exemple de tableau en STRING pour montrer que des chaînes vides se retrouvent dans les valeurs non renseignées, là où un tableau en INTEGER aurait mis des 0 (zéro).
Important : Si vous utilisez le mot clé Preserve, vous ne pouvez redimensionner que la limite supérieure du tableau, et vous ne pouvez pas du tout modifier le nombre de dimensions.
Par exemple, si votre tableau n’a qu’une seule dimension, vous pouvez la redimensionner étant donné que c’est la dernière et unique dimension.
En revanche, si votre tableau a au moins deux dimensions, vous pouvez modifier la taille de la dernière dimension uniquement, tout en conservant le contenu du tableau.
Voici un exemple dans lequel je pars d'un tableau à deux dimensions et j'ajoute une colonne.

Essayez par vous-même de modifier la première dimension du tableau, par exemple en tapant :
Redim Preserve Tableau (3,1) ce qui signifie que je demande de changer la première dimension, le résultat sera :

Il existe des solutions plus ou moins alambiquées pour contrecarrer cette impossibilité logicielle, mais je ne développe pas encore car ces pages ne sont qu'un début pour le VBA, On va apprendre à marcher avant d'apprendre à courir (vous connaissez mon antienne (hihi)).

C'est la fin pour l'instant de mes explications sur les tableaux, au fur et à mesure de la détection de problème au sujet des tableaux dans mes codes sur le site, je viendrai compléter, corriger, mettre à jour cette page.
Création le 10 mai 2021
Mise à jour le 18 mai 2021