Temps de traitement ACTIVATE

RichardS

XLDnaute Junior
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 :
DébutFinDeltan°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.
Workbooks("Fic_A.xlsx").Sheets("FA1").Activate
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
Next L1
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.
Workbooks("Fic_A.xlsx").Activate
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.
L2 = 1
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
 

Modeste geedee

XLDnaute Barbatruc
Mon souci porte sur l’utilisation des ordres SELECT et ACTIVATE et surtout de leur temps de traitement.

voir l'instruction SET
Dim WS_1 as worksheet, WS_2 as worksheet, WS_3 as Worksheet
set WS_1 =Workbooks("Fic_A.xlsx").Sheets("FA1")
set WS_2 =Workbooks("Fic_B.xlsx").Sheets("FB2").

sans select ni activate il suffit ensuite de qualifier l'objet auquel s'applique l'instruction
WS_1.Range(Cells(L1, 1), Cells(L1, 10)).Copy
WS_2.Paste Range(Cells(L2, 1), Cells(L2, 10))
 

RichardS

XLDnaute Junior
Bonjour Richard,

Il va falloir relire la charte :

Parce que les membres de ce forum ne sont pas des machines... commencer une demande par un bonjour, et terminer par un merci... est un strict minimum.

Merci

David
Bonjour David,

Trop pris par mon problème, j'ai omis la plus élémentaire des politesses et je vous prie de m'en excuser.

Cordialement
RichardS
 

RichardS

XLDnaute Junior
Super cela fonctionne presque ...

1027399

erreur ci dessous
1027400


Je ne comprends d’autant moins pourquoi cela bug alors qu’avec les 2 autres instructions (rows) ci-dessous, cela fonctionne bien et même avec des temps excellents

50857,4805​
50858,1797​
0,6992​

1027401


En récapitulant, nous avons le meilleur temps cf n°test 6

Début​
Fin​
Delta​
n°test​
51933,1211​
51934,8672​
1,7461​
1​
51934,8672​
51937,6563​
2,7891​
2​
51937,6563​
51946,0313​
8,3750​
3​
51946,0469​
51951,9336​
5,8867​
4​
51951,9766​
51957,1758​
5,1992​
5​
51957,2031​
51957,8438​
0,6406​
6​

0,6406 c’est le meilleur temps mais 2 points que je ne comprends pas :
  • Pourquoi le range ne fonctionne pas ??
  • Pourquoi cela va-t-il encore plus vite que si j’écris sur la même feuille du même fichier ?
 

Discussions similaires

  • Question
Microsoft 365 Code VBA
Réponses
10
Affichages
704

Statistiques des forums

Discussions
314 653
Messages
2 111 579
Membres
111 206
dernier inscrit
Dante76