【问题标题】:Lookup multiple values separated by a comma in a cell and return multiple values separated by a comma在单元格中查找以逗号分隔的多个值并返回以逗号分隔的多个值
【发布时间】:2021-03-10 19:10:41
【问题描述】:

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

我们称这张表为 1

我想在这里进行查找,我可以将表 2 中的 B 列中的值带入表 1 中的 B 列。返回的多个值也应该用逗号分隔。我在这里尝试过使用 textjoin 公式,但它搞砸的地方是例如它将 A12 计为 A1 和 A12 从而为一个值返回 2 个值。

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

【问题讨论】:

  • 如果您有任何代码要包含,那么这将是减少您的问题被关闭的机会的好方法......

标签: excel vba excel-formula lookup


【解决方案1】:

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

E2中的公式:

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

地点:

  • "&lt;t&gt;&lt;s&gt;"&amp;SUBSTITUTE(D2,",","&lt;/s&gt;&lt;s&gt;")&amp;"&lt;/s&gt;&lt;/t&gt;" - 创建一个有效的 XML 字符串,用开始/结束标签替换逗号。
  • "//s" - 返回所有 s 节点的有效 XPATH。

注意:如果您使用的是 Excel 2019,则应通过 CSE 输入。如果您有兴趣更深入地解释它的工作原理,我想推荐您参考 this 较早的帖子。

【讨论】:

    【解决方案2】:

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

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

    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
      

      并在更改完成后调用它(例如,从“立即”窗格中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多