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 :

recherche dans excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut recherche dans excel
    bonjour,

    Voilà j'ai un fichier excel contenant 2 feuilles de données.
    La feuille 1 comporte énormement de lignes et de colonnes.
    Dans les colonnes 3,4 (et suivantes) de la feuille1 on trouve des données que je souhaites comparer aux données de la colonne1 de la feuille 2.
    Si je trouve le même texte je souhaite recopier dans une 3eme feuille la 1ere et 2eme colonne de la feuille1 et la 2eme colonne de la feuille2 correspondant aux données de la 1ere colonne de la feuille2. De plus si on ne trouve pas de donnée correspondante je souhaiterais que la case reste vide.
    Voici un exemple pour être plus claire :

    feuille1
    col1 | col2 | col3 | col4
    aaa | zzz | 123 | 857
    bbb | ppp | 456 | 123
    ccc | fff | 123 | 987
    ddd | ggg | 589 | 456
    eee | rrr | 25 |
    fff | yyy | 687 | 987

    feuille2
    col1 | col2
    123 | t1
    987 | t2
    589 | t3
    25 | t4
    456 | t5
    687 | t6


    feuille3
    col1 | col2 | col3 | col4
    aaa | zzz | t1 |
    bbb | ppp | t1 |
    ccc | fff | t1 | t2
    ddd | ggg | t3 | t5
    eee | rrr | t4 |
    fff | yyy | t6 | t2

    Merci d'avance si vous pouvez m'aider.

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour et bienvenue sur ce forum.

    Qu'as-tu déjà fait?
    As-tu un bout de code à nous montrer?
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    Bonjour,

    je suis désolée de ne pas vous avoir expliqué la situation.

    En fait je bosse dans un service info. Je suis plus dans le dépannage et on m'a filé un job de trouver la liste des utilisateurs qui ont accès à certains dossiers.
    Mais en fait ce n'est pas si simple, j'ai réussi à récupérer certaines infos qu'il faut que je recoupe.
    Le problème c'est que la prog et moi ça fait 2...
    J'ai trouvé des bouts de code qui m'ont donné des pistes mais j'y comprend rien en fait

    Voilà ca que j'ai pu trouver avec tentative de bidouillage perso mais ça marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim cel As Range
    'Dim col As Range
    'For Each cel In Worksheets("feuil1").Range("C1:IV2217").Cells
    '    For Each col In Worksheets("feuil2").Range("A:A").Cells
    '        If cel.Value = col.Value Then
    '            Worksheets("feuil3").Range("c1").Copy = cel.Value
    '        Else
    '            Worksheets("feuil3").Range("c1").Value = ""
    '        End If
    '    Next
    'Next
    ou bien

    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
    Dim MotCherche, L, C, InL, InC, OutL
    Dim Origine, recherche, Destination
     
    Set Origine = Worksheets("feuil1")
    Set recherche = Worksheets("feuil2")
    Set Destination = Worksheets("feuil3")
     
    MotCherche = "175273"
    InL = Origine.ActiveCell.SpecialCells(xlCellTypeLastCell).Row
    InC = Origine.ActiveCell.SpecialCells(xlCellTypeLastCell).Column
    OutL = Destination.ActiveCell.SpecialCells(xlCellTypeLastCell).Row
     
    For L = 1 To InL
      If Origine.Cells(L, 1).Value = MotCherche Then
        For C = 1 To InC
          Destination.Cells(OutL, C).Value = Origine.Cells(L, C).Value
        Next
        OutL = OutL + 1
        End If
    Next
    Voilà si qqun pouvait au moins m'aiguiller un peu

    Merci

  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
    Un élément de réponse :
    Pour parcourir ta 1ère feuille, tu dois incrémenter ton N° de colonne à partir de la troisième, puis ton N° de ligne.
    Pour trouver les occurences correspondantes sur les autres feuilles, je te conseillerais d'utiliser Find
    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
    Début de la boucle sur le N° Ligne
        Feuille 1, tant qu'une donnée existe sur la ligne, colonne 1
        Copie des deux premières cellules de la ligne sur la feuille 3, colonne 1 et 2, ligne(n)
        Incrémentation du N° de colonne Feuille 1
        Début de la boucle 2 sur le N° de colonne, Feuille 1
        tant qu'une donnée existe dans la colonne de la ligne
            Lecture de la donnée
            Recherche feuille 2 de la donnée correspondante, colonne 1 
            (C'est ici que j'utiliserais Find)
                Si corresponce trouvée feuille 2 colonne 1 :
                    copie de la donnée feuille 2, colonne 2, sur la feuille 3, colonne "suivante" de la même ligne(n)
                Si Correspondance non trouvée -> rien
            Dans les deux cas, Incrémentation du N° de colonne feuille 3
            Incrémentation du N° de colonne feuille 1
        fin de boucle sur N° de colonne
    Poursuite de la boucle sur le N° de ligne Feuille 1
    Si ça correspond à ce que tu veux faire, pour le code, on verra après
    Tu dis

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    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
    19
    dim [i]les feuilles et variables[i]
    set [i]ce qu'il faut[i]
     
     
    for i = 1 to nblignefeuil3
     
       reponse=feuil2.cells.find(feuil1.cells(i,3), feuil2.cells(1,1), xlvalues, xlwhole)
     
           if not reponse is nothing then
                feuil3.cells(i,3)=feuil2.cells(reponse.row, 2)
           end if
     
       reponse=feuil2.cells.find(feuil1.cells(i,4), feuil2.cells(1,1), xlvalues, xlwhole)
     
       if not reponse is nothing then
           feuil3.cells(i,4)=feuil2.cells(reponse.row, 3)
       end if
     
    next i
    reste a voir tous les bugs, mais ça me semble etre une base....si j'ai compris l'exemple...

  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
    Désolé, sk8bcn, mais je ne pense pas que tu prennes le pb dans le bon sens puisque tu fais :
    for i = 1 to nblignefeuil3
    alors qu'au départ, la feuille 3 n'a pas de ligne. Mais ce n'est qu'une supposition...
    Ceci dit, si tu indentais ton code, ce serait plus lisible (Bouton "Editer")
    Tu peux faire ça pour nous ? Merci

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    en fait, en prenant l'exemple, j'en deduis que la colonne 1 et 2 de la feuille1 est l'identique sur la feuille3.

    Sinon je boucle de i= 1 à nblignesfeuille1 et je copie la colonne 1 et 2 dans la feuille3. Je m'ajoute un compteur ligne sur la feuille 3

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    Citation Envoyé par sk8bcn
    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
    dim [i]les feuilles et variables[i]
    set [i]ce qu'il faut[i]
     
    ligneenregistrement=1
     
    for i = 1 to nblignefeuil1
     
    test= false
     
       reponse=feuil2.cells.find(feuil1.cells(i,3), feuil2.cells(1,1), xlvalues, xlwhole)
     
           if not reponse is nothing then
                feuil3.cells(ligneenregistrement,1)=feuil1.cells(i,1)             
                feuil3.cells(ligneenregistrement,2)=feuil1.cells(i,2)
                feuil3.cells(ligneenregistrement,3)=feuil2.cells(reponse.row, 2)
                test=true
           end if
     
       reponse=feuil2.cells.find(feuil1.cells(i,4), feuil2.cells(1,1), xlvalues, xlwhole)
     
       if not reponse is nothing then
               feuil3.cells(ligneenregistrement,1)=feuil1.cells(i,1)             
                feuil3.cells(ligneenregistrement,2)=feuil1.cells(i,2)
                feuil3.cells(ligneenregistrement,4)=feuil2.cells(reponse.row, 2)
                test=true
       end if
     
       if test=true then
          ligneenregistrement=ligneenregistrement+1
       end if
     
    next i
    reste a voir tous les bugs, mais ça me semble etre une base....si j'ai compris l'exemple...

  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
    Ok, mais, dans
    reponse=feuil2.cells.find(feuil1.cells(i,3), ...
    tu cantonnes ta recherche sur la donnée de la colonne 3 de la première feuille or apparemment, ces données peuvent également se trouver sur les colonnes suivantes
    Mais je sens que tu tiens le bon bout... C'est Sand75 qui va être content

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    ah oui! y a plus que simplement la colonne 3 et 4! mmmmm

    faut que j'y réfléchisse à nouveau.

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    Tout d'abord merci à vous.

    Ouskel'n'or ta réponse en français me semble correcte, t'as bien résumé.

    sk8bcn : je vais tester ta proposition

    en tous cas ça m'aide beaucoup

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    dim [i]les feuilles et variables[i]
    set [i]ce qu'il faut[i]
     
    ligneenregistrement=1
     
    for i = 1 to nblignefeuil1
     
    test= false
    j=3
    col=3
     
       do
     
       reponse=feuil2.cells.find(feuil1.cells(i,j), feuil2.cells(1,1), xlvalues, xlwhole)
     
           if not reponse is nothing then
                feuil3.cells(ligneenregistrement,1)=feuil1.cells(i,1)             
                feuil3.cells(ligneenregistrement,2)=feuil1.cells(i,2)
                feuil3.cells(ligneenregistrement,col)=feuil2.cells(reponse.row, 2)
                test=true
                col=col+1
           end if
     
           j=j+1
     
           loop while feuil1.cells(i,j)<>""
     
       if test=true then
          ligneenregistrement=ligneenregistrement+1
       end if
     
    next i

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    pendant que j'y suis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim [i]les feuilles et variables[i]
    set [i]ce qu'il faut[i]
    a rajouter...

    on commence à la ligne 1 sur la feuille 3. Si tu veux demarrer plus bas, il suffit de choisir un autre numero

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 1 to nblignefeuil1
    on boucle sur le nombre de lignes de la feuille 1. Si tu as des titres d'en-tête, démarre à 2. Si tu veux avoir le nb de lignes trouvés par ta macro, ajoute:

    nblignefeuil1=feuil1.cells(65536,1).end(xlup).row


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test= false
    j=3
    col=3
    je mets "test" pour savoir si j'ai enregistré la ligne ou si je n'ai rien trouvé. Je l'initialise à Faux.
    j est le numéro de la colonne que je cherche
    col est la prochaine colonne ou j'enregistre mon information.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do
     
       reponse=feuil2.cells.find(feuil1.cells(i,j), feuil2.cells(1,1), xlvalues, xlwhole)
    excel cherche dans la feuille 2 la valeur de feuil1.cells(i,j) (soit la ligne actuelle de ma boucle, et la colonne cherchée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if not reponse is nothing then
         feuil3.cells(ligneenregistrement,1)=feuil1.cells(i,1)             
         feuil3.cells(ligneenregistrement,2)=feuil1.cells(i,2)
         feuil3.cells(ligneenregistrement,col)=feuil2.cells(reponse.row, 2)
         test=true
         col=col+1
    end if
    si reponse existe (il a trouvé!) alors j'enregistre les 2 premieres colonnes de la feuille 1 (ok plusieurs fois inutilement mais je voulais faire court), j'ajoute le code correspondant de la feuille 2 (reponse est une adresse donc reponse.row est le numero de ligne)
    test=vrai => pour dire que j'ai trouvé la ligne
    et pour ne pas ré-écrire sur cette colonne, j'incrémente la colonne de 1.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    j=j+1
     
           loop while feuil1.cells(i,j)<>""
    on regarde la colonne suivante. Si elle est non vide, on refait de même. (si t'as plus de 256 colonnes, tu peux avoir un bug)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if test=true then
          ligneenregistrement=ligneenregistrement+1
       end if
    Si test est vrai, alors j'ai enregistré une ligne. Je passe à la suivante

    et on enregistre finalement la prochaine

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    C'est super en plus tout expliqué. Merci

    Par contre j'ai le message d'erreur "type incompatible" pour "reponse".
    Tu dis que c'est une adresse il faut lui donner quel type ?

  15. #15
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    reponse est une cellule.

    Il faut donc le déclarer comme Range.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    dim reponse as range

  17. #17
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    Nouvelle erreur :

    erreur d'exécution '91':
    Variable objet ou variable de bloc with non définie

    qui semble avoir un lien avec cette ligne :
    reponse = feuil2.Cells.Find(feuil1.Cells(i, j), feuil2.Cells(1, 1), xlValues, xlWhole)

    Je sais je suis une bille

  18. #18
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    feuil2, c'est le nom de ta feuille tel qu'il apparaît dans l'onglet ou est-ce le nom qui est dans l'éditeur VBA?

    Pour info:
    Dans l'éditeur VBA, les feuilles ont 2 noms.
    Le premier (sans parenthèses) est le nom de l'objet et peut être utilisé dans une syntaxe du style feuil1.Cells...
    Le deuxième nom (entre parenthèses) est le nom qui a été donné à l'onglet de la feuille.
    Pour utiliser ce nom, la syntaxe est (Work)Sheets("LeNomSurLonglet").Cells...
    Images attachées Images attachées  
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  19. #19
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    Si tu as nommé tes feuilles (genre reference pour la feuille) declare les ainsi

    dim ref as worksheet

    set ref=worksheets("reference")

    sinon, copie moi ton code en entier.

    Au fait, je suis pas un expert moi, j'apprend ici et un peu sur le net, il y a 6 mois, je savais pas figer des volets sur excel ni filtrer.

  20. #20
    Membre confirmé Avatar de bernard38
    Inscrit en
    Février 2006
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 158
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not reponse Is Nothing Then
    Pourquoi ce code me génère l'erreur 424 "objet requis" ?

Discussions similaires

  1. Option recherche dans Excel 2007
    Par jawed dans le forum Excel
    Réponses: 2
    Dernier message: 12/06/2008, 11h44
  2. Techniques de recherche dans Excel
    Par Laura-c dans le forum Excel
    Réponses: 11
    Dernier message: 03/03/2008, 11h29
  3. Recherche "." dans Excel
    Par kenobyalex dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/01/2008, 12h33
  4. formule de recherche dans excel
    Par kroukse dans le forum Excel
    Réponses: 3
    Dernier message: 27/11/2007, 14h41
  5. Recherche dans Excel
    Par Golork dans le forum Bases de données
    Réponses: 7
    Dernier message: 22/03/2006, 21h21

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