Recherche V : valeur cherchée multiple séparée par des virgules

magicglide

XLDnaute Nouveau
Bonjour,
En colonne A, des cellules contenant plusieurs valeurs numériques par cellule, séparées par des ','.
A l'aide de la fonction 'recherchev', je souhaite afficher en colonne B, la valeur textuelle cette fois (toujours séparée par des ',') trouvée dans un tableau situé en colonne E (numérotation) et F, les valeurs textuelles.

La difficulté est de trouver la bonne formule de dé-concaténation pour le paramètre 'valeur cherchée' de recherchev qui permet de lire X valeurs numériques séparées par les ','

Petite feuille excel jointe qui explique mon propos.
D'avance merci pour vos suggestions.
;)
 

Pièces jointes

  • EDL_ex.xlsx
    12.4 KB · Affichages: 78

magicglide

XLDnaute Nouveau
Re : Recherche V : valeur cherchée multiple séparée par des virgules

Juste un dernier mot sur le pourquoi de la demande.

J'utilise l'ERP Dolibarrr.
Ce dernier ne propose pas d'outil très puissant pour croiser les données, du coup je fais des exports vers excel.
Durant l'export, Dolibarr encode mes listes personnalisées sous forme d'entiers.
Pour les tableaux de bords et les collègues, les entiers n'étaient pas parlant, il fallait retrouver l'intitulé des listes prédéfinies.

C'est chose faite grâce à vous.
Encore merci.
;-)
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Recherche V : valeur cherchée multiple séparée par des virgules

Re encore,

Par curiosité j'ai exécuté cette macro sur Win7 - Excel 2010 :

Code:
Sub test()
Dim t
[A29:B10801].ClearContents
t = Timer
[A2:B28].Copy [A29:B10801]
MsgBox Timer - t
End Sub

Fichier du post #13 (formules) => 2,24 secondes.

Fichier du post #15 (VBA) => 1,25 seconde.

C'est bien sûr plus lent que la macro d'Efgé qui utilise l'objet Dictionary pour la recherche.

A+
 

Efgé

XLDnaute Barbatruc
Re : Recherche V : valeur cherchée multiple séparée par des virgules

Bonjour à tous
...plus lent que la macro d'Efgé qui utilise l'objet Dictionary pour la recherche...
Le coté intéressant n'est pas le Dictionary mais l'utilisation d'un "sous tableau" dans le tableau final.
Il semble que l'utilisation d'un tableau temporaire ,Tmp dans la première proposition,"ralenti" l’exécution du code :)
Voir Post#5
Cordialement
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Recherche V : valeur cherchée multiple séparée par des virgules

Bonjour à tous :)

Pour le fun, un fichier pour comparer une méthode avec Dictionary (Efgé) et une méthode avec uniquement des tableaux (mapomme). On peut choisir le nombre de lignes désirées et le nombre d'itérations.

Au niveau résultat:
1) ma bécane est deux fois plus lente que celle d'Efgé :(.
2) les résultats sont grosso modo kif kif bourricot (comme dirait je ne sais plus qui :)
Pour des nombres de lignes inférieurs à 10 000, il a un un epsilonesque avantage pour la méthode 2, au delà la méthode 1 prend un avantage epsilonesque (sur ma vieille bécane).
 

Pièces jointes

  • EDL_ex v1.xlsm
    33.7 KB · Affichages: 47

Efgé

XLDnaute Barbatruc
Re : Recherche V : valeur cherchée multiple séparée par des virgules

Bonjour à tous :)
Bonjour mapomme
Joli fichier :)

Il est vrai que comme le tableau de correspondance est classé et sans doublon, l'utilisation d'un tableau reviens à l'utilisation d'un Dico

Je pense que tu peux aller un pouillème plus vite en évitant une boucle (création du tableau NumTxt par utilisation de Application.Index):
VB:
Sub AvecTablo_2()
'par mapomme
Dim MesNum, maListe, NumTxt(), N&, i&, j&, k&
With Sheets("Feuil3")
  maListe = Range(Range("e2"), Range("f" & Range("e" & Rows.Count).End(xlUp).Row)).Value
  'N = 0: j = UBound(maListe)
  'For i = -j To -1
    'If maListe(-i, 1) > N Then N = maListe(-i, 1)
  'Next i
  'ReDim NumTxt(0 To N)
  NumTxt = Application.Index(maListe, , 2)
  'For i = 1 To j: NumTxt(maListe(i, 1)) = maListe(i, 2): Next i
  maListe = Range(Range("a2"), Range("a" & Range("a" & Rows.Count).End(xlUp).Row)).Value
  N = UBound(maListe)
  For i = 1 To N
    MesNum = Split(maListe(i, 1), ",")
    k = UBound(MesNum)
    maListe(i, 1) = ""
    For j = 0 To k
      maListe(i, 1) = maListe(i, 1) & "," & NumTxt(MesNum(j), 1) ' ici il faut préciser la dimention ,1
    Next j
    maListe(i, 1) = Mid(maListe(i, 1), 2)
  Next i
  Range("b2").Resize(N, 1) = maListe
End With
End Sub

Cordialement
 

Discussions similaires

Réponses
2
Affichages
1 K

Membres actuellement en ligne

Statistiques des forums

Discussions
312 329
Messages
2 087 335
Membres
103 520
dernier inscrit
Azise