Methode Find, recherche de données dans une boucle

thunderstruck

XLDnaute Nouveau
Bonjour à tous,
Je suis sur un projet auquelle j'arrive au terme mais néanmoins je bloque sur une fonctionnalité que je n'arrive pas à faire fonctionner.

Je m'explique:

Mon fichier a une liste d'entreprise complexe dans une colonne(D) style: Nestlé International SA, Nestlé France, Symantec AG, Symantec corporation etc.
Dans une autre colonne(R) j'ai une liste de certaine entreprise qui m'intéresse mais le nom est raccourci(style: Nestlé, symantec, etc.)

Mon but est de faire une recherche avec chacun des mots de la colonne B dans la colonne A et de trouver tous les cellules qui contienne les mots de la cellule B.
Ensuite je colle à la suite toutes les entrées correspondant à mes mots clefs dans un autre onglet.

J'utilise actuellement la fonction "Find" mais je bloque déjà rien qu'en essayant de chercher la liste des entreprises se trouvant dans ma liste.

Quelqu'un pourrait-il m'aider?

Merci beaucoup d'avance pour votre aide!



Pour un peu plus de visuel(ceci est un exemple):


Cellule A:
A1 Dell computer
A2 Nestlé International
A3 Google SA
A4 Nestlé Company
A5 LVMH international
A6 Nestlé Nespresso
A7 Symantec AG
A8 Sectec international
A9 Total SA
A10 Total petrol
A11 Dell international

Cellule B:
B1 Nestlé
B2 Symantec
B3 Total
B4 HP
B5 Sectec
B6 Dell



=> le résultat dans mon autre onglets devrait être le suivant:
A1 Nestlé International
A2 Nestlé Company
A3 Nestlé Nespresso
A4 Symantec AG
A5 Total SA
A6Total petrol
A7 Sectec international
A8 Dell computer
A9 Dell international



Voilà mon code qui ne fonctionne qu'en partie, car ca ne me trouve pas tous les mots mais juste le premier de la liste(de plus elle ne me les copie pas dans l'autre onglets mais ca c'est une autre histoire, car je ne l'ai pas encore implémenté):
'Boucle for pour passer en revue l'entier de la colonne B
For i = Cells(1, 2).CurrentRegion.Rows.Count To 1 Step -1
'Recherche dans l'entier de la colonne A
With Worksheets(1).Range("A1:A65536")
'Recherche des mots de la colonne B
Set c = .Find(What:=Cells(i, 2), LookIn:=xlValues, LookAt:=xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Set plage = c
MsgBox c
Do
Set plage = Union(c, plage)
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
Next
 

pierrejean

XLDnaute Barbatruc
Re : Methode Find, recherche de données dans une boucle

Bonjour thunderstruck

Suis de bonne humeur aujourd'hui = je réponds malgré le manque de fichier exemple

Code:
Sub cherche()
ligne = 1
For n = 1 To Range("B65536").End(xlUp).Row
  Set c = ActiveSheet.Columns("A").Find(Range("B" & n), LookIn:=xlValues, LookAt:=xlPart)
  If Not c Is Nothing Then
    firstAddress = c.Address
       Do
         Sheets("Feuil2").Cells(ligne, 1) = c.Value
         ligne = ligne + 1
         Set c = Columns("A").FindNext(c)
       Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
Next n
End Sub
 

kjin

XLDnaute Barbatruc
Re : Methode Find, recherche de données dans une boucle

Bonjour, salut PierreJean :),
Peut-être y a t-il des doublons...
Code:
Dim rng2 As Range, t As Range, coll As New Collection, i%
With Sheets(1)
    Set rng2 = .Range("B1:B" & .Range("B65000").End(xlUp).Row)
    For Each nom In rng2
        Set t = .Columns(1).Find(nom, LookIn:=xlValues, LookAt:=xlPart)
        If Not t Is Nothing Then
            firstAddress = t.Address
            Do
                On Error Resume Next
                coll.Add t.Value, t.Value
                On Error GoTo 0
                Set t = .Columns(1).FindNext(t)
            Loop While Not t Is Nothing And t.Address <> firstAddress
        End If
    Next
End With
With Sheets(2)
    For i = 1 To coll.Count
        .Cells(i, 1) = coll(i)
    Next
End With
A+
kjin
 

thunderstruck

XLDnaute Nouveau
Re : Methode Find, recherche de données dans une boucle

Bonjour thunderstruck

Suis de bonne humeur aujourd'hui = je réponds malgré le manque de fichier exemple

