tableau

L’utilisation des Tableaux (Array) dans VBA

09/08/2016

Dans VBA, un tableau peut être défini comme une collection de variables. Autrement dit, plutôt que de dimensionner plusieurs variables, on peut créer un tableau. Cela permet donc de gagner du temps lors de la création de la macro. Mais nous verrons que le tableau peut aussi rendre plus efficace l’exécution de la macro.

 Il existe deux types de tableaux :

Par exemple, si nous souhaitons stocker dans des variables 10 valeurs pour les utiliser plus tard dans notre macro, plutôt que de dimensionner 10 variables séparées, il nous suffira de dimensionner un seul tableau (Dim Montableau(10) As String) dans lequel on pourra rentrer nos valeurs avec les instructions suivantes :

Montableau(1) = « valeur 1 »
Montableau(2) = « valeur 2 »
…
Montableau(10) = « valeur 10 »

Il est bien sûr possible de factoriser le remplissage du tableau à l’aide d’une boucle :

Sub tableau
    Dim i as Integer
    For i = 1 To 10
        Montableau(i) = « valeur  » & i
    Next i
End Sub

Lors de la manipulation de larges plages de données, le recours au tableau peut permettre des gains de temps significatifs. Prenons un gros tableau de données contenant un onglet avec 450 000 lignes et 25 colonnes. Si l’on souhaite effectuer une opération simple sur celui-ci (disons prendre la valeur des cellules et leur ajouter 10) sans recourir au tableau, on obtient le code suivant :

Sub addition_sans_tableau()
    For Each cell In ThisWorkbook.Sheets(1).Range("A1:Z450000")
        Cell.Value = Cell.Value + 10
    Next cell
End Sub

Ce code procède à une énumération de toutes les cellules, et met de longues minutes à se terminer alors qu’il procède à une opération simple

En revanche, en ayant recours à un tableau, la même opération est complétée en quelques secondes :

Sub addition_avec_tableau()
    Dim montableau As Variant, i As Long, j As Long
    montableau = Range("A1:Z455000").Value

    For i = LBound(montableau, 1) To UBound(montableau, 1)
        For j = LBound(montableau, 2) To UBound(montableau, 2)
            montableau(i, j) = montableau(i, j) + 10
        Next j
    Next i

    Range("A1:Z455000").Value = montableau
End Sub