2017-04-26 3 views
0

Je rencontre des problèmes avec une fonction définie par l'utilisateur pour faire exploser une chaîne de cellules unique en plusieurs valeurs, puis faire correspondre chacune de ces valeurs dans un index/correspondance mode, retournant une seule cellule avec une chaîne pour les valeurs correspondantes séparées par des virgules.Fonction VBA pour extraire plusieurs valeurs d'une seule cellule et index/les associer aux valeurs

Exemple:

Roles    Names   Role  Name 
role1/role2  name1,name2  role1  name1 
role1    name1   role2  name2 
role2/role3  name2,name3  role3  name3 
role1/role4  name1,name4  role4  name4 
role3/role5  name3,name5  role5  name5 

Je veux obtenir une fonction qui génère la colonne « noms » des rôles, le rôle et les colonnes Nom.

Voici mon code VBA jusqu'à présent:

Public Function RoleToName(role, roles_rng, names_rng) As String 
    Dim result As String 
    Dim s As Variant 

    For Each s In Split(role, "/") 
     ??? 
    Next s 
End Function 

Merci.

+0

On ne sait pas ce que vous voulez accomplir. Pourriez-vous montrer les résultats que vous souhaitez? –

Répondre

2
Public Function RoleToName(role, roles_rng, names_rng) As String 
    Dim result As String 
    Dim s As Variant, m, sep As String 

    For Each s In Split(role, "/") 
     'Trim each value in case of extra spaces... 
     m = Application.Match(Trim(s), roles_rng, 0) 
     If Not IsError(m) Then 
      result = result & sep & names_rng.Cells(m).Value 
     Else 
      result = result & sep & "??" '<< role not found... 
     End If 
     sep = "," 
    Next s 
    RoleToName = result 
End Function 
+0

Merci, c'est exactement ce dont j'avais besoin! –

0

Essayez comme,

Function udf_CollateNames(roles As String, tbl As Range, _ 
          Optional roleSplit As String = "/", _ 
          Optional delim As String = ",") 
    Dim v As Long, vVALs As Variant 

    vVALs = Split(roles, roleSplit) 

    For v = LBound(vVALs) To UBound(vVALs) 
     If Not IsError(Application.Match(Trim(vVALs(v)), tbl.Columns(1), 0)) Then _ 
      udf_CollateNames = udf_CollateNames & delim & Application.VLookup(Trim(vVALs(v)), tbl, 2, False) 
    Next v 

    udf_CollateNames = Mid(udf_CollateNames, Len(delim) + 1) 
End Function 

enter image description here