Excel O365多列数组查找时TEXTJOIN搭配UNIQUE无法去重如何解决
Excel O365多列匹配返回唯一值解决方案
问题原因
原有公式在多列场景下无法去重的核心原因是:
当查找区域为多列时,IF 函数会返回和查找区域维度一致的二维数组(示例中为35行4列结构),UNIQUE 函数默认按行维度做去重判断,不会自动把二维数组的所有值摊平后统一去重,因此达不到预期效果。仅当查找区域为单列时,IF 返回一维数组,UNIQUE 才能正常工作。
可用解决方案
方案1(推荐,O365 2022及以后版本通用)
借助TOCOL函数把二维数组转成一维单列后再去重,公式如下:
=TEXTJOIN(", ",TRUE,UNIQUE(TOCOL(IF('Sheet1'!C$2:F$36=$B2,'Sheet1'!$A$2:$A$36,NA()),2)))
各部分逻辑说明:
IF部分保留原有匹配逻辑,将匹配不到的结果返回NA()而非空文本,方便后续过滤TOCOL(...,2)负责把二维数组转换为单列,同时自动过滤所有错误值(即匹配失败的NA结果)UNIQUE对转换后的一维数组做去重处理,可正常输出唯一值- 最后由
TEXTJOIN按要求用逗号加空格拼接结果,自动忽略空值
方案2(兼容无TOCOL的旧版O365)
如果你的O365版本没有更新TOCOL函数,可以用MMULT做行匹配判断:
=TEXTJOIN(", ",TRUE,UNIQUE(FILTER('Sheet1'!$A$2:$A$36,MMULT(--('Sheet1'!C$2:F$36=$B2),SEQUENCE(COLUMNS('Sheet1'!C$2:F$36),,1,0))>0)))
逻辑说明:
MMULT会对每一行的多列匹配结果求和,返回值大于0即代表该行至少有一列匹配到$B2的值FILTER根据求和结果过滤出符合要求的$A列值,再经UNIQUE去重后拼接即可
内容的提问来源于stack exchange,提问作者JLK
相关产品推荐
相关产品推荐

