如何用函数在不同部门间插入空行?

-01-

案例说明

下图A列是数据源,记录的是各个部门,相同的部门是排在一起的。现在的要求是在不同部门间插入一个空行,结果如D列所示。

如果你遇到这个问题会怎么做,可以先想一下,再往下看。

……

-02-

函数解析

先不说函数公式怎么写,先来观察下数据的规律。实际上,我们是在相同部门的最后一个格子后插入空行,而最后这个格子和它下面的一个格子是不同的部门,这样就找到了插入空行的位置。

虽然找到了位置,但如何插入空行呢?实际上我们需要一个二维数组,因为一个维度是不够用的。过程是依次把每个部门提取出来,到了该插入空行的位置时,通过二维数组的第二维补一个空行。
这样说比较抽象,下面还是看公式的解析过程吧。在D2单元格输入下面的公式,按ctrl+shift+enter,向下填充。

=IFERROR(INDEX(A:A,RIGHT(SMALL(IF(N(A$2:A$11<>A$3:A$12)>={0,1},ROW($2:$11)+{0,99}%),ROW(A1)),2))&"","")

A$2:A$11<>A$3:A$12这部分用A2:A11和它下面错位一个格子的区域A3:A12做不相等的比较,返回的结果如下图所示。可以看到在相同部门最后一个格子的位置返回true,找到了插入空行的位置。
N(A$2:A$11<>A$3:A$12)这部分用n函数将上一步的逻辑值true转化为1,逻辑值false转化为0。结果如下:
N(A$2:A$11<>A$3:A$12)>={0,1}这部分比较重要,是为了得到二维数组。判断上一步的结果是否大于等于{0,1},返回的结果如下:可以看到二维数组的第一列全部是true,是用来返回A列的部门;第二列中的true,是用来在相同部门的最后一个格子后补空行的。具体是如何返回结果的,往下看。
IF(N(A$2:A$11<>A$3:A$12)>={0,1},ROW($2:$11)+{0,99}%)这部分是为了得到相应数据的行号,用if函数对上一步的结果进行判断,如果成立,返回第2参数相应的数字,否则返回false。结果如下:可以看到第一列返回数据的行号,第二列插入空行的位置返回当前的行号加上0.99。
SMALL(IF(N(A$2:A$11<>A$3:A$12)>={0,1},ROW($2:$11)+{0,99}%),ROW(A1)这部分用small函数从上一步的结果中,按从小到大的顺序依次提取每个数字,结果如下图E列所示:
RIGHT(SMALL(IF(N(A$2:A$11<>A$3:A$12)>={0,1},ROW($2:$11)+{0,99}%),ROW(A1)),2)这部分用right函数从上一步的结果中截取右边2位,结果如下:到这里大家应该能看出来了,实际上是在补空行的位置让它返回第99行,因为第99行现在是空单元格。
INDEX(A:A,RIGHT(SMALL(IF(N(A$2:A$11<>A$3:A$12)>={0,1},ROW($2:$11)+{0,99}%),ROW(A1)),2))&""这部分用index返回A列相应行的数据,最后连接空文本是为了不显示空单元格的0。结果如下:

最后,用iferror处理下错误值就可以了。

文件链接:

https://pan.baidu.com/s/1B9z0WohhO7LooWF90u9mkQ

提取码:i8id
(0)

相关推荐