LeCompagnon.info en reconstruction

VBA pour Excel

VBA pour Excel

VBA pour Excel - Collections et tableaux

Sur cette page

Collections
Tableaux
Plage ou tableau?
Copier des données entre Excel et VBA
Exemples

Collections

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

Exemples:

  • un classeur Excel contient une collection de feuilles Excel
  • une feuille Excel contient une collection de plages Excel
  • une plage Excel contient une collection ... de plages Excel!

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

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

Accueil
Concepts de programmation
VBE l'éditeur VBA
Déclarations, types, références, expressions et assignations
Tests et branchements
Les boucles
Gestion d'erreur
Collections et tableaux
Dialogues et formulaires
Objets et événements Excel
Conseils de programmation
Liste d'instructions
Autres formations

Word 2003
Word 2007
Excel
Excel
PowerPoint 2003
PowerPoint 2007
Access
Access 2010
Internet
Général
Intelligence financière
Vidéos

Navigation
Précédent
Suivant
Page Principale
FAQ
Nouveautés
Plan du site
Références
Motivations
Manuels de formation
Fichiers de démonstration
Nous joindre
Par courriel

Abonnez-vous à
l'infolettre LCI
Partager


Abonnez-vous à l'infolettre LeCompagnon.info








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




 

Abonnez-vous à l'infolettre

Abonnez-vous à l'infolettre du site pour recevoir les dernières nouvelles et aussi des formations à votre courriel. Vous pouvez voir la liste des dernières infolettres ici.

Cliquez ici pour vous abonner à l'infolettre





Ce site est hébergé par 1&1.com