Recherche mot provenant d'une liste dans un texte

Bonjour à tous,

Je dispose d'une fichier (en pièce jointe :

) dans lequel j'ai des libellés (colonne D de l'onglet "Extrait banque"), qui contiennent le nom d'un client que je souhaite identifier parmi une liste de clients contenue dans l'onglet "Client".

Evidemment, le fichier en pièce jointe ne contient que quelques lignes dans chacun des 2 onglets, alors qu'il y en a plusieurs milliers dans chaque onglet en réalité.

Par conséquent, j'aimerais pouvoir créer un programme permettant de rechercher quel client est contenu dans le libellé de la colonne D de l'onglet "Extrait banque", en fonction de la liste existante dans l'onglet "Client".

Je suppose qu'il va falloir utiliser une boucle pour faire apparaitre les noms des clients dans l'onglet "Extrait banque", puis fonction "cherche" pour voir si le nom est présent et, enfin, le copier en valeur dans la cellule pour l'identifier définitivement, mais je ne sais pas comment faire.

J'ai essayé, mais mes connaissances en VBA sont trop limitées et j'ai vite été bloqué.

En espérant que mes explications soient suffisamment claires.

Merci beaucoup par avance pour votre aide !

Bonjour,

Une proposition avec une fonction personnelle ...

Cordialement.

Bonjour,

voici un exemple pour récupérer la couleur,

=STXT(GAUCHE(D2;CHERCHE("§";SUBSTITUE(D2;" ";"§";4))-1);CHERCHE("§";SUBSTITUE(GAUCHE(D2;CHERCHE("§";SUBSTITUE(D2;" ";"§";4))-1);" ";"§";3));100)

correction

=STXT(GAUCHE(D2;CHERCHE("§";SUBSTITUE(D2;" ";"§";4))-1);CHERCHE("§";SUBSTITUE(GAUCHE(D2;CHERCHE("§";SUBSTITUE(D2;" ";"§";4))-1);" ";"§";3))+1;100)

Bonjour et merci à gyrus et à i20100 pour vos propositions.

En effet, le nom des couleurs ressortent bien.

Cependant, malheureusement les libellés dans ce fichier sont des exemples et ils ne comportent jamais les mêmes formats en réalité. Ils ne sont pas standards. Soit le nombre de mots, soit le nombre de caractères sont différents. J'ai utilisé des couleurs et des formats standards pour l'exemple, parce que mes fichiers réels contiennent des données confidentielles.

En conséquence, en testant vos propositions dans le fichier réel, seule une partie du libellé ressort et souvent avec aucun rapport avec le client.

Je pense qu'il faut du VBA pour comparer la liste des clients de l'onglet "clients" avec l'intégralité du texte contenu dans les libellés de l'onglet "extrait banque". Je ne vois pas comment faire autrement. A votre avis ?

Merci pour votre aide

re,

à tester,

Sub test()
Dim c, i
For Each c In Range("D2:D" & Cells(Rows.Count, "D").End(xlUp).Row)
    t = Split(c, " ")
    For i = LBound(t) To UBound(t)
     If Not IsError(Application.Match(t(i), Sheets("Clients").Range("B:B"), 0)) Then
     Cells(c.Row, "O") = Application.Index(Sheets("Clients").Range("A:A"), Application.Match(t(i), Sheets("Clients").Range("B:B"), 0))
     End If
    Next i
Next c
End Sub

Merci beaucoup Isabelle pour cette macro.

Elle fonctionne parfaitement dans le fichier test précédent, mais j'ai du mal à la faire fonctionner dans mon fichier réel.

Je te joins donc un nouveau fichier, plus proche de la réalité, dans lequel j'ai copié la macro, que j'ai du adapter, mais plus rien ne se passe.

Je précise que les noms des clients sont parfois composés. Le problème vient surement de là, non ?

re,

nouvelle version à tester,

Sub test2()
Dim keywords As String, firstAddress As String, c As Range
Dim sh As Worksheet, i As Long
Set sh = Sheets("Clients Novanet")
Clients = sh.Range("B2:B" & sh.Cells(Rows.Count, "B").End(xlUp).Row).Value

For i = LBound(Clients) To UBound(Clients)
  keywords = Clients(i, 1)

  With Sheets("Export 4711 virements clients").Range("G:G")
    Set c = .Find(keywords, LookIn:=xlValues, LookAt:=xlPart)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            Cells(c.Row, "Q") = Clients(i, 1)
            Cells(c.Row, "R") = Application.Index(sh.Range("A:A"), Application.Match(Clients(i, 1), sh.Range("B:B"), 0))

            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
 End With
