RECHERCHEV sur plusieurs valeurs dans une même cellule

Résolu/Fermé
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013 - 17 juin 2013 à 12:19
 miyhun - 1 nov. 2015 à 17:37
bonjour,
Vraiment pas doué sur excel, voici mon probléme : dans une cellule, j'ai plusieurs nombres séparés par des tirets (666-667-668 par exemple)
à chacun de ces nombres correspond un nom de client (bidule-truc-machin)
comment faire pour que s'affiche dans une colonne à côté, les noms de ces clients.
RECHERCHEV fonctionne très bien si je n'ai qu'une seule valeur mais pas quand j'en ai plusieurs...
merci d'avance pour votre aide

NB : je ne peux vous joindre le fichier en l'état, il est trop confidentiel... et je travaille sur excel 2007.

7 réponses

Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
Modifié par Mike-31 le 17/06/2013 à 12:38
Salut,

As tu une base de données détaillée qui identifie le client par rapport à un code exemple en A1 666 et en B1 bidule, en A2 667 et en B2 truc etc
et combien de valeurs séparées par un tiret dans une cellule
A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013
17 juin 2013 à 13:51
Bjr Mike,
oui j'ai cette base et le nombre de valeurs est différent selon les cellules, ça varie de 1 seule (ça marche avec recherchev jusqu'à 16 valeurs maxi
merci d'avance de ton aide
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
17 juin 2013 à 13:55
Re,

tu as 16 valeurs dans ta cellule séparées par des tirets, c'est cela
0
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013
17 juin 2013 à 13:57
oui c'est bien cela, jusqu'à 16 nombres séparés par des tirets
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
17 juin 2013 à 14:12
Re,

tu vas avoir des formules usines à gaz et très lentes, pourquoi ne pas utiliser la fonction convertir pour séparer tes données, ensuite les transposer avec une rechercheV pour chaque valeur

exemple tu as tes valeurs de A1 à A50, tu mets la plage en surbrillance et onglet Données/Outils de Données/Convertir
coche délimité/dans autre tu saisis le tiret/suivant et OK
tes données séparées, il suffit de les sélectionner/Copier/Collage Spécial/cocher transposer et OK

en face chaque données tu utilise une RECHERCHEV

ou même sans les transposer, si tu as tes données séparées ligne 2 entre B2 et X2, au dessous tu peux utiliser directement une recherche
0
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013
17 juin 2013 à 14:29
OK je vais essayer ça !
merci bcp et au plaisir
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
17 juin 2013 à 16:06
Bonjour

une autre façon mettant en oeuvre une fonction maison
https://www.cjoint.com/?CFrp7SviHvG

une feuille nommée "Liste" contenant la liste des numéros et des clients
une feuille extraction ou sont extraient les noms par formule
taper en B2: =Extract(A2) , tirez la formule vers le bas.

à essayer

cdlt
0
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013
18 juin 2013 à 11:36
bonjour Frenchie83,
cà me parait effectivement très fonctionnel, ça marche comment, avec une macro ?
comment se fait le lien entre ta feuille "extraction" et ta feuille "liste" ?
merci de tes explications
bien cdt,
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
18 juin 2013 à 13:19
Bonjour BIRDYFROM85

Ce n'est pas une macro mais une fonction (macro qui permet de créer sa propre formule), elle se trouve dans le module 1
Le principe: on compte le nombre de tiret: NBTiret = UBound(Split(Sel, "-", , 1))
on isole les 3 caractères qui suivent chaque tiret (on les mémorise).
pour chaque tronçon isolé, on recherche dans la feuille liste le nom situé dans la colonne B correspondant à chaque numéro (on les mémorise).
on reconstruit le tout en insérant un tiret entre chaque nom.
à la fin on supprime le premier tiret à gauche qui a été ajouté lors de la mémorisation des noms.
Comme la fonction s'appelle Extract et que le paramètre est le contenu de la cellule A de la même ligne, la formule est donc : =Extract(A2) pour la ligne 2,=Extract(A3) pour la ligne 3, etc..
0
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013
18 juin 2013 à 14:16
OK mon souci c'est que le nombre de tiret est tout à fait aléatoire et variable (maximum 15)...
je ne sais pas, du coup, si c'est transposable ligne à ligne
merci quand même pour l'astuce, du coup j'ai appliqué l'idée transmise par Mike et ça a très bien fonctionné
au plaisir
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
18 juin 2013 à 14:22
aucun souci concernant le nombre de tirets puisque celui est recalculé pour chaque cellule, donc ça peut aller bien au-delà de 15

