打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何统计带分隔符的字符串中不重复的子字符串数?

Q某些情况下,我们可能要统计带有分隔符的字符串中不重复的子字符串数。如下图1所示,我想知道单元格A1中不重复的数字有几个,应该怎么编写公式?

1

A下面的数组公式可以完成单元格A1的字符串不重复值的统计:

=SUM(N(MATCH(TRIM(MID(SUBSTITUTE(A1,",",REPT("",999)),ROW(INDIRECT("1:" &LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))*999-998,999)),TRIM(MID(SUBSTITUTE(A1,",",REPT("",999)),ROW(INDIRECT("1:" &LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))*999-998,999)),0)=ROW(INDIRECT("1:"& LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))))

结果为6。注意,公式输入完成后要按下Ctrl+Shift+Enter组合键。

数据分析实战

作者:(美)托马兹·卓巴斯(Tomasz Drabas)

当当

公式解析

这么长的公式,一看到可能被吓着了,让我们来看看这个复杂的公式是怎么得来的。

上面的公式可以简化为:

=SUM(N(MATCH(单元格中的子字符串组成的数组单元格中的子字符串组成的数组,0)=连续数字组成的数组))

其中,生成单元格中的子字符串组成的数组的公式:

TRIM(MID(SUBSTITUTE(A1,",",REPT("",999)),ROW(INDIRECT("1:" &LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))*999-998,999))

其原理详见《Excel实用公式4:从分隔符连接的字符串中提取子字符串》中的讲解。ROW(INDIRECT("1:"& LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))获得从1至子字符串个数的连续数字。本例中,单元格中的子字符串组成的数组为:

{"1";"2";"3";"1";"2";"3";"4";"5";"6"}

上述数组作为MATCH函数的参数,查找每个子字符串在上面数组中出现的位置,得到下面的数组:

{1;2;3;1;2;3;7;8;9}

公式中的:

ROW(INDIRECT("1:"& LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))

生成由连续的数字组成的数组:

{1;2;3;4;5;6;7;8;9}

上面生成的两个数组进行比较:

{1;2;3;1;2;3;7;8;9}={1;2;3;4;5;6;7;8;9}

得到由布尔值组成的数组:

{TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE}

其中的TRUE表明是不重复的值,FALSE表明值出现的重复。因为不重复值出现的位置应该与其在子字符串中的位置一致,也就是说比较的结果为TRUE;如果位置不一致,则前面已经出现过该子字符串,即为重复值,比较的结果为FALSE

N函数将上述布尔值数组转换成由01组成的数组:

{1;1;1;0;0;0;1;1;1}

数组中元素之和即为不重复的值的个数。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数组公式提取单元格内第一个汉字前的字符串
将带分隔符的字符串拆分成数组的Excel通用公式
Excel 2019新增的这些函数,用处到底有多大,试试就知道
Excel这3个函数太强大了,这些高级用法你都会吗?
8个必会的高效提取数字法
mid函数不简单,这四个高级用法,你会吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服