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:

Staple1600

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

Bonjour


Faire ce type de changement
Code:
Sheets("le Classement").Range("E6").Sort Key1:=Range("F6"), Order1:=xlDescending, Key2:=Range("M6") _
        , order2:=xlDescending, Key3:=Range("K6"), Order3:=xlDescending, Header _
        :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
A répéter dans le reste du code.
 

Psebcool

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

Merci j'ai essayé à l'instant, mais excel m'envoi "débugage" en me surlignant en jaune toute la seconde "répétition" que j'ai faite. J'ai du mal à comprendre pour le moment.

Petite image pour illustrer:
 
Dernière édition:

Staple1600

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

Re

Essaye de créer un fichier exemple allégé (avec juste 3 feuilles et 20 lignes par feuilles) en respectant la structure de ton fichier original
(même noms d'onglets, même entêtes)
Et postes-le ici

ainsi nous aurons une base pour tester.
 

Psebcool

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

Oki,

je vais tout d'abord dans un premier temps essayer de chercher un peu plus en profondeur par moi même car ça m'a tout l'air d'être un petit détail de rien du tout, faut juste réussir à le trouver (Vu que le code du premier post fonctionne, ça me semble bizarre) ^^ Et si j'avance pas, je remontrai ce topic :)

Merci encore
 
Dernière édition:

brunosc

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

ok désoler pour le dérangement.
Je cite :
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)
Bonne soirée..
 

Staple1600

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

Re

Pourquoi prendre la mouche ?

Qui à parler de dérangement ?

Je suis aller voir la version 6 du fichier présent dans le fil que tu cites.
Et j'ai lu son code VBA.

C'est pour cela que je dis que cet utiltaire peut réduire la taille d'un fichier
mais qu'il n'est pas prévu pour optimiser un code VBA en le réécrivant.

C'était juste un constat, pas une critique.
 
Dernière édition:

brunosc

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

Re, ok ok j'ai fais une sugestion, je ne prend pas la mouche lol.
Même si c'était une critique tout est bon pour nous faire avancer.
Cordialement.
 

MJ13

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

Bonjour à tous

En voyant le code du post #1, je ne vois pas pourquoi, faire quelques select va ralentir le code. Ce serait plutôt le tri qui peut être long sur des grande plages.

Des fois le select peut être salvateur (et Adamo) :eek:.
 

Staple1600

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

Bonjour à tous

MJ13
C'est la lecture de ceci qui m'interpelle dans le post 1
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!
Mais si on voyait le code VBA dans son intégralité, on y verrait plus clair.

brunosc
me voila rassuré ;)
 

MJ13

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

Re , Bonjour JM

C'est pour cela que quand on réfléchi, ne serait-ce qu'un petit peu, on peut vite voir d'où vient le problème :).
 

Staple1600

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

Re

Ta réflexion t'a donc amené à quelle conclusion ?

J'avons réfléchi avec mes deux cerveaux, je ne vois où cela coince sans voir le vba en entier.
 

bhbh

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

Bonjour,

JM, je pense que l'erreur dans ton code provient des références à l'onglet...

@Psebcool
Exemple, à répéter pour les 60 et quelques tris (PS, n'oublie surtout pas les points (.) devant les Range, afin de faire comprendre à Excel que tu fais référence à l'onglet défini par l'instruction "With ...."

Code:
With Sheets("les Buts")
    .Range("D890").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").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").Sort Key1:=.Range("N890"), Order1:=xlDescending, Key2:=.Range( _
        "P890"), order2:=xlDescending, Key3:=.Range("O890"), Order3:=xlDescending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
End With
De plus, je suppose que tu dois avoir un max de formules...

Aussi, en début de code, tu rajoutes :

Code:
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With
et en fin de code :

Code:
Application.Calculation = xlCalculationAutomatic
Bonne journée
 

Staple1600

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

Bonjour bhbh ;)

Merci pour les endives

Effectivement.

J'ai été distrait sur ce coup là (car peu motivé par l'absence de pj)

désolé.
 

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:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas