Mon souci porte sur l’utilisation des ordres SELECT et ACTIVATE et surtout de leur temps de traitement. Je vais vous décrire mon souci avec 4 exemples.
Je dispose d’un fichier Fic_A avec 2 feuilles FA1 et FA2 et d’un fichier Fic_B avec 1 feuilles FB1. Mes 2 fichiers existent et sont ouverts. Pour des raisons de comparaisons des différentes méthodes, je me contenterai de faire des copies ligne par ligne.
Test 1 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la même feuille du même fichier.
Test 2 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la feuille FA2 du même fichier. Utilisation de SELECT.
Test 3 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la feuille FB1 du fichier Fic_B. Utilisation de SELECT et ACTIVATE.
Test 4 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la feuille FB1 du fichier Fic_B. Utilisation de SELECT, ACTIVATE et ScreenUpdating=False.
Et voici les résultats des temps de traitement sur un Asus ZenBook avec i7 :
Ce qui est acceptable lorsque l’on travaille sur un même fichier (tests 1 et 2) ne l’est plus lorsque l’on travaille sur 2 fichiers différents (temps de traitement multiplié par 4) test 3 et même si j’utilise la fonction ScreenUpdating=False test 4 (temps de traitement multiplié par 3).
J’ai utilisé la copie dan mes exemples mais c’est valable pour toutes fonctions. C’est le passage d’un fichier à l’autre via ACTIVATE qui prend énormément de temps.
Comment faire pour avoir des temps de traitement qui soient moins long lorsque l’on travaille sur 2 fichiers ???
Vous trouverez ci-dessous le détail du test.
L2 = 111
Debut1 = Timer
For L1 = 1 To 100
FIN1 = Timer
L2 = 1
Debut2 = Timer
For L1 = 1 To 100
Sheets("FA1").Select
Range(Cells(L1, 1), Cells(L1, 10)).Copy
Sheets("FA2").Select
ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
L2 = L2 + 1
Next L1
FIN2 = Timer
Debut3 = Timer
For L1 = 1 To 100
Workbooks("Fic_A.xlsx").Sheets("FA1").Activate
Range(Cells(L1, 1), Cells(L1, 10)).Copy
Workbooks("Fic_B.xlsx").Sheets("FB1").Activate
ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
L2 = L2 + 1
Next L1
FIN3 = Timer
Application.Calculation = xlManual 'calcul manuel
Application.DisplayAlerts = False 'suppression de l'affichage des alertes
Application.ScreenUpdating = False 'suppression de l'affichage des écrans
On Error Resume Next 'si erreur ne pas en tenir compte et continuer à la ligne suivante
Application.ReferenceStyle = xlR1C1 'formules écrites en L1C1
__________________________________________________________________________________
Call Accel_trait
L2 = 1
Debut4 = Timer
For L1 = 1 To 100
Workbooks("Fic_A.xlsx").Sheets("FA1").Activate
Range(Cells(L1, 1), Cells(L1, 10)).Copy
Workbooks("Fic_B.xlsx").Sheets("FB1").Activate
ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
L2 = L2 + 1
Next L1
FIN4 = Timer
Call Decel_trait
Je dispose d’un fichier Fic_A avec 2 feuilles FA1 et FA2 et d’un fichier Fic_B avec 1 feuilles FB1. Mes 2 fichiers existent et sont ouverts. Pour des raisons de comparaisons des différentes méthodes, je me contenterai de faire des copies ligne par ligne.
Test 1 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la même feuille du même fichier.
Test 2 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la feuille FA2 du même fichier. Utilisation de SELECT.
Test 3 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la feuille FB1 du fichier Fic_B. Utilisation de SELECT et ACTIVATE.
Test 4 : copie de 100 lignes de la feuille FA1 du fichier Fic_A sur la feuille FB1 du fichier Fic_B. Utilisation de SELECT, ACTIVATE et ScreenUpdating=False.
Et voici les résultats des temps de traitement sur un Asus ZenBook avec i7 :
Début | Fin | Delta | n°test |
39 780,2070 | 39 782,3672 | 2,1602 | 1 |
39 782,3672 | 39 784,6641 | 2,2969 | 2 |
39 784,6641 | 39 792,6484 | 7,9844 | 3 |
39 792,7773 | 39 798,6719 | 5,8945 | 4 |
Ce qui est acceptable lorsque l’on travaille sur un même fichier (tests 1 et 2) ne l’est plus lorsque l’on travaille sur 2 fichiers différents (temps de traitement multiplié par 4) test 3 et même si j’utilise la fonction ScreenUpdating=False test 4 (temps de traitement multiplié par 3).
J’ai utilisé la copie dan mes exemples mais c’est valable pour toutes fonctions. C’est le passage d’un fichier à l’autre via ACTIVATE qui prend énormément de temps.
Comment faire pour avoir des temps de traitement qui soient moins long lorsque l’on travaille sur 2 fichiers ???
Vous trouverez ci-dessous le détail du test.
- Je désire copier des lignes (répondant à des critères bien définis) de la feuille FA1 sur la fin de la feuille FA1 du Fic_A. Pour cela inutile d’utiliser les ordres SELECT ou ACTIVATE. Tout va vite et bien.
L2 = 111
Debut1 = Timer
For L1 = 1 To 100
- Range(Cells(L1, 1), Cells(L1, 10)).Copy
- ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
- L2 = L2 + 1
FIN1 = Timer
- Je désire copier des lignes de la feuille FA1 du fichier Fic_A sur la feuille FA2 du même fichier. Pour cela, l’ordre SELECT suffit et le traitement est très rapide.
L2 = 1
Debut2 = Timer
For L1 = 1 To 100
Sheets("FA1").Select
Range(Cells(L1, 1), Cells(L1, 10)).Copy
Sheets("FA2").Select
ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
L2 = L2 + 1
Next L1
FIN2 = Timer
- Je désire copier des lignes de la feuille FA1 du fichier Fic_A sur la feuille FB1 du fichier Fic_B. Pour cela la fonction SELECT ne suffit pas, il faut utiliser la fonction ACTIVATE. C’est extrêmement lent.
Debut3 = Timer
For L1 = 1 To 100
Workbooks("Fic_A.xlsx").Sheets("FA1").Activate
Range(Cells(L1, 1), Cells(L1, 10)).Copy
Workbooks("Fic_B.xlsx").Sheets("FB1").Activate
ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
L2 = L2 + 1
Next L1
FIN3 = Timer
- Même exemple que le 3 mais avec en préalable les fonctions suivantes pour accélérer le traitement contenu dans le sous-programme Accel_trait
Application.Calculation = xlManual 'calcul manuel
Application.DisplayAlerts = False 'suppression de l'affichage des alertes
Application.ScreenUpdating = False 'suppression de l'affichage des écrans
On Error Resume Next 'si erreur ne pas en tenir compte et continuer à la ligne suivante
Application.ReferenceStyle = xlR1C1 'formules écrites en L1C1
__________________________________________________________________________________
Call Accel_trait
L2 = 1
Debut4 = Timer
For L1 = 1 To 100
Workbooks("Fic_A.xlsx").Sheets("FA1").Activate
Range(Cells(L1, 1), Cells(L1, 10)).Copy
Workbooks("Fic_B.xlsx").Sheets("FB1").Activate
ActiveSheet.Paste Range(Cells(L2, 1), Cells(L2, 10))
L2 = L2 + 1
Next L1
FIN4 = Timer
Call Decel_trait