RECHERCHEV sur plusieurs valeurs dans une même cellule

Résolu
BIRDYFROM85 Messages postés 15 Statut Membre -  
 miyhun -
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

  1. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    1. BIRDYFROM85 Messages postés 15 Statut Membre
       
      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
  2. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Re,

    tu as 16 valeurs dans ta cellule séparées par des tirets, c'est cela
    0
  3. BIRDYFROM85 Messages postés 15 Statut Membre
     
    oui c'est bien cela, jusqu'à 16 nombres séparés par des tirets
    0
  4. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    1. BIRDYFROM85 Messages postés 15 Statut Membre
       
      OK je vais essayer ça !
      merci bcp et au plaisir
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
    1. BIRDYFROM85 Messages postés 15 Statut Membre
       
      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
  7. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
    1. BIRDYFROM85 Messages postés 15 Statut Membre
       
      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
  8. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
    1. BIRDYFROM85 Messages postés 15 Statut Membre
       
      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
    2. Frenchie83 Messages postés 2254 Statut Membre 339
       
      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
      1. miyhun > Frenchie83 Messages postés 2254 Statut Membre
         
        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