Constat :
Quoi qu'on fasse, le parcours d'une feuille de calculs ralentit les procédures
But de la méthode proposée :
Accélérer les procédures impliquant le parcours d'une plage de cellules (colonne ou ligne complètes)
La méthode :
Consiste à récupérer la plage de cellules concernée dans un tableau
1 2 3
| Dim Tablo as variant, Derlig as long
DerLig = Split(Worksheets("LaFeuille").UsedRange.Address, "$")(4)
Tablo = Worksheets("LaFeuille").range("A1:A" & DerLig).value |
Le code ci-dessus place les données de la colonne A dans un tableau à deux dimensions sous la forme Tablo(NoLig, NoCol)
Dans cet exemple ne comportant qu'une colonne, NoCol a pour seule valeur '1'.
Tablo(2, 1) fournit donc la donnée contenue dans la cellule A2.
Il est alors facile de parcourir le tableau
1 2 3
| For NoLig = 1 to Ubound(Tablo) 'ou to DerLig, cela revient au même
Msgbox Tablo(NoLig, 1) 'juste pour voir ce que ça donne
Next |
Exemple d'utilisation :
Parcours des données de la colonne A d'une feuille 1, recherche de la présence de ces données colonne A d'une feuille 2, et copy de la ligne contenant cette donnée dans une feuille 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Sub test()
Dim FL1 As Worksheet 'Feuille 1
Dim FL2 As Worksheet 'Feuille 2
Dim FL3 As Worksheet 'Feuille 2
Dim c As Range, DerLig3 As Long
Dim Tablo as Variant, Derlig as long, NoLig as Long
Application.ScreenUpdating = False
'Instanciation des feuilles de calculs concernées (pour simplifier le code à venir)
Set FL1 = Worksheets("Feuil1")
Set FL2 = Worksheets("Feuil2")
Set FL3 = Worksheets("Feuil3")
'Recherche de la dernière ligne de la plage de données feuil1
DerLig = Split(FL1.UsedRange.Address, "$")(4)
'Création du tableau
Tablo = FL1.range("A1:A" & DerLig).value
'Parcours du tableau (pris feuil1) et recherche de la donnée feuil2
With FL2.range("A1:A" & Split(FL2.UsedRange.Address, "$")(4))
For NoLig = 1 to Ubound(Tablo) 'ou bien to DerLig (revient au même)
set c = .find(Tablo(NoLig, 1))
If not c is nothing then
'la donnée a été trouvée, on la copie dans feuil3 après la dernière ligne
DerLig3 = FL3.Range("A" & Rows.Count).End(xlUp).Row
FL2.Rows(c.Row).Copy FL3.Range("A" & DerLig3 +1)
Endif
Next
End with
End sub |
Recherche sur plusieurs colonnes :
Le même principe peut être appliquée pour le parcours d'une plage de données comportant plusieurs colonnes.
Tablo = FL1.range("A1:C" & DerLig).value
Dans cet exemple,
Tablo(5, 1) contiendra la donnée située en A5
Tablo(5, 2) la donnée située en B5
Tablo(5, 3) la donnée située en C5
Il est alors facile de vérifier la correspondance des données sur n colonnes.
______________________________________________________
Une autre manière d'utiliser un tableau pour renseigner une plage de données en une seule ligne de code
1 2 3 4 5 6 7 8 9 10 11 12
| Sub Exemple()
Const pi As Double = 22 / 7
Dim Tablo As Variant, i As Byte
'création d'un tableau de la dimension voulue selon une plage quelconque
Tablo = Range("Z1:Z90").value
'Remplissage du tableau
For i = 1 To 90
Tablo(i, 1) = Cos(i * pi / 180)
Next
'Affectation du tableau à la plage désirée
Range("A1:A90") = Tablo
End Sub |
Partager