[区间序号]填充很哇塞,小李看后把门踹 #excel
群友求助SOS:Excel如何按条件,将序号以区间的形式进行快速填充?
单凭这个简单的描述,我们想象不到具体的应用场景,下面我们用几组简单的数据模拟还原真实的办公情形。
如下图所示:
A列为一列序号,B列为序号对应的名称。我们发现这样的一个规律:A列的序号并不一定是连续的,但是相同名称所对应的序号区间肯定是连续的。
我们想要做的就是:
将D列所有不同的名称,对应的A列的序号区间显示在E列。序号区间的格式为:“起始序号~结束序号”的模式。
着手解决这个问题之前呢,小编建议先对数据源做一个以“名称”为主要关键字,“序号”为次要关键字的全部“升序”排序。可以用常规排序法,也可以使用sortby排序函数。
因为本例中,这位朋友给出的数据源就是已经排序后的效果,所以可以忽略此步骤。直接进入常规解题流程了:
第一步:去重确定名称列
使用简单高效的UNIQUE去重函数:
=UNIQUE(B2:B9)
省略第2参数,表示去重后的数据按行显示,省略第3参数,表示返回去重后唯一值列表。
第二步:筛选
使用常见强大的FILTER筛选函数:
=FILTER(A$2:A$9,B$2:B$9=D2)
当固定区域B$2:B$9中的名称与D2单元格名称相同时,我们筛选并返回相同名称左侧区域A$2:A$9中对应的序号。
有一些函数基础比较薄弱的朋友总是会问:
为啥此时我下拉填充公式会出现乱码?
原因就是FILTER函数返回筛选结果本身默认是纵向分布的,如果此时强硬下拉填充公式,那么当前公式单元格的下一个单元格都会纵向输出新的数据,导致遮挡住当前单元格公式的返回结果,故产生乱码。
如果还不明白,你可以手动向E3单元格随意输入内容,那么这个内容会遮挡住E2单元格FILTER函数的返回结果,故 #SPILL产生了。
当然了,利用TOROW函数,将FILTER函数的返回结果转置为横向的:
=TOROW(FILTER(A$2:A$9,B$2:B$9=D2),3)
那么后续就可以随意的下拉填充公式了。无遮挡后顾之忧。
第三步:确定区间极值
利用常常被我们忽略但很实用的TAKE函数:
=TAKE(TOROW(FILTER(A$2:A$9,B$2:B$9=D2),3),,{1,-1})
TAKE函数属于数组函数。在Excel和WPS表格中,TAKE函数主要用于从数组或区域中提取指定数量的行或列。
其语法为:
=TAKE(array, rows, [columns])
其中,array是要从中获取行或列的数组;rows是要获取的行数,正数从开头取,负值从末尾取;columns是要获取的列数,正数从左边取,负值从右边取。
有意思的是:
TAKE函数获取指定数量的行或列数据时,可以同时获取多行或多列,可以利用第3参数取列数据,用数组思维{1,-1},表示同时提取上一步返回结果中的第1列与倒数第1列。所以区间的最小值与最大值就这样确定了。
第四步:单极值处理
我们不要忘了,名称对应的序号可能就只有1个,比如名称D,对应的序号只有12,那么通过上述公式得到的序号区间范围为:12,12。
我们要想只留下一个不重复的12,需要再次使用UNIQUE去重:
=UNIQUE(TAKE(TOROW(FILTER(A$2:A$9,B$2:B$9=D2),3),,{1,-1}),TRUE)
第2参数设置为TRUE表示输出的去重结果按列显示。
第五步:合并
使用职场高频函数TEXTJOIN:
=TEXTJOIN("~",,UNIQUE(TAKE(TOROW(FILTER(A$2:A$9,B$2:B$9=D2),3),,{1,-1}),TRUE))
用间隔符“~”将两个极值(区间最小值与区间最大值)合并到一个单元格中显示。