Cours VBA : utilisations des tableaux (partie 2)

Le tableau à 2 dimensions

Pour enregistrer plusieurs colonnes de données, une dimension supplémentaire est nécessaire.

En voici un exemple :

enreg 2 dim tableaux vba suite

Enregistrement des données dans un tableau à 2 dimensions :

'Déclarations
Dim tableau(10, 2) 'Tableau de 11 x 3 "cases"
Dim i As Integer

'Enregistrement des valeurs dans le tableau
For i = 0 To 10
    tableau(i, 0) = Range("A" & i + 2)
    tableau(i, 1) = Range("B" & i + 2)
    tableau(i, 2) = Range("C" & i + 2)
Next

Et quelques exemples de valeurs :

MsgBox tableau(0, 0) 'Renvoie : 11.03.2026
MsgBox tableau(0, 1) 'Renvoie : 24
MsgBox tableau(9, 2) 'Renvoie : NON
MsgBox tableau(10, 2) 'Renvoie : OUI

Le tableau dynamique

Imaginons que cette même base de données soit régulièrement mise à jour et que l'on ne puisse donc pas entrer de valeurs fixes à la déclaration ... Dans ce cas, le tableau dynamique sera bien utile.

enreg dynamique tableaux vba suite

Pour connaître le numéro de la dernière ligne de notre base de données, utilisez la formule suivante (que nous avions vu lors du précédent exercice) :

derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row

Si vous entrez une variable lors de la déclaration, Excel ne l'acceptera pas.

Déclarez un tableau dynamique (parenthèses vides), puis définissez ses dimensions avec Redim :

Dim tableau()
ReDim tableau(derniereLigne - 2, 2)

De cette manière vous enregistrerez automatiquement toutes les lignes de la base de données dans le tableau :

Sub exemple()

    'Déclarations
    Dim tableau(), derniereLigne As Integer, i As Integer
    
    'Dernière ligne de la base de données
    derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row

    'Redimensionnement
    ReDim tableau(derniereLigne - 2, 2)
    
    'Enregistrement des valeurs dans le tableau
    For i = 0 To derniereLigne - 2
        tableau(i, 0) = Range("A" & i + 2)
        tableau(i, 1) = Range("B" & i + 2)
        tableau(i, 2) = Range("C" & i + 2)
    Next

End Sub

Ubound

Dans l'exemple ci-dessus, le dernier numéro de notre tableau était égal à derniereLigne - 2 :

For i = 0 To derniereLigne - 2

Une solution pour connaître ce numéro (si cette information n'est pas déjà disponible) consiste à utiliser la fonction Ubound :

For i = 0 To UBound(tableau)

Cette fonction renvoie le plus grand numéro pour une dimension choisie (par défaut la première).

Quelques exemples pour mieux comprendre :

Sub exemple()

    Dim tableau(10, 2)
    
    MsgBox UBound(tableau) 'Renvoie : 10
    MsgBox UBound(tableau, 1) 'Renvoie : 10
    MsgBox UBound(tableau, 2) 'Renvoie : 2

End Sub

Enregistrer une plage de cellules

Il est possible d'enregistrer une plage de cellules dans un tableau sans passer par une boucle.

'Déclarations
Dim tableau(10, 2) 'Tableau de 11 x 3 "cases"
Dim i As Integer

'Enregistrement des valeurs dans le tableau
For i = 0 To 10
    tableau(i, 0) = Range("A" & i + 2)
    tableau(i, 1) = Range("B" & i + 2)
    tableau(i, 2) = Range("C" & i + 2)
Next

Le code ci-dessus peut être remplacé par :

'Déclaration
Dim tableau()

'Enregistrement des valeurs dans le tableau
tableau = Range("A2:C12")

Même si au premier abord cette seconde méthode semble séduisante, elle peut dans bien des cas vous faire perdre plus de temps que la première méthode ...

En enregistrant vos données dans le tableau de cette manière, le premier numéro n'est pas 0 mais 1, cela peut être source de confusion. De plus, si au cours du développement vous choisissez de n'enregistrer dans le tableau que les données répondant à certains critères (ou effectuer toute autre opération), vous devrez de toute façon passer par une boucle.

Array

Vous aurez peut-être parfois besoin de créer un tableau contenant une liste fixe de valeurs.

Une solution consiste à déclarer le tableau et à entrer les valeurs l'une après l'autre :

Dim tableau(5)

tableau(0) = "SI"
tableau(1) = "RECHERCHEV"
tableau(2) = "SOMME"
tableau(3) = "NB"
tableau(4) = "ESTNUM"
tableau(5) = "STXT"

Une solution bien plus pratique consiste à utiliser la fonction Array qui retourne un tableau de valeurs :

tableau = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")

Split

La fonction Split permet de diviser une chaîne de caractères en un tableau en fonction d'un délimiteur défini.

Par exemple, voici une chaîne de caractères :

chaine = "SI, RECHERCHEV, SOMME, NB, ESTNUM, STXT"

Pour convertir cette chaîne de caractères en tableau, utilisez la fonction Split et définissez le séparateur :

tableau = Split(chaine, ", ")

Le tableau renverra les valeurs suivantes :

MsgBox tableau(0) 'Renvoie : SI
MsgBox tableau(1) 'Renvoie : RECHERCHEV
MsgBox tableau(2) 'Renvoie : SOMME
MsgBox tableau(3) 'Renvoie : NB
MsgBox tableau(4) 'Renvoie : ESTNUM
MsgBox tableau(5) 'Renvoie : STXT

Les 3 tableaux suivants renvoient également les mêmes valeurs :

tableau = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
tableau = Split("SI/RECHERCHEV/SOMME/NB/ESTNUM/STXT", "/")
tableau = Split("SI RECHERCHEV SOMME NB ESTNUM STXT", " ")

Join

La fonction à l'opposé de Split est Join.

Cette fonction permet d'assembler les valeurs d'un tableau en une chaîne de caractères :

tableau = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")

MsgBox Join(tableau, " - ") 'Renvoie : SI - RECHERCHEV - SOMME - NB - ESTNUM - STXT