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 de partie de macro. [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut Optimisation de partie de macro.
    Hello world !

    Je reviens vers vous après un petit silence respectable, afin de vous soumettre une question :

    J'ai actuellement un bout de code :

    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
        Dim p0 As Long
        Dim p1 As Long
        p0 = 0
        p1 = 2
            For p0 = Range("E" & Rows.Count).End(xlUp).Row To 1 Step -1
             If InStr(Cells(p0, 5).Value, "HA") = 1 Or InStr(Cells(p0, 5).Value, "B2") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X2").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BA") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BB") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BC") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
             If InStr(Cells(p0, 5).Value, "B4") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X4").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BB4") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X4").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BB3") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X4").Rows(p1)
             If InStr(Cells(p0, 5).Value, "XX") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("XY").Rows(p1)
             If InStr(Cells(p0, 5).Value, "XV") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("XK").Rows(p1)
             p1 = p1 + 1
            Next p0
    Ce dernier fait partie d'une procédure plus complète mais je ne mets que la selection qui me pose problème.

    J'ai un fichier qui varie de 5.000 à 30.000 lignes, et le petit code précédent, fait une recherche sur une partie de valeur dans la colonne E, et si la valeur est égale à HA (par exemple), copie la ligne complète dans l'onglet de destination (X2 pour cet exemple).

    J'ai deux problèmes avec ce code.

    1. Il est LONG !
    Selon mon fichier, ce petit bout de code à une durée qui varie de 2minutes à 8-10minutes, et j'ai pourtant épuré la procédure autant que possible (j'ai déjà effectué une recherche sur la marche à suivre pour accelérer une macro, et suivi les conseils trouvés)

    2. Je suis obligé de ré-organiser mes onglets de destination (avec un .sort)après l'utilisation de cette partie de macro, car des lignes vierges sont présentes un peu partout.

    J'ai effectué des recherches plus ou moins avancées sur ces deux problèmes, mais je n'ai malheureusement que trop peu de temps par jour pour trouver une solution vraiment satisfaisante pour les besoins de mon travail.

    Aussi ... Si quelqu'un avait la moindre idée d'une marche à suivre, d'une fonction, ou une boucle moins lourde ... Je serais très reconnaissant !

    PS : Je ne demande pas nécessaire une solution toute faite (quoique ça ferait un bon gain de temps!), mais des idées, des conseils, des pensées...
    Plusieurs cerveaux valent mieux qu'un

    Par avance, merci !

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Tu peux gagner un peu de temps en remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             If InStr(Cells(p0, 5).Value, "BA") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BB") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
             If InStr(Cells(p0, 5).Value, "BC") = 1 Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             If Cells(p0, 5).Value Like "B[A-C]*" Then Cells(p0, 5).EntireRow.Copy Destination:=Sheets("X3").Rows(p1)
    Pour éviter les lignes vides, il faut utiliser un pointeur pour chaque feuille :
    p1 pour X3
    p2 pour X4
    p3 pour XY
    p4 pour XK

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut
    Bonjour,

    Et merci de ta réponse !

    Malheureusement, concernant la lenteur, ça n'a pas changé (ou de façon insignifiante...). Je suis pourtant certain qu'il doit exister une solution ?

    Peut-être avec une méthode de filtres, ou éventuellement une autre fonction vba à laquelle je n'aurais pas pensé ?

    Pour le second point, là par contre c'est positif ! Merci de ton aide

    Si quelqu'un avait la moindre idée, ou des suggestions à tester, je serais heureux de m'y jeter corps et âme.

    Je me tire pas les cheveux, mais presque.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En faisant précéder ta procédure par l'instruction Application.ScreenUpdating =False cela va booster ton exécution
    Tu pourrais aussi utiliser un Select Case à la place d'un IF
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    Pour le point 1) : si tu veux vraiment gagner du temps sur ton code passe par des tableaux et limite les copies de plage. Voici un lien sur les tableaux, l'introduction est, à elle seule, très instructive: http://silkyroad.developpez.com/vba/tableaux/#LI
    De quelques minutes tu passeras à quelques secondes.

    Pour le point 2): il te faut un compteur par feuille (p1, p2, etc.) sinon nécessairement il y aura des lignes vides dans chacune d'entre elles.

    Cordialement

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut
    Pour l'astuce du screenupdating, je l'ai déjà intégrée. Ainsi que les Calculate et Compagnie, malgré ça, ça reste trop lent. Mais merci quand même

    Quand au select case, ça pourrait être intéressant !

    Ainsi que les variables tableaux.

    Voilà quelque chose d'autre qui semble tout aussi intéressant, je vais me pencher dessus

    Merci à tous pour les pistes à suivre

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

Discussions similaires

  1. abréger une parti du macro
    Par jerleswatt dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/03/2012, 20h53
  2. Optimisation temps d'exécution macro
    Par julio44 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/07/2011, 13h14
  3. [XL-2003] J'ai une partie de macro qui marche pas
    Par Alexandra 01 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/10/2010, 14h29
  4. Macro : Copier une partie de la cellule
    Par jeanjean0403 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/08/2007, 12h35
  5. {VBA Excel} Optimiser macro si possible
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/06/2007, 16h06

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