VBA函数,用于从单个单元格中提取多个值并将其索引/匹配到值

VBA函数,用于从单个单元格中提取多个值并将其索引/匹配到值,vba,indexing,split,match,explode,Vba,Indexing,Split,Match,Explode,用户定义的函数无法将单个单元格字符串分解为多个值,然后以索引/匹配方式匹配这些值中的每一个,并返回单个单元格,其中包含由逗号分隔的匹配值字符串 例如: Roles Names Role Name role1/role2 name1,name2 role1 name1 role1 name1 role2 name2 role2/role3 name2,n

用户定义的函数无法将单个单元格字符串分解为多个值,然后以索引/匹配方式匹配这些值中的每一个,并返回单个单元格,其中包含由逗号分隔的匹配值字符串

例如:

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
我想得到一个函数,该函数从Roles、Role和Name列生成“names”列

以下是迄今为止我的VBA代码:

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
谢谢。

公共函数RoleToName(角色,角色,名称)作为字符串
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
将结果变暗为字符串 Dim s作为变量,m、sep作为字符串 对于拆分中的每个s(角色“/”) '如果有多余的空格,请修剪每个值。。。 m=应用程序匹配(修剪,角色,0) 如果不是IsError(m),则 结果=结果和分离&名称\u rng.Cells(m).Value 其他的 result=result&sep&“??”
Public Function RoleToName(角色、角色、名称)作为字符串
将结果变暗为字符串
Dim s作为变量,m、sep作为字符串
对于拆分中的每个s(角色“/”)
'如果有多余的空格,请修剪每个值。。。
m=应用程序匹配(修剪,角色,0)
如果不是IsError(m),则
结果=结果和分离&名称\u rng.Cells(m).Value
其他的
result=result&sep&“??”试一下

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

试试看

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

不清楚你想要完成什么。你能展示一下你想要的结果吗?不清楚你想要实现什么。你能展示一下你想要的结果吗?谢谢,这正是我需要的!谢谢,这正是我需要的!