Next i
End Sub

Wahou !

Quelle rapidité et quelle efficacité.

Je suis impressionné.

Ça fait plaisir de travailler avec toi.

Tout fonctionne parfaitement. C'est super !

Si j'osais, je te demanderais s'il serait possible d'afficher, dans les colonnes suivantes par exemple, toutes les possibilités des noms clients contenus dans le libellé. Par exemple, j'ai des clients qui s'appellent "AB", ou "EM"..., ce qui ressort donc souvent, dans le cas ou ces lettres sont contenues dans le libellé, alors que le nom du client y apparaît également parfaitement. Dans ce cas, c'est donc le mauvais nom de client qui ressort.

S'il y a 3 ou 4 clients possibles, il faudrait donc que les 4 noms et n° de clients ressortent dans les colonnes suivantes.

Saurais-tu faire quelque chose pour cela, stp ?

Encore merci pour ton aide précieuse !!!

re,

à tester,

Sub test3()
Dim keywords As String, firstAddress As String, c As Range
Dim sh As Worksheet, i As Long, col As Integer
Set sh = Sheets("Clients Novanet")
Clients = sh.Range("B2:B" & sh.Cells(Rows.Count, "B").End(xlUp).Row).Value

For i = LBound(Clients) To UBound(Clients)
  keywords = Clients(i, 1)

  With Sheets("Export 4711 virements clients").Range("G:G")
    Set c = .Find(keywords, LookIn:=xlValues, LookAt:=xlPart)
    If Not c Is Nothing Then
        firstAddress = c.Address

        col = Cells(c.Row, Columns.Count).End(xlToLeft).Column
        Do
          If col <= 17 Then
            Cells(c.Row, "Q") = Clients(i, 1)
            Cells(c.Row, "R") = Application.Index(sh.Range("A:A"), Application.Match(Clients(i, 1), sh.Range("B:B"), 0))
          Else
            Cells(c.Row, col + 1) = Clients(i, 1)
            Cells(c.Row, col + 2) = Application.Index(sh.Range("A:A"), Application.Match(Clients(i, 1), sh.Range("B:B"), 0))
          End If

            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
 End With
Next i
End Sub

Bonjour Isabelle,

Merci beaucoup pour toin aide.

Tout fonctionne à la merveille.

A bientôt !

Bonjour Isabelle,

Me revoilà !

Après avoir bien utilisé le fichier mis en place pour identifier les numéros ou les noms des clients dans les libellés des fichiers que nous exploitons, il s'avère que certains n° de client ne ressortent pas avec la macro.

Pour exemple en pièce jointe, dans la colonne G de l'onglet "Export 4711 virements clients", les n° compris dans les libellés existent dans la colonne B de l'onglet "Clients Novanet", mais la macro n'arrive pas à les identifier, pour qu'ils apparaissent dans les colonnes Q et R de l'onglet "Export 4711 virements clients".

Est-il possible de modifier la macro, pour qu'elle puisse les identifier, stp ?

Merci beaucoup

re,

j'ai fais le test sur le dernier fichier que tu as transmis et les données sont bien trouvées.

as-tu refais des test depuis ?

Isabelle,

Quand je lance la macro, il me trouve bien le n° contenu dans la deuxième ligne, mais pas dans la première. Il ne trouve pas le n° 46971 contenu dans le premier libellé, alors que ce n° apparaît bien dans la liste des n° de client.

De plus, dans mon fichier complet, il y a de nombreux cas concernés.

Penses-tu pouvoir trouver d'où vient l'anomalie et la corriger, stp ?

re,

le n° 46971 est bien trouvé mais il est reporter en colonne AT

il doit y avoir des valeurs dans les cellules avant la colonne AT

Bonjour Isabelle,

Merci pour ton retour.

Je n'avais pas vu les données qui s'affichaient sur la droite, puisqu'elles ne faisaient pas partie de ma sélection initiale.

J'avais mis des formules dans les colonnes AR et AS pour contrôle. C'est ce qui doit créer les décalages.

Après avoir supprimer les formules, je retrouve bien les données.

Merci encore une fois pour ton aide.

Rechercher des sujets similaires à "recherche mot provenant liste texte"