IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Simplification / Optimisation programme VBA [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut Simplification / Optimisation programme VBA
    Bonjour à tous,

    J’ai besoin de votre aide concernant une macro. J’ai réussi tant bien que mal à réaliser une macro qui effectue toutes les tâches que je souhaitait en parcourant divers forums et en m’aidant malheureusement trop souvent de l’enregistreur de macro.

    Néanmoins, dès que je lance ma macro sur des fichiers avec un nombre de lignes important, le temps d’exécution est trop long, étant donné que mon code est très loin d’être optimal. A titre d’exemple, mon code tourne pendant 6/7 mins sur 50 000 lignes.

    A l’aide de l’exécution pas à pas, j’ai essayé de repérer les parties de mon code qui posaient problèmes.

    Voici les principales parties que je souhaiterais optimiser :

    Je me suis basé sur l’enregistreur de macro pour réaliser cette partie qui fonctionne comme je le souhaite mais qui prend trop de temps, je ne vois comment pas trop comment l’optimiser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    'Modification ordre colonnes
        Columns("B:B").Cut
        Columns("F:F").Insert Shift:=xlToRight
     
        Columns("H:H").Cut
        Columns("F:F").Insert Shift:=xlToRight
     
        Columns("H:H").Cut
        Columns("G:G").Insert Shift:=xlToRight
     
        Columns("W:W").Cut
        Columns("U:U").Insert Shift:=xlToRight
     
        Columns("X:X").Cut
        Columns("W:W").Insert Shift:=xlToRight
     
        Columns("AA:AA").Cut
        Columns("Z:Z").Insert Shift:=xlToRight
    J’ai également des difficultés concernant la mise en page. Il me semble que l’éxécution de ces parties de mon code prend du temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    'Mise en forme
        Range("A1:AB1").Font.ColorIndex = 2
        Range("A1:AB1").Interior.ColorIndex = 11
        Range("A1:AB1").Font.Bold = True
        Range("A1:AB1").RowHeight = 45
        With Range("A1:AB1")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
         'Centrer le texte + renvoyer à la ligne
        With Range("A:AB")
            .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        With Range("A:AB")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
    Voila, j’espère que vous pourrez me permettre de modifier ces parties afin d’avoir un code plus propre et surtout plus RAPIDE !

    Je suis à votre disposition si vous avez besoin de précisions.

    Je vous remercie d’avance,

    Clément

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 153
    Par défaut
    Bonjour,

    Essaie peut être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.Screenupdating = false
    application.calculation = xlcalculationmanual
    au début du code et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    application.screenupdating = true
    application.calculation = xlcalculationautomatic
    à la fin du code,

    Poulpe

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    Bonjour,

    J'avais déja ajouté cette partie avant mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Merci quand même,

    Clément

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    L'exécution de la première partie de ton code est instantanée. Est-ce que tu n'aurais pas des shapes ou autres images qui pourraient ralentir le code ? Exécute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub test()
    'Modification ordre colonnes
        Deb = Timer
        Columns("B:B").Cut
        Columns("F:F").Insert Shift:=xlToRight
     
        Columns("H:H").Cut
        Columns("F:F").Insert Shift:=xlToRight
     
        Columns("H:H").Cut
        Columns("G:G").Insert Shift:=xlToRight
     
        Columns("W:W").Cut
        Columns("U:U").Insert Shift:=xlToRight
     
        Columns("X:X").Cut
        Columns("W:W").Insert Shift:=xlToRight
     
        Columns("AA:AA").Cut
        Columns("Z:Z").Insert Shift:=xlToRight
        MsgBox Timer - Deb
    End Sub
    et poste le temps indiqué par le MsgBox.
    La seconde partie peut être légèrement optimisée, mais ça doit être sans importance sur le temps d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Mise en forme
        With Range("A1:AB1")
            .Font.ColorIndex = 2
            .Interior.ColorIndex = 11
            .Font.Bold = True
            .RowHeight = 45
        End With
    En ce qui concerne la 3e partie, tu répètes la mise en forme de la plage A:AB; donc supprime celle qui est inutile. De plus, cette partie du code écrase la mise en forme que tu as faite précédemment. Tu peux donc le supprimer. Pour la 3e partie, mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
         'Centrer le texte + renvoyer à la ligne
        With Range("A:AB")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
    Encore une fois ça ne doit pas avoir une incidence notable sur le temps de traitement.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    Bonjour,

    Sur le fichier de départ, la modification des colonnes est instantannée mais sur le fichier déja traité la modification des colonnes prend 35 secs. Je ne comprend pas trop pourquoi ?

    J'ai modifier les parties concernant la mise en page, ce qui permet un très léger gain de temps.

    Je te remercie pour ton aide,

    Clément

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    mais sur le fichier déja traité la modification des colonnes prend 35 secs.
    C'est quoi le traitement ? Est-ce que tu peux poster le code ou mettre un classeur en PJ ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    Je viens de remarquer que j'effectuais la modification de l'ordre des colonnes après la mise en page ce qui prennait beaucoup de temps.

    En déplacant cette partie du code, le temps de traitement est passé de 65sec à moins de 20secs sur mon fichier Test de 13 000 lignes. Merci !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Aide simplification programmes VBA
    Par 010714 dans le forum Macros et VBA Excel
    Réponses: 30
    Dernier message: 18/07/2014, 18h17
  2. [XL-2007] Runtime error 1004 pour programme VBA d'optimisation
    Par Ptit_pilou dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/08/2009, 17h28
  3. Optimiser programme (D7)
    Par mario9 dans le forum Delphi
    Réponses: 2
    Dernier message: 18/08/2006, 17h36
  4. Réponses: 11
    Dernier message: 27/06/2006, 17h04
  5. Accès outlook par programmation VBA depuis access
    Par STOUPI dans le forum Access
    Réponses: 1
    Dernier message: 05/06/2006, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo