Est-il possible de nettoyer une macro trop chargée et trop lente?

Psebcool

XLDnaute Nouveau
Salut,

J'aimerai savoir si il était possible de nettoyer une macro devenue trop conséquente et donc trés lente!

Pour le moment, il m'est impossible de refaire un build vierge de mon fichier (car il contient beaucoup données perso) mais avez vous quelques conseils pour nettoyer un bout du code ci dessous (vu que c'est un schéma de code qui se répète, j'aurais juste a continuer le code pareil en modifiant au fur et a mesure les valeurs suivantes):

Code:
Application.ScreenUpdating = False
    
    Sheets("le Classement").Select
    Range("E6").Select
    Selection.Sort Key1:=Range("F6"), Order1:=xlDescending, Key2:=Range("M6") _
        , order2:=xlDescending, Key3:=Range("K6"), Order3:=xlDescending, Header _
        :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    Range("B3:N3").Select
    Sheets("les Buts").Select
    Range("C845").Select
    Selection.Sort Key1:=Range("D845"), Order1:=xlDescending, Key2:=Range( _
        "F845"), order2:=xlDescending, Key3:=Range("E845"), Order3:=xlDescending _
        , Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
    Range("H845").Select
    Selection.Sort Key1:=Range("I845"), Order1:=xlAscending, Key2:=Range( _
        "J845"), order2:=xlAscending, Key3:=Range("K845"), Order3:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
    Range("M845").Select
    Selection.Sort Key1:=Range("N845"), Order1:=xlDescending, Key2:=Range( _
        "P845"), order2:=xlDescending, Key3:=Range("O845"), Order3:=xlDescending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom

Sheets("Classement1").Visible = True


    Sheets("Classement1").Select
    Range("d6").Select
    Selection.Sort Key1:=Range("E6"), Order1:=xlDescending, Key2:=Range("L6") _
        , order2:=xlDescending, Key3:=Range("J6"), Order3:=xlDescending, Header _
        :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    Range("B3:M3").Select
    Sheets("les Buts").Select
    Range("D890").Select
    Selection.Sort Key1:=Range("D890"), Order1:=xlDescending, Key2:=Range( _
        "F890"), order2:=xlDescending, Key3:=Range("E890"), Order3:=xlDescending _
        , Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
    Range("H890").Select
    Selection.Sort Key1:=Range("I890"), Order1:=xlAscending, Key2:=Range( _
        "J890"), order2:=xlAscending, Key3:=Range("K890"), Order3:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
    Range("M890").Select
    Selection.Sort Key1:=Range("N890"), Order1:=xlDescending, Key2:=Range( _
        "P890"), order2:=xlDescending, Key3:=Range("O890"), Order3:=xlDescending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
    Range("B2").Select

Sheets("Classement1").Visible = False
 
 
Application.ScreenUpdating = True

Donc comme vous le voyez, c'est un peu le "bordel"! Y'a du .select partout (on m'a dit que c'était pas top pour la vitesse d'execution) et encore il s'agit que d'un bout de code car dans mon fichier il se répète une bonne soixante de fois à la suite! :D

En gros il me faut presque 5 a 8 minutes d'attente quand je lance la macro telle que ci-dessus!

Pour expliquer la macro:

Le code represente pratiquement que des tableaux à réordonner par ligne selon les valeurs des cellules. Il y a plusieurs colonnes qui sont réordonner dans un certain ordre de priorité (Order1, Order2, etc..)

Si c'est trop compliqué, c'est pas grave j'essayerai de passer une autre fois quand mon fichier sera moins conséquent.

Merci encore ;)
 
Dernière édition:

Psebcool

XLDnaute Nouveau
Re : Est-il possible de nettoyer une macro trop chargée et trop lente?

Bonsoir tlm,

Merci a vous trois, ca marche parfaitement! En effet sans les "." (que j'avais oublié) devant les Range ca ne pouvait pas marcher. Idem pour la fonction With.

A présent c'est ultra rapide! Je passe de 7/8min chrono a +/- 50 sec!

Merci, heureusement que vous êtes là!
 
Dernière édition:

hellnar

XLDnaute Junior
Re : Est-il possible de nettoyer une macro trop chargée et trop lente?

Bonjour,

A lire le fil de discussion je suis étonné que personne ne conseille de faire un sous-programme qui permettrait d'allèger le code.
Ceci dit, la longueur du code ne me semble pas avoir de rapport avec la vitesse de la macro. Le conseil sur le blocage du recalcul est excellent.
Exemple pour regrouper le code dans un sous-programme :
With Sheets("les Buts")
letri"D890","D890","F890","E890")
letri"H890","I890",J890","K890")
etc...

End With

sub letri(plage, clé1,clé2, clét3,clé4)
.Range(plage).Sort Key1:=.Range(clé1), Order1:=xlDescending, Key2:=.Range( _
clé2), order2:=xlDescending, Key3:=.Range(clé3), Order3:=xlDescending _
, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
xlTopToBottom

end sub

Ceci n'est qu'un exemple à adapter sur place.
Pour allèger le code on peut généralement éliminer tous les arguments qui ont pour valeur False (par un copier remplacer s'il y en a beaucoup). Ici par exemple Matchecase qui est par défaut false ....

Bon dimanche
 

Staple1600

XLDnaute Barbatruc
Re : Est-il possible de nettoyer une macro trop chargée et trop lente?

Bonjour à tous

Bonne idée hellnar
Pourquoi ne pas ajouter un paramètre de plus?

Code:
Sub letri(s$, p$, c_1$, c_2$)
With Worksheets(s)
.Range(p).Sort Key1:=.Range(c_1), Order1:=xlAscending, Key2:=.Range(c_2) _
        , order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
        :=xlSortNormal
  End With
End Sub
Code:
Sub a()
Dim t, i&
t = Array("Feuil1", "Feuil2", "Feuil3")
For i = LBound(t) To UBound(t)
  letri CStr(t(i)), "A1:c9", "b2", "c2"
Next i
End Sub

Si les plages sont différentes sur chaque feuille, on mets ces plages dans un autre Array.
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
568

Statistiques des forums

Discussions
312 099
Messages
2 085 282
Membres
102 848
dernier inscrit
boum