查找单元格中以逗号分隔的多个值和 return 个以逗号分隔的多个值

Lookup multiple values separated by a comma in a cell and return multiple values separated by a comma

如果有人能帮忙解决这个问题

我们称它为 sheet 1

我想在这里执行查找,我可以将 Sheet 2 中 B 列的值引入 sheet 1 中的 B 列。返回的多个值应该用逗号分隔,如下所示出色地。我在这里尝试使用 textjoin 公式,但它搞砸了,例如它将 A12 计为 A1 和 A12,从而为一个值返回 2 个值。

我可以尝试 VBA 代码,但没有太多积极的结果。

您可以使用 FILTERXML() 将每个逗号的代码拆分为我们可以通过 VLOOKUP() 处理的值数组。然后使用 TEXTJOIN():

将 returned 数组连接回逗号分隔的字符串

E2中的公式:

=TEXTJOIN(",",,VLOOKUP(FILTERXML("<t><s>"&SUBSTITUTE(D2,",","</s><s>")&"</s></t>","//s"),A:B,2,0))

其中:

  • "<t><s>"&SUBSTITUTE(D2,",","</s><s>")&"</s></t>" - 创建一个有效的 XML 字符串,用 start/end 标签替换逗号。
  • "//s" - return 所有 s 节点的有效 XPATH。

注意:如果您使用的是Excel 2019,这应该是通过CSE输入的。如果您有兴趣更深入地解释为什么会这样,我想向您推荐 older post.

对于 VBA 解决方案,如果您的翻译不经常更改,您可以填充词典(通过 Tools 添加参考 -> 参考... Microsoft Scripting 运行time) 来保存翻译。

然后你可以传入单元格的值,拆分它,return每个部分对应的翻译:

Dim dict As Dictionary

Function Translations(s As String) As String
    If dict Is Nothing Then
        Set dict = New Dictionary

        Dim arr() As Variant
        arr = Worksheets("Sheet1").Range("A1:B25").Value
        
        Dim rowCount As Integer
        rowCount = UBound(arr, 1)
    
        Dim row As Integer
        For row = 1 To rowCount
            dict(arr(row, 1)) = arr(row, 2)
        Next
    End If

    Dim temp() As String ' holds both the keys from the current input, and the results
    temp = Split(s, ",")
    
    Dim ubnd As Integer
    ubnd = UBound(temp)
    
    Dim i As Integer
    For i = 0 To ubnd
        Dim key As String
        key = temp(i)
        If dict.Exists(key) Then
            temp(i) = dict(key)
        Else
            temp(i) = ""
        End If
    Next
    
    Translations = Join(temp, ",")
End Function

您可以从这样的单元格中调用它:

=Translations(A1)

请注意,为了提高效率,字典不会在每次函数调用时重新创建,而是存储在内存中。因此,如果您的翻译发生变化,您将需要重置词典。这可以通过多种方式完成:

  • 关闭并重新打开工作簿

  • 在 VBA 编辑器中,单击 运行 -> 重置菜单

  • 写一个专门的清除字典的方法:

    Sub ClearDict
        Set dict = Nothing
    End Sub
    

    并在进行更改后调用它(例如从“即时”窗格)。