Tu as également beaucoup de données à parcourir ?
On va directement partir sur des procédures un peu optimisées dans ce cas, sinon ça va prendre beaucoup de temps.
As tu déjà écris des macro en VBA ? Sinon, on va commencer par créer notre macro :
1 2 3
| sub maSuperbeMacro ()
end sub |
Ce code est à placer dans un "module". Il faut ouvrir l'environnement de Développement (Alt + f11), clic droit sur l'explorateur à gauche, et insérer / module :
Tous le code que l'on va écrire ensemble va s'insérer entre ces deux lignes là. J'ai créer le module dans le classeur "TdB", c'est donc depuis ce classeur que la macro va s'éxecuter.
Pour plus de clarté, nous allons nommer nos classeurs et les feuilles. La procédure est la suivante :
1 2 3 4 5 6 7 8 9
| Dim Wbk_TdB As Workbook
Dim Wbk_SOURCE As Workbook
Dim Ws_GK1 As Worksheet
Dim Ws_Rapport1 As Worksheet
Set Wbk_TdB = ThisWorkbook
Set Wbk_SOURCE = Workbooks("SOURCE.xlsm")
Set Ws_GK1 = Wbk_TdB.Worksheets("GK1")
Set Ws_Rapport1 = Wbk_SOURCE.Worksheets("Rapport1") |
Ensuite, nous allons définir la plage à parcourir. Nous pouvons aussi parcourir directement les cellules sans définir de plage dans le code, mais c'est beaucoup plus long. Nous passerons ici par des variables "tableaux", qui vont stocker les valeurs des cellules. Parcrourir des variables tableaux est 1000 fois plus rapide que de parcourir des cellules. Sur une centaine de cellule, ça n'a pas d'importance, mais sur 30 000, ça peut avoir un impact important !
Afin de définir les plages, nous allons calculer la valeur de la dernière cellule remplie, puis nous allons leurs affecté un tableau
1 2 3 4 5 6 7 8 9
| Dim derLig_GK1 As Single
Dim derlig_Rapport1 As Single
Dim plageTdB()
Dim plageSOURCE()
derLig_GK1 = Ws_GK1.Range("D" & Rows.Count).End(xlUp).Row
derlig_Rapport1 = Ws_Rapport1.Range("B" & Rows.Count).End(xlUp).Row
plageTdB = Ws_GK1.Range("D40:B" & derLig_GK1)
plageSOURCE = Ws_Rapport1.Range("B5:B" & derlig_Rapport1) |
Maintenant que nous avons déclarer nos données, nous pouvons commencer à les parcourir ! Nous allons utiliser une boucle "For ... next". C'est à dire que nous allons effectuer une opération particulière un certain nombre de fois ! En français, ça donne "Pour chaque cellule de la colonne D, fais ..."
Ces boucles fonctionnent avec des variables d'itération. Nous allons donc utiliser "I", une variable qui va servir à parcourir nos données. Nous allons également utiliser "Lbound" et "Ubound", qui symbolise les limites inférieur et supérieur de la plage de donnée. Ainsi, I va prendre toutes les valeurs entre Lbound et Ubound.
1 2 3 4
| Dim I as single
For I = LBound(plageTdB, 1) To UBound(plageTdB, 1)
Next I |
Nous parcourerons la plage de TdB. Pour chacune des valeurs, nous voulons rechercher une correspondance dans le classeur Source ? [...]
Je posterais la suite un peu plus tard, je cherche le meilleur moyen de parvenir à ce que tu veux faire sans que ça prenne 400ans ! (30 000 lignes c'est beaucoup, pourquoi ne pas être passé par un Access ?)
Code complet :
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
| Dim Ws_Rapport1 As Worksheet
Dim plageTdB()
Dim plageSOURCE()
Dim derLig_GK1 As Single
Dim derlig_Rapport1 As Single
Dim myRow As Single
Dim I As Single
Set Wbk_TdB = ThisWorkbook
Set Wbk_SOURCE = Workbooks("SOURCE.xlsm")
Set Ws_GK1 = Wbk_TdB.Worksheets("GK1")
Set Ws_Rapport1 = Wbk_SOURCE.Worksheets("Rapport1")
derLig_GK1 = Ws_GK1.Range("D" & Rows.Count).End(xlUp).Row
derlig_Rapport1 = Ws_Rapport1.Range("B" & Rows.Count).End(xlUp).Row
plageTdB = Ws_GK1.Range("D40:D" & derLig_GK1)
plageSOURCE = Ws_Rapport1.Range("B5:B" & derlig_Rapport1)
For I = LBound(plageTdB, 1) To UBound(plageTdB, 1)
Next I
End Sub |
Partager