Une macro plus rapide ?
L’article
précédent a décidément stimulé les lecteurs de ce blog !
Daniel Colardelle a dit : « Il
serait intéressant de connaître le temps d'exécution pour ajouter une colonne
de cellules séquentielles permettant de retrouver l'ordre initial, de trier, de
supprimer les lignes et enfin de retrier pour retrouver l'ordre initial afin de
mieux comparer. »
Claude Duigou a dit : « D. Colardelle a tout à fait raison :
pour que la mesure de performance soit valable, il faut que les données
retrouvent leur ordre initial. Dans certaines applications, ceci peut être
impératif. »
Pierre Dumas a dit : « Je
plussoie aux deux commentaires précédents. Ceci étant, 39 secondes pour
l'exécution de cette macro, cela me semble bien trop long. J'ai
donc fait le test sur mon ordinateur portable, qui n'est pas un foudre de
guerre (Celeron à 1,8GHz). Les tests montrent un temps d'environ 4 secondes. Par la
méthode de trier auparavant, c'est un peu plus rapide : 2 à 3 secondes. Mais
c'est toujours bon à prendre et l'astuce est à conserver. »
Que
puis-je en dire ? Contrairement à Pierre Dumas, j’observe un écart énorme
entre le temps pris par la macro quand je trie avant et après la destruction
des mauvaises lignes, et celui pris sans ces deux tris. Pour vérifier cela et
répondre aussi aux deux premiers "commentateurs", j’ai donc modifié
mon modèle précédent, en ajoutant une cellule nommée Tri dans
laquelle je saisis « Oui » si je fais les tris avant et après le
traitement, et « Non » autrement. Je compte bien entendu le temps
pris par ces deux tris quand je les effectue. La seule chose dont je ne compte
pas le temps, au début de la macro, est la récupération des trois colonnes de
départ depuis l’onglet « Base ».
Mon
expérience est que le temps moyen de la macro, quand je ne fais pas les tris,
est de l’ordre de 24 minutes 25 secondes, les résultats sur 5 essais variant
entre 24:18 et 24:34. Quand j’effectue les deux tris, il est en moyenne de 1
seconde, tris compris. Autrement dit, je vais 1.470 fois plus vite quand j’effectue
les tris ! Je suis donc très très loin du tout petit écart
observé par Pierre Dumas. Je moinssoie !
Si
vous voulez faire des tests sur votre PC, envoyez-moi un mail à thiriez@hec.fr
et je vous renverrai mon fichier Excel. Vous pourrez alors nous donner vos
conclusions en commentaire à cet article.
Voici
le code de la macro :
Sub Vitesse()
Columns("A:C") =
Sheets("Base").Columns("A:C").Value
Call Chrono
If Range("Tri") = "Oui"
Then
ActiveWorkbook.Worksheets("Test").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Test").Sort.SortFields.Add
Key:=Range("A2:A100001" _
), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:=xlSortNormal
With
ActiveWorkbook.Worksheets("Test").Sort
.SetRange
Range("A1:C100001")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
Range("A1").AutoFilter
ActiveSheet.Range("$A$1:$C$100001").AutoFilter Field:=1,
Criteria1:="Rouge"
Rows("2:100001").Delete
Shift:=xlUp
Range("A1").AutoFilter
If Range("Tri") = "Oui"
Then
ActiveWorkbook.Worksheets("Test").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Test").Sort.SortFields.Add
Key:=Range("C2:C100001" _
), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Test").Sort
.SetRange Range("A1:C100001")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End
If
Call Chrono
End
Sub
2 Commentaire(s):
Bonjour Hervé,
L'objet de mon commentaire n'était pas de contester tes mesures, mais plutôt de dire qu'il fallait les compléter afin de "dé-trier" les données. Quant aux variations des mesures, elles peuvent peut-être s'expliquer par les données du classeur.
Cordialement.
Daniel
By Unknown, sur 8:39 AM
C'est bien pour cela que je vous propose de m'envoyer un mail afin que je puisse vous envoyer mon fichier. Vous pourrez alors tester ce fichier sur votre PC et me dire combien de temps la macro vous prend avec ou sans les tris.
By Hervé Thiriez, sur 11:12 PM
Enregistrer un commentaire
<< Accueil