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 :

Comment utiliser un find dans une boucle ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 142
    Par défaut Comment utiliser un find dans une boucle ?
    Bonjour,
    Pourriez-vous m'apporter votre aide. Je souhaiterais utiliser un find pour trouver une valeur dans une cellule Excel et la comparer à une autre. J'espère que je serai clair dans mon explication:
    J'ai des valeurs dans 4 tableaux dans 4 onglets différents que je souhaite comparer à des valeurs de références documentées dans un 5ème tableau présent dans un 5ème onglets .
    Je compare les valeurs de la première ligne des 4 premiers tableaux avec celles de la première ligne du tableau de référence.
    Si elles sont identiques, je compare ensuite les valeurs de la 1ère colonne. Si elles sont également identiques je copie la valeur du tableau de reference dans les autres tableaux.

    Pour le moment le code écrit teste 2 tableaux sur une même feuille avec des boucles imbriquées et cela fonctionne.
    Ce que je souhaiterais :
    Utiliser un find sur la première ligne afin de voir si on gagne du temps
    Comment faire référence aux onglets dans les boucles
    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
    Sub LaBoucle()
    Ligne1 = Range("A" & Rows.Count).End(xlUp).Row
    Colonne1 = Cells(3, Cells.Columns.Count).End(xlToLeft).Column 
    Ligne2 = Range("G" & Rows.Count).End(xlUp).Row
    Colonne2 = Cells(12, Cells.Columns.Count).End(xlToLeft).Column 
     
            For i = Ligne1 To 2 Step -1
                For j = Ligne2 To 13 Step -1
                    For k = Colonne1 To 1 Step -1
                        For l = Colonne2 To 7 Step -1
     
                        If Cells(12, l) = Cells(3, k) And Cells(i, 1) = Cells(j, 7) Then
                        Cells(i, k) = Cells(j, l)
                        End If
     
                        Next l
                    Next k
                Next j
            Next i
    End Sub
    Merci
    MichaSarah

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Une façon de lister tes feuilles pour boucler est de mettre leurs noms dans un tableau (Array)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim arrFeuilles as Variant
    arrFeuilles = Array("Feuil1", "Feuil2", "Feuil3")  'Change les noms
    For I = 0 to UBound(arrFeuilles)  'UBound est la limite maximale du tableau
       Msgbox arrFeuilles(I).Name
    Next

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    @ MichaSarah : Dans ton code, il manque les noms de feuilles (les objets Worksheet).

    Même avant de penser à boucler les quatre feuilles, il faudrait déjà dans le code différencier ce qui vient de la feuille destination de ce qui vient de la feuille de référence.

    Cela dit, je suis à peu près persuadé que ceci peut se faire sans VBA avec des RECHERCHEV() pour peu que tu passes par l'intermédiaire d'une concaténation de tes deux critères (ou avec un SOMME.SI.ENS si la valeur cherchée est numérique).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 142
    Par défaut
    Bonjour Menhir et parmi,
    Merci pour vos réponses.

    Menhir,
    En effêt il n'y a pas le nom des feuilles car avant d'utiliser la macro comme indiqué dans mon message, je testais la methode sur la même feuille

    parmi,
    J'ai essayé le code mais j'ai une erreur d'execution au niveau de la ligne du MsbBox : Erreur d'execution 424, objet requis. (J'ai essayé également en ajoutant une ligne pour declarer les feuilles)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
    Dim arrFeuilles As Variant
    'Dim Feuil1 As Worksheets, Feuil2 As Worksheets, Feuil3 As Worksheets
     
    arrFeuilles = Array("Feuil1", "Feuil2", "Feuil3")  'Change les noms
    For I = 0 To UBound(arrFeuilles)  'UBound est la limite maximale du tableau
       MsgBox arrFeuilles(I).Name
    Next
    End Sub
    J'ai réécris mon code comme suit :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub CompareTableaux()
     
    Dim LaFeuil1 As Worksheet, LaFeuil2 As Worksheet, LaFeuil3 As Worksheet, LaFeuil4 As Worksheet
     
    'Feuille de reference******
    Ligne1 = Feuil1.Range("A" & Rows.Count).End(xlUp).Row 
    Colonne1Ligne = Feuil1.Cells(1, Cells.Columns.Count).End(xlToLeft).Column 
     
    'Feuilles comparées ******
    Ligne2 = Feuil2.Range("G" & Rows.Count).End(xlUp).Row 
    Colonne2Ligne = Feuil2.Cells(12, Cells.Columns.Count).End(xlToLeft).Column 
     
    Ligne3 = Feuil3.Range("G" & Rows.Count).End(xlUp).Row 
    Colonne3Ligne = Feuil3.Cells(12, Cells.Columns.Count).End(xlToLeft).Column 
     
    Ligne4 = Feuil4.Range("G" & Rows.Count).End(xlUp).Row 
    Colonne4Ligne = Feuil4.Cells(12, Cells.Columns.Count).End(xlToLeft).Column
    '**********************
     
        For I = Ligne1 To 2 Step -1
                For j = Ligne2 To 13 Step -1
                    For k = Colonne1Ligne To 2 Step -1
                        For l = Colonne2Ligne To 8 Step -1
                            ValItem = Feuil1.Cells(1, k)
                            ValOnglet = Feuil1.Cells(2, k)
                            ValTemp = Feuil1.Cells(3, k)
     
                            If Sheets(ValOnglet).Cells(12, l) = Feuil1.Cells(1, k) And Feuil1.Cells(I, 1) = Sheets(ValOnglet).Cells(j, 7) Then
                            Feuil1.Cells(I, k) = Sheets(ValOnglet).Cells(j, l)
                            End If
                        Next l
     
                    Next k
                Next j
        Next I
     
    End Sub
    La comparaison se déroule correctement mais je n'arrive pas à trouver la synthaxe pour des tableaux avec des nombres de colonnes et lignes différentes. Enfin je souhaiterais intégrer un find pour éviter de tester toutes les cellules de la première ligne des tableaux mais aller directement à la valeur à comparer.

    Merci pour votre aide
    MichaSarah

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    pour la méthode Find c'est facile !
    Activer l'Enregistreur de macros puis opérer manuellement : une base de code est livrée sur un plateau ‼
    Ensuite nettoyer le code généré en s'inspirant de l'aide VBA interne et de son exemple …

    Sinon avec deux sous de jugeote, rien qu'en lisant l'aide … Sans compter les nombreux exemples sur ce forum !

    En cas de difficulté, poster le code entrepris en indiquant bien le problème …

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Oups...
    J'ai oublié le mot Sheets, désolé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox sheets(arrFeuilles(I)).Name

Discussions similaires

  1. Comment utiliser un paquet dans une application ?
    Par zizo89 dans le forum Langage
    Réponses: 0
    Dernier message: 21/09/2007, 23h48
  2. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 17h23
  3. Réponses: 4
    Dernier message: 16/02/2006, 17h28
  4. Réponses: 7
    Dernier message: 25/11/2005, 18h11
  5. Réponses: 6
    Dernier message: 17/06/2005, 17h51

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