INDEX Match à partir d'un texte concaténé

Bonjour,

J'ai une table excel et dans chaque ligne j'ai un champ (UserID) contenant un nombre indéterminé d'identifiants, délimités par une virgule.
J'aimerais pouvoir obtenir dans le champ d'à côté (UserLabel), les noms correspondants aux IDs également séparés par une virgule.

Vu que je suis au milieu de mon tableau j'aimerais ne pas avoir à utiliser de colonne intermédiaire et si possible éviter le VBA.

tbl_Data

...UserIDUserLabel...
...ID0001,ID1234,ID6532John, Alfred, Lucy...
...ID6532Lucy...

tbl_Users

UserIDUserLabelUserGroup...
ID0001John......
............
ID1234Alfred......
ID6532Lucy......

Si je n'avais qu'une seule valeur dans le champ 'UserID', j'utiliserais la formule suivante (ou bien un INDEX/MATCH...):

TEXTJOIN(", ";TRUE;IF(tbl_Users[UserID]=[@[UserID]];tbl_Users[UserLabel];""))

Mais je ne sais pas comment parser les valeurs concatenées pour les utiliser dans une formule. Qu'en pensez-vous ?

Rudy.

Bonjour,

Je ne connais pas 365 donc j'ignore peut-être certaines solutions mais à première vue, ça me semble compliqué sans VBA.

Je vous propose d'essayer avec ces 3 fonctions personnalisées :

Function INDEXX(tableau As Range, position As Variant)

Dim temp()

pos = Application.Transpose(position)

For i = LBound(pos) To UBound(pos)
    ReDim Preserve temp(i - 1)
    temp(i - 1) = Application.Index(tableau, pos(i))
Next i

INDEXX = Application.Transpose(temp)

End Function

Function SPLITER(chaine, sep$)
SPLITER = Application.Transpose(Split(chaine, sep))
End Function

Function JOINDRE$(tableau As Variant, sep$)
JOINDRE = Join(Application.Transpose(tableau), sep)
End Function

qui seraient à associer ainsi sur feuille :

=JOINDRE(INDEXX(tbl_Users[UserLabel];EQUIV(SPLITER([@UserID];",");tbl_Users[UserID];0));" - ")

Le tout en matriciel (validé par ctrl + shift + enter).

Cdlt,

10join-index.xlsm (15.83 Ko)

bonjour

sans vba sur le fichier de 3GB

cordialement

12tetich.xlsm (16.43 Ko)

Bonjour !

@tulip_4 merci pour la proposition mais j'ai besoin d'une solution qui fonctionne pour un nombre variable d'input

@3GB, merci beaucoup, le code est très propre et semble bien fonctionner ! Il y a juste l'utilisation du transpose que je ne comprend pas très bien

Bonjour,

Il manquait une solution Power Query !?

Cdlt.

11tetich.xlsx (19.22 Ko)

Bonjour Thetisch,

Le Transpose permet comme son nom l'indique de transposer, d'inverser, d'intervertir les lignes avec les colonnes et inversement, et ici en l'occurrence de transformer les vecteurs ligne (de VBA) en vecteur colonne (pour excel).

En fait, je voulais à tout prix renvoyer des vecteurs colonne en pensant que sinon ça pourrait causer un blocage, surtout dans la fonction INDEXX. Mais je viens de tester et de m'apercevoir qu'on peut très bien faire sans finalement . Merci d'avoir soulevé ce point, ça me permet d'en découvrir sur des aspects que j'essaie d'appréhender.

Et bien, dans ce cas, voici les codes modifiés :

Function INDEXX(tableau As Range, position As Variant)

Dim temp()

For i = LBound(position) To UBound(position)
    ReDim Preserve temp(i - 1)
    temp(i - 1) = Application.Index(tableau, position(i))
Next i

INDEXX = temp

End Function

Function SPLITER(chaine$, sep$)
SPLITER = Split(chaine, sep)
End Function

Function JOINDRE$(tableau As Variant, sep$)
JOINDRE = Join(tableau, sep)
End Function

Edit : Et j'ai aussi l'impression que la fonction JOINDRE ne vous sert à rien puisque vous avez déjà TEXTJOIN. Pouvez-vous essayer avec :

=TEXTJOIN(", ";TRUE;INDEXX(tbl_Users[UserLabel];MATCH(SPLITER([@UserID];",");tbl_Users[UserID];0)))

Cdlt,

Merci @Jean-Eric, j'aime beaucoup la solution en powerquery ! Par contre j'ai quelques soucis pour l'utiliser dans ma sheet qui contient un nombre important d'autres colonnes (qui ne doivent pas être impactées) par les unpivot/group by. Un conseil à ce sujet ?

Bonjour,

@thetish,

Sans information complémentaire, il va être difficile de t'apporter une aide adaptée !...

Cdlt.

Bien sûr !

En fait la query sur laquelle je travaille possède plus de données, quelque chose comme ceci :

image

Et donc lorsque le 'unpivot' et le 'remove column' sont fait des données sont perdues. J'ai résolu le souci en utilisant 2 queries distinctes mais je n'en suis pas très heureux.

Rudy.

C'est ok, j'ai compris ce que je devais sélectionner au moment du "unpivot" et du "group by"

Rechercher des sujets similaires à "index match partir texte concatene"