XL 2019 Recherche d'un mot dans une chaîne de caractère depuis une plage de références puis si présent renvoyer la référence

MilieBZH

XLDnaute Nouveau
Bonjour à tous,

Je fais l'analyse de mes comptes et je bloque... j'espère que quelqu'un pourra m'aider.

La description de la transaction a toujours le nom du fournisseur mais entourée d'autres texte.
J'ai constitué un liste avec l'ensemble des fournisseurs. Dans un premier temps je souhaite trouver si le fournisseur existe depuis cette plage et si oui, alors lui donner la référence correspondante.
J'ai réussit à le faire mais la formule est individualisé à chaque fournisseur, donc quand j'en rentre un nouveau il faut que je modifie la formule ... sans parler de la complexité de celle-ci.

Plage de référence :
A : Texte toujours présent dans la description de la transaction // B : Le nom référence du fournisseur

Formule que j'utilise :
D : description de la transaction

E2=SI(ESTNUM(CHERCHE(CELLULE("contenu";$A$2);$D2));$B$2;
SI(ESTNUM(CHERCHE(CELLULE("contenu";$A$3);$D2));$B$3;
SI(ESTNUM(CHERCHE(CELLULE("contenu";$A$4);$D2));$B$4;
SI(ESTNUM(CHERCHE(CELLULE("contenu";$A$5);$D2));$B$5;))))

Je voudrais partir d'une base de donnée (plage), il faut peut-être tout simplement travailler avec un RechercheV mais je bloque ...
L'excel test en PJ...

Si quelqu'un a une idéee ;-)
 

Pièces jointes

  • Classeurtest.xlsx
    9.6 KB · Affichages: 4
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour MilieBZH,
Une approche possible avec une fonction perso en VBA.
La syntaxe est : =NomUsuel(Nom;Plage des noms usuels)
VB:
Function NomUsuel(Nom$, Plage)
Dim Tablo, i%
Application.Volatile
NomUsuel = " "
Tablo = Plage
For i = 1 To UBound(Tablo)
    If LCase(Nom) Like "*" & LCase(Tablo(i, 1)) & "*" And Tablo(i, 1) <> "" Then
        NomUsuel = Tablo(i, 2)
        Exit Function
    End If
Next i
End Function
 

Pièces jointes

  • Classeurtest.xlsm
    15 KB · Affichages: 1

MilieBZH

XLDnaute Nouveau
Bonjour MilieBZH,
Une approche possible avec une fonction perso en VBA.
La syntaxe est : =NomUsuel(Nom;Plage des noms usuels)
VB:
Function NomUsuel(Nom$, Plage)
Dim Tablo, i%
Application.Volatile
NomUsuel = " "
Tablo = Plage
For i = 1 To UBound(Tablo)
    If LCase(Nom) Like "*" & LCase(Tablo(i, 1)) & "*" And Tablo(i, 1) <> "" Then
        NomUsuel = Tablo(i, 2)
        Exit Function
    End If
Next i
End Function
Merci Sylvanu !!
J'aurais voulu passer par de la formule plutôt que du VBA... que je ne maîtrise pas beaucoup...
Merci en tout cas pour ta réponse, je vais essayer de me pencher dessus ;-)
 

MilieBZH

XLDnaute Nouveau
Salut à vous deux, @djidji59430 et @JHA !

Merci beaucoup, c'est élégant ! malheureusement cela ne semble pas marcher... la cellule D4; D5; ... note toujours "pas trouvé" vous sauriez pourquoi ?

Je n'utilise pas souvent INDEX ou EQUIV mais dans la situation c'est une bonne idée !

Le problème ne viendrai-t-il pas du faite qu'il recherche une plage entière plutôt qu'une seule cellule ?
J'ai essayé de changer la plage C4:C7 en juste C4 mais cela n'a pas résolut le pb :
=SIERREUR(INDEX($D$12:$D$15;EQUIV(VRAI;ESTNUM(CHERCHE($C$12:$C$15;$C4));0));"pas trouvé")
Vous auriez une idée ?
Merci pour votre aide à tous les deux
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 137
Messages
2 095 626
Membres
106 307
dernier inscrit
LETIFI