VBA - Collections et tableaux

Auteur: Michel Berthiaume
Reproduction interdite sans autorisation

Sur cette page

Collections

Tableaux

Plage ou tableau?

Copier des données entre Excel et VBA

Exemples

Dialogues et formulaires

Objets et événements Excel

Conseils de programmation

Liste d'instructions

Collections

Une collection est un groupe d'instances d'une même classe (Wikipedia).

Exemples:

La propriété Count contient le nombre d'objets de la collection.

On peut manipuler les objets d'une collection de diverses façons:

Tableaux

On peut concevoir un tableau VBA comme une collection de variables VBA, mais comme les tableaux existaient en Basic
bien avant l'introduction de la programmation objet, le traitement des tableaux diffère du traitement des collections.

Un tableau VBA doit être déclaré.

Le nombre d'éléments d'un tableau peut être fixé lors de la déclaration (nombre fixe d'éléments) ou lors de l'exécution (tableau dynamique).

Exemples:

La seule façon d'utiliser un élément d'un tableau est d'utiliser son adresse:

Lorsqu'un tableau a une dimension, comme tTableau(1 to 15),  c'est un vecteur, et on le représente comme une liste.

Lorsqu'un tableau a deux dimensions, comme tTableau(1 to 5, 1 To 5),  c'est une matrice, et on le représente comme un tableau,
le premier indice étant le numéro de ligne, le second le numéro de colonne.

Lorsqu'un tableau a trois dimensions, comme tTableau(1 to 5, 1 To 5, 1 To 5),  c'est un cube, et on ne le représente pas.
Le premier indice est le numéro de ligne, le second le numéro de colonne et le troisième le numéro de rangée (profondeur).

Un tableau peut avoir plus de 3 dimensions, mais les applications sont rares.

Instructions de tableaux

Certaines instructions VBA sont spécifiques aux tableaux:

ReDim [Preserve] nom(indices) [As type] [, nom(indices) [As type]] . . .

Où:

  • Preserve Indique que les données existante avant de redimensionnement doivent être conservées. Rarement utilisé.

  • nom Nom de la variable.

  • indices Dimensions du tableau Utilisez la forme:
    [Min To] max[,[min To] max] ...
    min est la valeur plancher de l'indice et max la valeur plafond
    Valeur par défaut de min: 0 et de max: 10

  • type Type de données de la variable.

Utilisez ReDim pour les tableaux dont les dimensions ne sont pas précisées dans l'instruction Dim.

 

LBound(NomTableau[, dimension])

  • NomTableau Est le nom d'un tableau VBA.

  • dimension Est le numéro de la dimension dont LBound retournera la valeur minimale. Défaut 1.

LBound est utilisé pour obtenir la valeur minimale de la dimension d'un tableau VBA.

 

UBound(NomTableau[, dimension])

  • NomTableau Est le nom d'un tableau VBA.

  • dimension Est le numéro de la dimension dont UBound retournera la valeur maximale. Défaut 1.

UBound est utilisé pour obtenir la valeur maximale de la dimension d'un tableau VBA.

 

Ces trois instructions sont utiles lorsqu'on utilise un tableau dynamique, c'est à dire dont la dimension n'est connue
qu'au moment de l'exécution (comme une liste d'étudiants ou d'items d'une facture),
par opposition à un tableau statique, dont le nombre d'éléments est connu au moment
de l'écriture du programme (une liste de noms de mois, par exemple).

Plage ou tableau?

Si on a une liste de valeurs à manipuler ou produire en VBA Excel, doit-on le faire en utilisant un plage Excel ou un tableau VBA?

Avantages de la plage Excel:

Avantages du tableau VBA:

Copier des données entre Excel et VBA

Vous pouvez copier directement une plage Excel dans un tableau VBA dynamique de type Variant,
sans même utiliser l'instruction ReDim:

Dim vTableau() As Variant
vTableau = Range("Plage")

a l'effet suivant:

Bien noter que vTableau doit être un tableau dynamique de type Variant.

Vous pouvez copier directement un tableau VBA dans une plage Excel:

Range(Cells(1, 1), Cells(UBound(vTableau, 1), UBound(vTableau, 2))) = vTableau

copie tout le tableau vTableau dans la plage de même dimension commençant en A1 de la feuille active.
vTableau peut être de n'importe quel type.

Exemples

Sub ExemplesTableaux()
'Auteur: Michel Berthiaume
'Exemples de manipulation de collection et de tableau
Dim cNombres() As Currency
Dim vTableau() As Variant
Dim lLigne As Long, lColonne As Long
Dim tDépart As Date

With Worksheets("Tableaux")

    Cells.Clear

    'Créer une matrice 10000x100 de nombres dans Excel
    tDépart = Now 'Date et heure du départ
    For lLigne = 1 To 10000
        For lColonne = 1 To 100
            .Cells(lLigne, lColonne) = lLigne + lColonne
        Next
    Next
    MsgBox "Création de matrice Excel en " & Round((Now - tDépart) * 24 * 60 * 60, 2) & " secondes"

    'Créer une matrice 10000x100 de nombres dans VBA
    ReDim cNombres(1 To 10000, 1 To 100)
    tDépart = Now 'Date et heure du départ
    For lLigne = 1 To 10000
        For lColonne = 1 To 100
            cNombres(lLigne, lColonne) = lLigne + lColonne
        Next
    Next
    MsgBox "Création de matrice VBA en " & Round((Now - tDépart) * 24 * 60 * 60, 10) & " secondes"

    'Copie d'une matrice Excel dans un tableau VBA
    'ATTENTION: le tableau DOIT ÊTRE DE TYPE Variant
    'Le tableau est automatiquement redimensionné aux dimensions de la plage
    vTableau = Range(.Cells(1, 1), .Cells(1000, 100))

    'Copie d'une matrice VBA dans un tableau Excel
    .Cells.Clear
    .Range(.Cells(1, 1), .Cells(UBound(vTableau, 1), UBound(vTableau, 2))) = vTableau

End With

End Sub

 

Suite: Dialogues et formulaires