Code:
Sub cherche()
ligne = 1
For n = 1 To Range("B65536").End(xlUp).Row
  Set c = ActiveSheet.Columns("A").Find(Range("B" & n), LookIn:=xlValues, LookAt:=xlPart)
  If Not c Is Nothing Then
    firstAddress = c.Address
       Do
         Sheets("Feuil2").Cells(ligne, 1) = c.Value
         ligne = ligne + 1
         Set c = Columns("A").FindNext(c)
       Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
Next n
End Sub

Génial!! Ca fonctionne parfaitement,

Y a-t-il un moyen facile de récuperer dans mon onglet "Feuil2" la valeur de ma colonne C et D en même temps que celle récupérée en A(Exemple si mon programme trouve la cellule A2 Nestlé International j'aimerais qu'il me prenne la valeur en C2 et C3 et qu'il me les colles en Bx et Cx dans ma page "feuil2"

J'essaye de jouer avec le c.Address mais je ne trouve pas le moyen de séléctionner les cellules à sa droite

Merci encore pour votre aide!

PS: Je ferais attention d'attacher mon fichier dans le futur, désolé encore!
 

pierrejean

XLDnaute Barbatruc
Re : Methode Find, recherche de données dans une boucle

Re

Salut ami kjin

Pour tenir compte de ta remarque et de la demande de thunderstruck ( pour le fun aussi !!)

Code:
Sub cherche2()
Set dico = CreateObject("Scripting.dictionary")
For n = 1 To Range("B65536").End(xlUp).Row
  Set c = ActiveSheet.Columns("A").Find(Range("B" & n), LookIn:=xlValues, LookAt:=xlPart)
  If Not c Is Nothing Then
    firstAddress = c.Address
       Do
         x = c.Value & ";" & c.Offset(0, 2).Value & ";" & c.Offset(0, 3).Value
         dico(x) = x
         Set c = Columns("A").FindNext(c)
       Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
Next n
a = dico.items
For n = LBound(a) To UBound(a)
  Sheets("Feuil2").Cells(n + 1, 1).Resize(1, 3) = Split(a(n), ";")
Next n
Sheets("Feuil2").Select
End Sub
 

thunderstruck

XLDnaute Nouveau
Re : Methode Find, recherche de données dans une boucle

Re

Salut ami kjin

Pour tenir compte de ta remarque et de la demande de thunderstruck ( pour le fun aussi !!)

Code:
Sub cherche2()
Set dico = CreateObject("Scripting.dictionary")
For n = 1 To Range("B65536").End(xlUp).Row
  Set c = ActiveSheet.Columns("A").Find(Range("B" & n), LookIn:=xlValues, LookAt:=xlPart)
  If Not c Is Nothing Then
    firstAddress = c.Address
       Do
         x = c.Value & ";" & c.Offset(0, 2).Value & ";" & c.Offset(0, 3).Value
         dico(x) = x
         Set c = Columns("A").FindNext(c)
       Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
Next n
a = dico.items
For n = LBound(a) To UBound(a)
  Sheets("Feuil2").Cells(n + 1, 1).Resize(1, 3) = Split(a(n), ";")
Next n
Sheets("Feuil2").Select
End Sub


Très fort!
Je l'ai adapté à mon code, et c'est vraiment parfaitement ce que je recherche!

Il n'y a plus qu'un problème sur le fichier, j'ai certaines entreprise qui comporte 2 ou 3 lettres (style AG) et ca fausse mes résultats car il retrouve différents résultats qui ne devrait pas figurer dans le deuxième onglets(style Agronomie ...),

Avez-vous une idée pour contourner ce problème?

Merci encore.
 

pierrejean

XLDnaute Barbatruc
Re : Methode Find, recherche de données dans une boucle

Re

Une petite astuce issue d'une mauvaise habitude assez courante:
Derriere les noms du style Ag place un espace ; la macro cherchera 'Ag ' et ne le trouvera pas dans Agronomie
 

thunderstruck

XLDnaute Nouveau
Re : Methode Find, recherche de données dans une boucle

Bien vu!
J'ai rajouté un if qui rajoute un espace si le texte est plus petit ou égal à 3 caractère et ca fonctionne super!
Merci beaucoup pour ton aide pierrejean

Re

Une petite astuce issue d'une mauvaise habitude assez courante:
Derriere les noms du style Ag place un espace ; la macro cherchera 'Ag ' et ne le trouvera pas dans Agronomie
 

Discussions similaires

Réponses
12
Affichages
617