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 :

Améliorer la vitesse de Find? [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut Améliorer la vitesse de Find?
    Bonjour le forum,

    J'ai un onglet de plusieurs dizaines de milliers de lignes (nommé WsBase dans le code ci-dessous). Quotidiennement, je dois y rapporter des infos que je trouve dans l'onglet WsListeArt, colonnes 2 et 3. Pour effectuer la recherche, j'utilise ce 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
    17
     
    Application.ScreenUpdating=False 
     
    ...
     
    DerLigBase = WsBase.[A65536].End(xlUp).Row
    For i = 2 To DerLigBase
        With WsListeArt.Range("A2:A" & WsListeArt.[A65536].End(xlUp).Row)
            Set C = .Find(WsBase.Cells(i, 26))
                WsBase.Cells(i, 31) = WsListeArt.Cells(C.Row, 2)
                WsBase.Cells(i, 32) = WsListeArt.Cells(C.Row, 3)
        End With
    Next i
     
    ...
     
    Application.ScreenUpdating= True
    mais j'aurais aimé savoir si on pouvait améliorer ce code afin d'améliorer la vitesse de recherche?

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut Optimisation du Find
    Je n'ai pas fais de test pour avoir une idée du gain ( si il y en a )

    il y a une première simplification en n'effectuant qu'une seule fois le with , si on le met avant la boucle for .
    Ensuite je suis etonné de la syntaxe du range ( valeur string )

    Essayes le code suivant .

    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
     
    DerLigBase = WsBase.[A65536].End(xlUp).Row
    DerListeArt =  WsListeArt.[A65536].End(xlUp).Row
     
    With WsListeArt.Range("A2:A" & cstr (DerListeArt))
     
     
    For i = 2 To DerLigBase
     
    nom_occurence =  WsBase.Cells(i, 26).value
                  Set C = .Find(What:=nom_occurence, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
              If Not C Is Nothing Then
     
               WsBase.Cells(i, 31) = WsListeArt.Cells(C.Row, 2)
                WsBase.Cells(i, 32) = WsListeArt.Cells(C.Row, 3)
        End if
    Next i
     
    end with
    Ca m'interesserais de connaitre le % de gain en rapidité.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut à tous
    Find est la méthode la plus rapide que je connaisse
    Mais je ferais l'inverse :
    - je copierais les 2 cellules (AD et AE) d'un article
    - je rechercherais toutes les occurences de l'article dans la liste finale et à chacune je collerais les 2 cellules
    Mais je ne suis pas sûr du gain de temps

    CodeFacile, "je suis etonné de la syntaxe du range ( valeur string ) "
    Range("A" & x) indique que x doit être transformé en string, puisqu'il est concaténé. Pas la peine de le convertir
    A+

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Salut,

    J'ai testé vos deux façons de faire, et en chronomètrant avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function GetTickCount& Lib "kernel32" ()
    je ne vois pas de gain de temps. Bon, ce n'est pas très grave. C'était plus une question de curiosité. J'ai déjà gagné tellement de temps en apprenant à me servir (un peu) des variables tableaux, que ce n'est pas très embêtant.

    Merci.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/02/2010, 17h52
  2. Réponses: 53
    Dernier message: 19/03/2009, 17h19
  3. Améliorer la vitesse de chargement des images
    Par danielhagnoul dans le forum jQuery
    Réponses: 2
    Dernier message: 05/03/2009, 10h07
  4. Réponses: 6
    Dernier message: 30/06/2008, 11h14
  5. Améliorer la vitesse de parcours d'un gros recordset
    Par Vld44 dans le forum Vos contributions VB6
    Réponses: 8
    Dernier message: 28/01/2008, 02h15

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