楼主 悟空师弟 |
Q:如下图:在A列中如果相同,且挨着的就合并起来,合并后如C列状态,怎么用函数来解决? A:数组公式:
如何合并相同内容.rar 解题思路: “相同,且挨着的”即“与上一单元格数据相同”,C列的结果是提取这些“相同,且挨着的”但要去掉重复数据并计算出有多少个“挨着的”进行组合。 1、首先计算数量:不难看出,每一个“相同,且挨着的”数量刚好等于下一个“挨着的且不同”的行号减去上一个“挨着的且不同”的行号,比如A2、A3是连续两个A,用第3行的行号减第1行的行号可以得到,(或用第4行的行号减第2行的行号),算法为:将“挨着的且不同”和行号取出,公式:IF($A$1:$A$17<>$A$2:$A$18,ROW($1:$17),18)可得到一个数组{1;18;3;18;5;18;18;8;18;18;18;18;13;18;15;18;18},此数组中 3-1=2 5-3=2 8-5=3 13-8=5 15-13=2 18-15=3 这6个结果正好是所需要的6个数量,可用SMALL函数逐个取出。 如下图解析: 2、再取文本:同理,按“挨着的且不同”的规律,用SMALL函数依次取出{1;18;3;18;5;18;18;8;18;18;18;18;13;18;15;18;18}中所需行号(1,3,5,8,13,15,18 ……)作为INDEX第二个参数,当取到第7个以后的最小值皆为18,而INDEX第一个参数中的区域A$2:A$18只有17行,出现错误值,可用IFERROR函数纠错。 如下图解析: 说明:公式通过简化,公式中 SUM(SMALL(IF($A$1:$A$17<>$A$2:$A$18,ROW($1:$17),18),ROW(1:2))*{-1;1}) 改为以下公式(即直观算法,以第2个最小值减第1个最小值类推)较易懂: SMALL(IF($A$1:$A$17<>$A$2:$A$18,ROW($1:$17),18),ROW(A2))-SMALL(IF($A$1:$A$17<>$A$2:$A$18,ROW($1:$17),18),ROW(A1)) 公式解析详见下面附件: 如何合并相同内容-公式解析.rar |
2楼 無心 |
来学习一下, |