IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Pierre Fauconnier

Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base?

Noter ce billet
par , 17/09/2021 à 19h44 (5537 Affichages)
Salut.

Régulièrement sur le forum, on pose la question de savoir à quel indice commence un tableau VBA (array): 1 ou 0? En fait, ça dépend de plusieurs choses

Par défaut

Par défaut, un array démarre à l'indice 0 => Dim tableau(5) créera donc un tableau de 6 lignes allant de 0 à 5, et l'indice i utilisé pour pointer une des cellules du tableau devra être 0 <= i <= 5. Tableau(6) plantera donc le code avec l'erreur L"indice n'appartient pas à la sélection.


Option Base

La ligne Option Base peut modifier l'indice bas par défaut. Ainsi Option Base 1 fera commencer l'indice d'un tableau à 1 => Dim Tableau(5) créera alors un tableau de 5 lignes allant de 1 à 5 => Tableau(0) et Tableau(6) planteront le code avec l'erreur citée plus haut.

Option Base ne joue qu'au niveau du module au début duquel la ligne est présente => Option Base 1 doit donc être reprise au début de CHAQUE module dans lequel on veut l'utiliser(*).

Option Base ne peut prendre que 0 ou 1, Option Base 0 revient au même que l'absence de la ligne puisque c'est l'option par défaut.


Cas particuliers

  • Un array qui reçoit une plage de cellules tableau = range("a1:b10") commence toujours à 1, quelle que soit la ligne Option Base;
  • Un array créé avec Split commencera toujours à 0, quelle que soit la ligne Option Base: Tableau = Split("Pierre;Martine", ";") crée un tableau dont les indices vont de 0 à 1, quelle que soit la ligne Option Base;
  • Une variable valorisée avec Array est soumise à la ligne Option Base. Avec Option Base 0 ou en absence de la ligne, Tableau = array(1,2,3) crée un tableau dont les indices vont de 0 à 2. Avec Option Base 1, la même ligne crée un tableau dont les indices vont de 1 à 3;
  • Une variable valorisée avec VBA.Array sera un tableau d'indice 0, quelle que soit la ligne d'option => Tableau = VBA.Array(1,2,3) créera un tableau dont les indices iront de 0 à 2 sans tenir compte de la ligne Option Base.




Bornes personnalisées

  • On peut déroger à l'option en spécifiant les bornes:Dim Tableau(10 to 12) crée un tableau de 3 lignes dont les indices vont de 10 à 12;
  • On peut créer des tableaux avec des indices négatifs: Dim Tableau(-5 To -3) crée un tableau de 3 lignes dont les indices vont de -5 à -3;
  • On peut créer des tableaux multidimensionnels en mixant les bases: Dim Tableau(1 to 2, 0 to 2) est possible, de même que Dim Tableau(-5 To 4, 1 To 3, 0 To 5);
  • Lorsque l'on spécifie x et pas x To y, x doit toujours être >= à la base définie par Option Base;
  • Lorsque l'on spécifie x To y, y doit toujours être >= x.



LBound et UBound

LBound (Lower Bound) détermine la limite basse du tableau, et UBound (Upper Bound) détermine la limite haute. Il sera donc plus intéressant d'utiliser ces fonctions pour trouver les limites d'un tableau, notamment dans une boucle: For i = LBound(Tableau) To UBound(Tableau). Il sera aussi intéressant, sauf à laisser filer l'erreur, de tester que l'indice utilisé se trouve dans la plage des indices du tableau: If i >= LBound(Tableau) And i <= UBound(Tableau) Then.

On notera également que UBound ne donne pas nécessairement le nombre de lignes du tableau. Avec dim Tableau(5 to 10), UBound(Tableau) renverra 10 alors que le tableau contient 6 lignes. Pour compter le nombre de lignes d'un tableau, on utilisera Ubound(Tableau) - LBound(Tableau) + 1.

LBound et UBound renvoient pas défaut les limites de la première dimension du tableau. Si l'on veut connaître les limites d'une autre dimension du tableau, il faut le spécifier à la fonction, en considérant que la première dimension est la dimension 1. Le code suivant affichera la limite supérieure de la seconde dimension du tableau:
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
  Dim t(10 To 15, 1 To 25)
 
  Debug.Print UBound(t, 2)



(*) Option Base 1 limite dès lors, dans les faits, la réutilisation d'un code ne définissant que la borne supérieure (que ce soit à l'import du code dans le module ou en exportant le code dudit module, sauf à systématiser l'utilisation de LBound et UBound. Ainsi, le code suivant, créé dans un module sans Option Base va planter s'il est copié dans un module possédant Option Base 1

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Sub Test()
  Dim t(5)
 
  t(0) = 5
End Sub

Le code suivant, créé dans un module possédant la ligne Option Base 1 et remplissant la première ligne du tableau "oubliera" la première ligne s'il est copié dans un module sans Option Base

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Sub Test()
  Dim t(5)
 
  t(1) = 5
End Sub

Ce billet vous aura éclairé sur les subtilités relative à l'utilisation d'un Array en VBA.

Bon travail

Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Viadeo Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Twitter Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Google Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Facebook Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Digg Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Delicious Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog MySpace Envoyer le billet « Tableaux en VBA: LBound, UBound... Quel indice pour la première ligne de l'array? A quoi sert Option Base? » dans le blog Yahoo

Mis à jour 19/09/2021 à 10h09 par Pierre Fauconnier

Catégories
VBA , MS Office

Commentaires