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 :

Performance sur suppression de ligne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1
    Par défaut Performance sur suppression de ligne
    Dans une feuille Excel contenant pas mal de formules et des conditions de validation dans de nombreuses cellules,
    le code ci-dessous (pour supprimer des lignes) fonctionne vite et bien sous Excel 97 (moins de 5s pour supprimer 300 lignes). Sous Excel 2002 (Office XP), il devient tellement lent que je suis obligé d'arrêter sont exécution (après une attente de plusieurs minutes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        nLigne=2
        While InStr(1, Cells(nLigne, 1), "Fin") <> 1
            If Cells(nLigne, 2) <> "X" Then
                Cells(nLigne, 1).Select
                Selection.EntireRow.Delete Shift:=xlUp
            Else
                nLigne = nLigne + 1
            End If
        Wend
    J'ai essayé d'ajouter les instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Application.Calculation = xlCalculationManuel
       Application.ScreenUpdating = False
    sans amélioration

    Avez-vous une idée (J'ai l'impression qu'Excel a un problème de mémoire.) ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour,

    déjà, tu pourrais ganer beaucoup de temps en supprimant les select-sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cells(nligne,1).select
    selection.....
    Else
     
    par 
    rows(nligne).delete
    Si tu as moins de 1100 "X" et qu'il ne s'agisse pas d'une sous-macro, essaies cette macro rapide:

    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
    Sub supprimer_si_X()
    dim derlig as long, lig as long
     
    Application.ScreenUpdating=False
    derlig = Columns(1).Find("fin", Range("A65536")).Row
     
    On Error Resume Next
    lig = Columns(2).Find("X", Range("B65536")).Row
    If Err.Number > 0 Or lig > derlig Then: End
    Rows(lig).Delete
     
    On Error GoTo 0
     
    supprimer_si_X
     
    End Sub
    cordialement

  3. #3
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    Salut,
    j'ai eu exactement le même problème (cf. mon sujet de discussion "Comment libérer de la mémoire ?" du 21 août à 18h16)
    En fait, mon analyse est que les insert et delete chargent l'historique des instructions Excel. Si on pouvait nettyer cet historique de temps en temps en cours de traitement, ce serait cool, mais j'ai pas trouvé d'aide sur le sujet.

    Ce qui est amusant, c'est que le pb a été trouvé aussi lors du passage sous XP : sous NT c'était long aussi, mais supportable.

    Ma solution a été de préférer "écraser" les lignes avec les nouvelles valeurs ou selon le besoin avec des chaînes de caractère nulles plutôt que de faire des delete / insert. Mais il faut dire que la macro travaillait sur la dernière ligne des données de la feuille. Avec ça, le traitement est passé de 15heures à 12mn!

    Essaye de laisser les lignes à vierge (ou mets "##DETRUIRE##" dans les cellules de la colonne 1) puis en fin de boucle, selectionne les lignes à détruire avec le filtre automatique et détruits les d'un coup. Tu auras toujours gagné sur les instructions delete et je crois bien me souvenir que ça charge moins la mémoire.

    Si tu trouves qqchose de +, je suis preneur!
    A+
    Dam2P

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je viens de trouver quelque chose dans l'aide mais j'ignore si ça réponds au pb.
    Je vous mets ça, vous testez pour moi et vous mettez vos observations
    En fait je ne vois pas sur quoi je pourrais le tester n'ayant pas encore rencontré votre problème.
    Citation Envoyé par L'aide
    PurgeChangeHistoryNow, méthode
    Voir aussi S'applique à Exemple Spécificités
    Cette méthode supprime des entrées du journal de suivi des modifications du classeur spécifié.
    A+

  5. #5
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Hello,

    je n'ai pas testé, mais est-ce que ça n'irait pas plus vite de désactiver les calculs, faire tes suppressions et réactiver les calculs ?

  6. #6
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut

    Comme jlp00 l'a dit, il a déjà testé la désactivation du calcul automatique.
    Je crois réellement à un pb lié aux delete et insert qui chargent toujours beaucoup la mémoire car j'ai déjà remarqué qu'Excel ralentit fortement quand sont taux d'occupation mémoire augmente.

    jpl00, il faudrait que tu ouvres le gestionnaire des tâches Windows pour observer le processus EXCEL, puis que tu exécutes ton code en débug, pas à pas principal, et que tu identifie si sur l'une des instruction tu vois :
    - soit le sablier s'afficher
    - soit le le taux d'occupation mémoire augmenter

    tiens nous au courant
    @+

Discussions similaires

  1. suppression de ligne blanche sur un msflexgrid[vb6]
    Par lumbroso dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 16/11/2010, 08h33
  2. Réponses: 5
    Dernier message: 16/07/2010, 12h27
  3. Suppression de ligne sur critère
    Par XaXa2010 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/03/2010, 00h16
  4. Ajout/Suppression de lignes d'une grille sur la DB
    Par Erwan62 dans le forum Ext JS / Sencha
    Réponses: 3
    Dernier message: 17/07/2009, 03h39
  5. [DATAGRIDVIEW - EVENT] Sur un bouton et suppression de ligne.
    Par GarsDuCalvados dans le forum VB.NET
    Réponses: 5
    Dernier message: 16/04/2009, 11h07

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