如何解决Excel如何在没有VBA的情况下从逗号分隔的列表中查找与元素匹配的所有行
这是我的问题,我有一个包含两列的表:产品参考和相应的通知ID:
| A | B | C | D |
---------------------------------------
1| Product | Notice | | |
2| p1 | n1 | | |
3| p2 | n2 | | |
4| p3 | n3 | | |
5| | | | |
6| | | p1,p3 | =... |
(编辑:在我的实际应用中,“产品参考”和“通知ID”列不在旁边,但由其他列隔开)
在另一个单元格(例如C6)中,我有一个逗号分隔的产品参考列表,假设p1,p3
,并且我需要一个公式来输出相应的通知ID,例如n1,n3
,在D6单元格中。
重要:出于不同的原因,我不能使用VBA ,我需要一个标准的excel数组公式。
这是我目前能做的:
-
使用
FILTERXML
函数,我可以将逗号分隔的列表拆分为一个数组:FILTERXML("<t><s>" & SUBSTITUTE(C6,","</s><s>") & "</s></t>","//s")
-
使用
TEXTJOIN
函数,我可以将数组合并为字符串。 -
我可以使用
INDEX
和MATCH
函数的组合来提取单个匹配项,例如:
=IF(ISERROR(MATCH("p3"; A:A; 0)); "not found"; INDEX(B:B; MATCH("p3"; A:A; 0)))
(这对我没有用,因为A列中的引用也是唯一的)
(顺便说一下,如果找不到匹配项,我不知道是否有更好的方法来处理MATCH
引发的错误)
- 我可以使用以下方式提取B列的元素,并将其与A列中的单个引用的多个匹配项结合在一起:(用Ctrl + Shift + Enter激活的数组公式):
{=TEXTJOIN(","; TRUE; IF(A:A="p2"; B:B; ""))}
(这对我没有用,因为A列中的引用也是唯一的)
总结:我可以找到多个匹配项并将其合并到一个引用中,但是我无法找到一个唯一匹配项并将其合并到多个引用中(我想做的事)。
尝试失败
我试图以不同的方式混合使用以前的公式来获得所需的结果,但是都失败了,并出现了错误。
- 结合1、2和4(在布尔匹配数组上使用
OR
)
{=TEXTJOIN(","; TRUE; IF(OR(A:A=FILTERXML("<t><s>" & SUBSTITUTE(C6,"//s")); B:B; ""))}
或(在布尔匹配数组上使用SUM
)
{=TEXTJOIN(","; TRUE; IF(SUM(A:A=FILTERXML("<t><s>" & SUBSTITUTE(C6,"//s")); B:B; ""))}
在这里,我不确定如何处理IF
(列A和FILTERXML
给出的引用列表)中考虑的不同数组。
- 结合1、2和3:
{=TEXTJOIN(","; TRUE; INDEX(B:B; MATCH(FILTERXML("<t><s>" & SUBSTITUTE(C6,"//s"); A:A; 0)))}
在这里,我不确定如何再次处理(i)所考虑的不同数组(列A和FILTERXML
给出的引用列表),(ii)MATCH
引发的错误如果找不到匹配项,则(iii)将数组引用传递给INDEX
函数。
解决方法
好问题。如果您只有Excel 2019,则可以选择:
E1
中的公式:
=TEXTJOIN(",",IFERROR(VLOOKUP(FILTERXML("<t><s>"&SUBSTITUTE(D1,"</s><s>")&"</s></t>","//s"),A:B,2,FALSE),""))
如果您有Excel O365,则可能:
=TEXTJOIN(",XLOOKUP(FILTERXML("<t><s>"&SUBSTITUTE(D1,A:A,B:B,"",0))
,
尝试:
=TEXTJOIN(",TRUE,VLOOKUP(FILTERXML("<t><s>" & SUBSTITUTE(C6,tblProd[[Product]:[Notice]],COLUMNS(tblProd[[Product]:[Notice]]),FALSE))
我使用了表和结构化引用,尽管如果确实需要可以将其更改为常规寻址,但是我认为使用表和自动调整引用,将更易于维护。
由于您不知道Product
列与Notice
列之间的距离,因此我构造了一个数组,并使用{获得了Column Number
的{{1}}自变量{1}}功能
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。