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 Occasionnel
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:

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é ;)
 

Cousinhub

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
 

Discussions similaires

Réponses
3
Affichages
547