查找单元格中以逗号分隔的多个值和 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
并在进行更改后调用它(例如从“即时”窗格)。
如果有人能帮忙解决这个问题
我们称它为 sheet 1
我想在这里执行查找,我可以将 Sheet 2 中 B 列的值引入 sheet 1 中的 B 列。返回的多个值应该用逗号分隔,如下所示出色地。我在这里尝试使用 textjoin 公式,但它搞砸了,例如它将 A12 计为 A1 和 A12,从而为一个值返回 2 个值。
我可以尝试 VBA 代码,但没有太多积极的结果。
您可以使用 FILTERXML()
将每个逗号的代码拆分为我们可以通过 VLOOKUP()
处理的值数组。然后使用 TEXTJOIN()
:
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输入的。如果您有兴趣更深入地解释为什么会这样,我想向您推荐
对于 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
并在进行更改后调用它(例如从“即时”窗格)。