cdlt
0
BIRDYFROM85 Messages postés 15 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 19 juin 2013
19 juin 2013 à 13:59
Slt
pour un autre tableau plus complexe, ta formule peut m'intéresser
pourrais-tu stp m'expliquer la démarche pas-à-pas notamment comment fait-on pour mémoriser les caractères et comment on les associe ensuite...
merci d'avance
bien cdt,
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
19 juin 2013 à 19:23
Bonjour
on va décomposer tout ça

Function Extract(Sel As Range) "sel pour la cellule à tester"
If Len(Sel) = 0 Then Exit Function " si le nombre de caractères de la cellule à tester est vide on sort du programme"
NBTiret = UBound(Split(Sel, "-", , 1)) "on compte le nombre de tirets"
ReDim Extraction(Len(Sel)) As String "on crée une variable nommée Extraction à laquelle on attribuera un numéro qui sera incrémenté dans une boucle avec un maximum égal au nombre de caractères, l'incrémentation se fera par pas de 4 (nombre de chiffres par code client à extraire + le tiret)"

ReDim Nom(Len(Sel)) As String "on crée une variable nommée Nom à laquelle on attribuera un numéro qui sera incrémenté dans une boucle avec un maximum égal au nombre de caractères"

A partir de là, dans cette boucle, la valeur i va prendre la valeur 1 au premier tour, puis 5, puis 9 ainsi de suite jusqu'à atteindre le nombre de caractères de la cellule à tester
donc la variable Extraction va s'appeler Extraction1, puis Extraction5 , etc..
For i = 1 To Len(Sel) Step 4
Extraction(i) = Mid(Sel, i, 3)
next

"mid: =chaine de caractères à extraire dans la cellule à tester"
"Sel ;= cellule à tester"
" i:=valeur de i à chaque tour en commençant par 1, puis 5, puis 9, etc", cette valeur représente la position du premier caractère de chaque numéro de clients
" 3: = nombre de caractères à retenir" à chaque passage

exemple; cellule=666-667-668
nb de caract=10
nb de tirets =2

extraction de chaque numéro
premier tour:
i=1
Extraction1=on isole les 3 caractères à partir du premier caractère= 666

Deuxième tour:
i=1+4 =5
Extraction1=on isole les 3 caractères à partir du 5ème caractère= 667

Troisième tour:
i=5+4 =9
Extraction1=on isole les 3 caractères à partir du 9ème caractère= 668

Quatrième tour
i =9+4 =13
i est supérieur au nombre de caractères de la cellule, on passe à la suite

maintenant, on va associer chaque Extraction faite auparavant à un client,
d'où l'intérêt d'avoir une liste de code associée a chaque client

en reprenant le principe de la boucle précédente, on va chercher dans la feuille liste, colonne A
le numéro correspondant à l'extraction(i)
For i = 1 To Len(Sel) Step 4
Set c = Sheets("Liste").Columns(1).Find(Extraction(i), LookIn:=xlValues)
If c Is Nothing Then " si pas de correspondance, le nom sera marqué "inconnu"
Nom(i) = "inconnu"
GoTo Suite et on passe au code suivant
End If
Nom(i) = c.Offset(0, 1).Value " sinon la variable Nom(associée à la valeur de i) prendra le nom situé en colonne B et sur la même ligne que le code client"
Suite:
Extract = Extract & "-" & Nom(i)
avant le premier passage Extract était égal rien ,
donc après le premier passage Extract = -TOTO,
au passage suivant, Extract= Extract & "-" & Nom(i), soit "-TOTO-TITI"
ainsi de suite

Next i


Extract = Mid(Extract, 2, 1000)
ici on enlève le premier tiret, donc dans la valeur Extract, à partir du 2ème caractère, on prend les 1000 caractères suivants, ce qui couvre une grande quantité de code rentrés

End Function

j'ai essayé d'être le plus clair possible, j'espère avoir répondu à tes questions

Cordialement
0
miyhun > Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023
1 nov. 2015 à 17:37
Bonjour Frenchie,
Je déterre un peu le sujet :D
J'ai pas essayé la formule mais j'ai essayé de comprendre ton raisonnement. Une question me taraude: Elle est valable uniquement pour un code client égale à 3 caractères? Moi ça m'intéresserait mais avec une longueur de code client variable entre 1 et 5 caractères.... C'est pas possible? Ton fichier joint n'existe plus :(
0