问:在某些情况下,我们可能需要计算带有分隔符的字符串中非重复子字符串的数量。如下图,我想知道单元格A1中有多少数字没有重复,公式怎么写。
答:下面的数组公式可以完成单元格A1的字符串非重复值的统计:
=SUM(N(MATCH(TRIM(MID(SUBSTITUTE(A1,",",",retp(",999))))、ROW(inquisitive(" 1: " LEN(A1)-LEN(SUBSTITUTE(A1,",","))1))))* 999-998,999(TRIM(MID(SUBSTITUTE(A1,",",",")))))))))、ROW(inquisitive(" 13: " LEN(A1)-LEN(SUBSTITUTE(A1,",",","))1))*999-998,999)
结果是6。注意,输入公式后,按Ctrl+Shift+Enter。
公式分析
这么长的公式可能一看就吓到了。让我们看看这个复杂的公式是怎么来的。
上述公式可以简化为:
=SUM(N(MATCH(单元格中的子字符串数组,单元格中的子字符串数组),=连续数字的数组))。
其中,在一个单元格中生成由子字符串组成的数组的公式为:
TRIM(MID(SUBSTITUTE(A1,",",",REPT(",999))),ROW(INDIRECT(" 1: " LEN(A1)-LEN(SUBSTITUTE(A1,",",")))1))*999-998,999))
行(间接(“1:”len(a1)-len(替换(a1,“、”、“)”)1))获取从1到子字符串数的连续数字。在本例中,单元格中的子字符串数组为:
{"1;"2;"3; "1;"2; "3;"4; "5;"6"}
上面的数组被用作MATCH函数的参数。找到每个子串在上面数组中出现的位置,得到下面的数组:
{1;2;3;1;2;3;7;8;9}
在公式中:
行(间接(“1:”LEN(A1)-LEN(替换(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;如果位置不一致,说明子串之前已经出现过,是重复值,比较结果为FALSE。
n函数将上述布尔数组转换为由和1组成的数组:
{1;1;1;1;1;1}
数组中元素的总和是不同值的数量。