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 :

Boucle de Find [XL-2016]


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
    Août 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2019
    Messages : 6
    Par défaut Boucle de Find
    bonjour,
    C'est mon premier post sur ce forum.
    J'ai besoin de votre aide car j'ai suis bloqué avec le find.

    Je souhaiterai améliorer la rapidité d’exécution de ma macro. La structure de mon code ressemblait globalement à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for i = 0 to maxLigneCol1whs1 "parcours toute la colonne des noms dans worksheet1"
      for y = 0 to maxLigneCol1wsh2 "parcours toute la colonne des noms dans worksheet2"
        if wsh1.Range("A" & i).value = wsh2.Range("A" & y).value then
          wh1.range("B" & y).value = wsh2.range("E" & i).value "met a jour les valeurs de la wsh2 dans wsh1"
          wh1.range("D" & y).value = wsh2.range("B" & i).value
        end if
      next y
    next i
    cette structure de double boucle for imbriquées fonctionnait mais était très lente la macro 30 sec env pour s’exécuter.

    J'ai donc voulu utiliser des find pour accélérer la macro
    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
    24
    25
    26
    27
     
    Set wsh1 = Worksheets("PV-DONNEES")
        Set wsh2 = Worksheets("PV - MARCHE MONDIAL")
        nbvalpvdonnees = 2 + wsh1.Range("E1").Value
        nbvalWM = wsh2.Range("N1").Value + 1
     
        For Ligne = 2 To nbvalWM
            With ThisWorkbook.Sheets("PV-DONNEES")
            Set m = wsh1.Columns("D").Find(wsh1.Cells(Ligne, "C").Value, LookIn:=xlValues, lookat:=xlWhole)
                If Not m Is Nothing Then
                    row_temp = m.Row
                    'Marque :
                    ThisWorkbook.Sheets("PV - MARCHE MONDIAL").Range("B" & Ligne).Value = .Range("A" & row_temp).Value
                    'LOA :
                    ThisWorkbook.Sheets("PV - MARCHE MONDIAL").Range("D" & Ligne).Value = .Range("C" & row_temp).Value
                    'public price :
                    ThisWorkbook.Sheets("PV - MARCHE MONDIAL").Range("E" & Ligne).Value = .Range("E" & row_temp).Value
                    'price iso spec :
                    ThisWorkbook.Sheets("PV - MARCHE MONDIAL").Range("F" & Ligne).Value = .Range("J" & row_temp).Value
                    'Range
                    ThisWorkbook.Sheets("PV - MARCHE MONDIAL").Range("A" & Ligne).Value = RangeDeLOA(ThisWorkbook.Sheets("PV - MARCHE ONDIAL").Range("D" & Ligne).Value)
                End If
            End With
        Next Ligne
        Set wsh1 = Nothing
        Set wsh2 = Nothing
        Set m = Nothing
    sauf que la valeur de row_temp reste la même. Et donc ma feuille marche mondial ne se met pas à jour

    PS : Je viens de voir que je suis pas dans la bonne rubrique mais je sais pas déplacer mon post :/

    Merci d'avance pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut
    Bonjour,

    Je pense qu'il y a une petite coquille dans le code que tu as fait avec la méthode Find.
    Tu cherches un éléments de la wsh1... dans la wsh1. Du coup ta wsh2 ne sert plus à rien...

    La méthode Find permet en effet de gagner pas mal de temps, mais cela est possible en gardant la structure des boucle For.
    Pour cela, il faut passer par des variables tableau (à plusieurs dimensions selon le cas)
    Tu mets les données de ta première feuille dans une première variable tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau1 = Range(Feuil1.Cells(1, 1), Feuil1.Cells(MaxLigne1, 2))
    Tu fais la même chose avec ta deuxième feuille, que tu mets dans une deuxième variable tableau.
    Et ensuite tu utilises ton code, mais sur des tableaux, puis à la fin de la macro, tu remets le résultats des tableaux dans tes feuilles respectives.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For a = 1 To UBound(Tableau1)
        For b = 1 To UBound(Tableau2)
            If Tableau1(a, 1) = Tableau2(b, 1) Then
                Tableau1(a, 2) = Tableau2(b, 2)
            End If
        Next b
    Next a
    J'ai testé le code ci-dessus avec 20.000 lignes dans la feuille 1 et 1.000 lignes dans la feuille 2.
    En manipulant directement les cellules, la macro tourne en 6 mn
    En passant par les tableaux, elle tourne en 21 secondes, soit presque 17 fois plus vite.

    Donc ta macro de 30 secondes tournerait en un peu moins de 2 secondes !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2019
    Messages : 6
    Par défaut
    Merci mat955 !
    Je n'avais pas pensé que la recherche des tableaux bidimensionnelles serait plus rapide.
    Je vais faire ça du coups.

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

Discussions similaires

  1. [XL-2013] Combiner une boucle FOR + .FIND + VLOOKUP
    Par AdrienDemandeInfos dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/09/2016, 17h06
  2. [XL-2003] Faire une boucle avec .find
    Par nicroq dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/01/2016, 14h42
  3. problème de boucles et .find
    Par abouhossam dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/12/2009, 14h27
  4. Boucle sur Selection.Find.Execute
    Par Dapangma dans le forum VBA Word
    Réponses: 4
    Dernier message: 12/08/2008, 08h57
  5. Problème de boucle avec un find
    Par mick77 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 21/06/2007, 16h46

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