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 :

Optimisation d'une boucle pour l'insertion de lignes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Par défaut Optimisation d'une boucle pour l'insertion de lignes
    bonjour,

    pour gérer les redimensionnement d'un formulaire, j'ai écrit le petit bout de code ci dessous qui :
    - insère de nouvelles lignes à un endroit précis
    - copie / colle une plage de références, contenant des formules que je souhaite conserver
    - remet à zéro les valeurs et validations de la plage copiée, au cas où il y ai des cellules complétées dans la plage de référence.

    Le code ci dessous fonctionne... mais est horriblement lent (environ 25secondes sur mon pc pour 50 itérations de la boucle, lorsqu'il faut en faire 2000 je deviens fou).

    Auriez vous des idées d'améliorations qui accélérerait le temps d’exécution ?

    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
    With ThisWorkbook.Worksheets(nomOnglet)
     For i = 1 To nbLignes
           'insertion puis copie / colle de la plage de référence
            rangeInsertion = "" & indexColonneDebutFormulaire & marqueurInsertionFormulaire & ":" & indexColonneFinFormulaire & marqueurInsertionFormulaire
            .Range(rangeInsertion).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            .Range(plageFormulesReferenceFormulaire).Select
            Selection.Copy
            .Range("" & indexColonneDebutFormulaire & marqueurInsertionFormulaire).Select
           ActiveSheet.Paste
     
            'remise à zero de la ligne
            .Cells(marqueurInsertionFormulaire, 1).Value = ""
            .Cells(marqueurInsertionFormulaire, 3).Value = ""
            .Cells(marqueurInsertionFormulaire, 3).Validation.Delete
           .Cells(marqueurInsertionFormulaire, 5).Value = ""
            .Cells(marqueurInsertionFormulaire, 6).Value = ""
            .Cells(marqueurInsertionFormulaire, 8).Value = ""
            'etcetcetc
        Next i
    End with
    Mille mercis !!

  2. #2
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    Pour commencer tu peux éviter les Select
    Cette partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    .Range(rangeInsertion).Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    .Range(plageFormulesReferenceFormulaire).Select
    Selection.Copy
    .Range("" & indexColonneDebutFormulaire & marqueurInsertionFormulaire).Select
    ActiveSheet.Paste
    devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Range(rangeInsertion).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    .Range(plageFormulesReferenceFormulaire).Copy .Range(indexColonneDebutFormulaire & marqueurInsertionFormulaire)
    et en début de code, ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False

  3. #3
    Membre averti
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Par défaut
    Merci pour ces pistes.

    La suppression des select améliore un peu le temps de traitement, mais cela reste marginal (<2%). La mise à jour de l'affichage était déjà désactivée (je savais que j'avais oublié une précision dans mon message... toutes mes excuses!).

    Le problème a mon avis est de faire une copie format + formule (ave mise à jour des références relatives des formules), mais sans contenu, sur une plage et le plus rapidement possible. J'ai essayé différentes techniques :
    - tout copier puis écraser les .Value une par une : lent (a moins qu'il n'existe un .ClearXXX qui supprime la valeur mais conserve la formule ?)
    - faire un pastespecial format puis copier des .FormulaLocal de cellule a cellule en faisant un replace sur les références de ligne... : plus rapide (dans les -25%) mais assez malpropre.
    - jouer avec de l'autofill : je n'y arrive pas

    Si vous avez d'autres idées...

  4. #4
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Essaie également en mettant en début de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    et de remettre en automatique en fin de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationAutomatic
    L'autofill est une bonne idée, aide toi de l'enregistreur de macro pour trouver comment l'utiliser en VBA

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/03/2007, 09h46
  2. je sais pas utilisé une boucle pour ?
    Par napz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/10/2006, 01h09
  3. [ImageMagick] Une boucle pour ImageLine ?
    Par isa150183 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/11/2005, 18h41
  4. Réponses: 10
    Dernier message: 22/11/2004, 22h37
  5. [Debutant] Optimisation d'une boucle
    Par Javatator dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2004, 18h50

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