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 :

méthode find


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut méthode find
    Bonjour à tous,

    J'ai de nouveau un problème. Voici le code que j'ai réussi à pondre et qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Test()
     
    Workbooks.Open "C:\Documents and Settings\p049490\Desktop\01 Gamme de développement - Bielle assemblée (R).xls"
     
    For i = 157 To 5346
        For j = 12 To 100
            If ThisWorkbook.ActiveSheet.Range("D" & i).Value = Workbooks("01 Gamme de développement - Bielle assemblée (R)").ActiveSheet.Range("E" & j).Value Then
                Range("H1").Value = Hello
                'Range("H" & i).Value = Workbooks("01 Gamme de développement - Bielle assemblée (R)").ActiveSheet.Range("H" & j).Value
            End If
        Next j
    Next i
     
    End Sub
    En gros, j'ai un classeur qui est déjà ouvert et qui s'appelle Compilation GDD - Moteur. Mon but est d'ouvrir un 2ème classeur s'appelant 01 Gamme de développement - Bielle assemblée (R). Par la suite je dois comparer toutes les valeurs (du texte) des cellules de la colonne D du premier fichier (de la ligne 157 à 5346) avec celles de la colonne E du deuxième fichier (de la ligne 12 à 100). Je compare donc chaque cellule de la première colonne avec toutes celles de la deuxième avant de passer à la seconde cellule, etc. Lorsque les 2 valeurs sont égales, je dois recopier la valeur de la cellule se trouvant dans la colonne H de la même ligne (du premier WorkBook) dans la case de la colonne H de la même ligne (du deuxième WorkBook).

    J'ai un petit soucis avec le code, ça ne marche pas ! Un tuyau serait le bienvenu Merci de votre aide !

    André !

  2. #2
    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
    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
    Sub Test()
    Dim FL1 as worksheet
    Dim FL2 as worksheet
    Dim c as range
        Set FL1 = Thisworkbook.activesheet
        Workbooks.Open "C:\Documents and Settings\p049490\Desktop\01 Gamme de développement - Bielle assemblée (R).xls"
        Set FL2 = Activeworkbook.activesheet
        For each cell in  FL1.range("D157:D5346")
              With FL2.Range("E12:E100")
                   Set c = .find(cell, lookin:=xlValues, lookat:=xlwhole)
                   if not c is nothing then 'Si donnée trouvée
        'place la donnée située dans la colonne H se FL1 dans la colonne H de FL2
                        FL2.cells(c.row, 8) = cell.Offset(0, 4) 
                        Set c = NoThing
                   endif
              End with
        Next
    End Sub
    Tu peux tester pour moi ?
    A+

  3. #3
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Grillé par mon ami Ousk

    Même principe mais je propose quand même vu que j'ai opté pour faire la boucle sur la plus petite plage de cellule et le Find sur la plus grande ce qui devrait améliorer sensiblement la vitesse d'exécution

    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
    Sub Test()
    Dim Sh1 As Worksheet, Sh2 As Worksheet, i As Integer, c As Range
     
    Set Sh1 = ThisWorkbook.ActiveSheet
    Workbooks.Open Filename:="C:\Documents and Settings\p049490\Desktop\01 Gamme de développement - Bielle assemblée (R).xls"
    Set Sh2 = ActiveWorkbook.ActiveSheet
     
    For i = 12 To 100
        Set c = Sh1.Range("D157:D5346").Find(what:=Sh2.Range("E" & i))
        If Not c Is Nothing Then
            Sh2.Range("H" & i) = Sh1.Range("H" & c.Row)
        End If
    Next i
     
    End Sub
    Pas testé non plus

  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
    Zut ! Je suis obligé de reconnaître que ça c'est du réfléchi, et que donc tu as raison pour la boucle
    Par contre, si A est dans B mais que B > A t'as tout faux. Pour find, lookat:=xlwhole n'est pas de trop

    PS - Par défaut, lookat:=xlpart

  5. #5
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Par contre, si A est dans B mais que B > A t'as tout faux.
    Pas compris ?

    Pour find, lookat:=xlwhole n'est pas de trop
    PS - Par défaut, lookat:=xlpart
    Oui exact, +1 (je le sais en plus )

  6. #6
    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
    A = 125
    B = 8125
    Tu cherches A tu trouves B ! C'est tout faux ! Et pourtant A est dans B mais B > A alors xlpart, cépabon !
    Mais tu avais compris, je mets juste ça pour ceux qui ont le cervolant

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut Problème avec la méthode find !
    Hop là ! J'ai un dernier problème avec la méthode que vous m'avez proposée. Voici le code correspondant :

    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
    Sub Conduits_admission_air_BP()
     
    Dim Sh1 As Worksheet, Sh2 As Worksheet, i As Integer, c As Range, d As Range
     
    Set Sh1 = ThisWorkbook.ActiveSheet
    Workbooks.Open Filename:="I:\DIM-DCT-MCDS\66536\uet_std\7_REVS\Maquette\Gammes de développement\DCT\01 - DMAM\Circuit air et carburant moteur\Gamme de développement - Conduits admission air BP (NR).xls"
    Set Sh2 = ActiveWorkbook.ActiveSheet
     
    For i = 1 To 1000
        Set c = Sh1.Range("D157:D5346").Find(what:=Sh2.Range("E" & i), LookAt:=xlWhole)
        If Not c Is Nothing Then
            Set d = Sh1.Range("E157:E5346").Find(what:=Sh2.Range("G" & i), LookAt:=xlWhole)
            If Not d Is Nothing Then
            Sh2.Range("H" & i) = Sh1.Range("H" & c.Row)
            End If
        End If
    Next i
     
    End Sub
    Ca m'affiche une bonne grosse erreur "13" sur l'incompatibilité des types à la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = Sh1.Range("D157:D5346").Find(what:=Sh2.Range("E" & i), LookAt:=xlWhole)
    Je crois avoir compris pourquoi : en gros , dans la colonne initiale (la D) où est faite la recherche, la même valeur (du texte, ici) se retrouve 2 fois dans deux cases différentes. On trouve donc 2 valeurs dans cette colonne D correspondant à celle de la colonne E. Il faudrait donc que la méthode Find arrête de chercher dans cette colonne D une fois qu'une valeur a été trouvée. J'ai jeté un oeil dans les paramètres de Find et j'ai pas trouvé mon bonheur.

    Une petite idée pour me combler de bonheur? Merci encore !

  8. #8
    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
    J'ai fusionné les deux discussions. Quand un problème est la suite d'une même question, il est bien de poursuivre la discussion. Un clic sur résolu enlève résolu
    Si personne ne te répond, je viendrai jeter un oeil mais tout de suite, je ne peux pas.
    A+

  9. #9
    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
    J'ai jeté un oeil... Visiblement tu n'as rien compris à ce qu'on te proposait.
    Que font les deux codes proposés ?
    - Dans la boucle For each... parcours la feuille 1 ligne par ligne.
    - Dans la feuille 2 tu dois rechercher la donnée lue dans la feuille 1
    - si trouvé, copie la donnée d'une colonne de la feuille 1 dans la même colonne de la feuille2 (mon code contient une erreur d'offset, si tu l'utilises, remplace 4 par 3 dans l'offset)

    Ce que fait ton code ? Déjà il provoque une erreur de syntaxe !
    Et si tu nous disais ce que tu cherches à faire "vraiment"
    Si tu veux tester deux cellules de la ligne trouvée alors ajoute simplement un second test.
    Je reprends mon code en le corrigeant, je laisse à fring le soin de modifier le sien
    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
    Sub Test()
    Dim FL1 as worksheet
    Dim FL2 as worksheet
    Dim c as range
        Set FL1 = Thisworkbook.activesheet
        Workbooks.Open "C:\Documents and Settings\p049490\Desktop\01 Gamme de développement - Bielle assemblée (R).xls"
        Set FL2 = Activeworkbook.activesheet
        For each cell in  FL1.range("D157:D5346")
              With FL2.Range("E12:E100")
                   Set c = .find(cell, lookin:=xlValues, lookat:=xlwhole)
                   if not c is nothing then 'Si donnée trouvée
    Si tu veux ajouter un test, c'est ici
    'Teste si la colonne E de feuille 1 est = colonne G de feuille 2
                        If Cell.offset(0,1) = c.offset(0, 2) then
        'place la donnée située dans la colonne H se FL1 dans la colonne H de FL2
                              FL2.cells(c.row, 8) = cell.Offset(0, 3)
                        endif
                        Set c = NoThing
                   endif
              End with
        Next
    Bonne soirée

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Ca marche pour les 2 discussions Je ne ferai plus l'erreur à l'avenir !

    Par contre, le code que je viens de poster ne me fait absolument aucune erreur (c'est celui de fring d'ailleurs ^^). Il fonctionne normalement. Je n'ai pas vu d'erreur de syntaxe d'après mes tests. De plus, j'ai bien compris le fonctionnement de celui-ci ligne par ligne, ce qui correspond à ce que je demandais. Et d'après ce que tu viens de me dire, je ne m'étais pas planté. J'ai juste rajouté une condition (même si non optimale) sous la forme de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set d = Sh1.Range("E157:E5346").Find(what:=Sh2.Range("G" & i), LookAt:=xlWhole)
            If Not d Is Nothing Then
    Il fait exactement ce que je souhaitais mais un bug est survenu après plusieurs tests. En gros, je réexplique ce que je cherchais à faire (en faisant un bon copié-collé pour la majorité ).

    En gros, j'ai un classeur qui est déjà ouvert et qui s'appelle Compilation GDD - Moteur. Mon but est d'ouvrir un 2ème classeur s'appelant 01 Gamme de développement - Bielle assemblée (R). Par la suite je dois comparer toutes les valeurs (du texte) des cellules de la colonne D du premier fichier (de la ligne 157 à 5346) avec celles de la colonne E du deuxième fichier (de la ligne 12 à 100). Je compare donc chaque cellule de la première colonne avec toutes celles de la deuxième avant de passer à la seconde cellule, etc. Je dois aussi comparer toutes les valeurs des cellules de la colonne E du premier fichier (de la ligne 157 à 5346 aussi) avec celles de la colonne G du deuxième fichier (de la ligne 12 à 100 également). En gros c'est un double test. Lorsque les 2 valeurs sont égales pour chacun des tests (une seule valeur égale ne permet pas de passer à la suite), je dois recopier la valeur de la cellule se trouvant dans la colonne H de la même ligne (du premier WorkBook) dans la case de la colonne H de la même ligne (du deuxième WorkBook).

    Voilà l'explication complète de ce que je cherche à faire. Le code de fring fonctionnait correctement pour réaliser celà mais un petit bug est apparu comme je disais. J'ai remarqué une incompatibilité de types à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = Sh1.Range("D157:D5346").Find(what:=Sh2.Range("E" & i), LookAt:=xlWhole)
    qui pourrait peut être arriver à la suivante aussi (pas eu le cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set d = Sh1.Range("E157:E5346").Find(what:=Sh2.Range("G" & i), LookAt:=xlWhole)
    .

    J'ai vu le bug en appliquant ça à plusieurs fichiers. En gros, d'après ce que j'ai compris, et je ne pense pas me tromper, dans certains de mes fichiers, on peut retrouver 2 fois la même valeur dans la colonne scannée de la première feuille (le programme de fring essaie de trouver dans la plus grande feuille de 5000 lignes quelque chose d'égal à une cellule de la plus petite puis passe à la suivante d'après ce que je vois). D'après mes tests, j'ai identifié le problème comme celà : on trouve 2 valeurs équivalantes à celle recherchée et donc cela provoque une incompatibilité de types. Il faudrait donc arrêter la recherche que l'on effectue sur la "grande" feuille une fois la correspondance trouvée puis recommencer à zéro. En fait, je pense que c'est le seul problème. Si vous avez une idée alors

    Merci en tout cas de vous démmener pour moi.

  11. #11
    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
    Après le test sur if not c is nothing et if not d is nothing, ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
             endif
             Set c = Nothing
        endif
        Set d = Nothing
    Ça peut effectivement être une explication.
    Mais je ne comprends pas ce que tu veux faire.
    Ce que j'avais compris :
    Tu cherches, ligne après ligne, une valeur de la feuil1 dans une colonne de la feuil2
    Si la valeur est trouvée pour cette colonne, tu vérifies que, sur la même ligne, les données d'une autre colonne correspondent d'une feuille sur l'autre.
    Si c'est ça (et seulement si c'est ça...) ta méthode est une aberration.
    Si tu veux une explication, je peux te la donner
    Si ce n'est pas ça, alors une explication m'aiderait à comprendre.

    Sauf si quelqu'un a déjà compris et te donne la solution
    A+

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

Discussions similaires

  1. Problème méthode find
    Par tazmania dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/06/2007, 15h37
  2. méthode FIND EXCEL
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/01/2007, 18h06
  3. VBA-E Problème méthode .find
    Par popo68 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/01/2007, 10h14
  4. Méthode find sensible aux cellules fusionnées?
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/09/2006, 01h22
  5. Utilisation de la méthode FIND
    Par Jeannot45 dans le forum Access
    Réponses: 3
    Dernier message: 09/01/2006, 15h41

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