用countif实现对文本排序的效果
小伙伴们,大家好。今天来学习下如何用函数实现对文本的排序,主要用的是countif函数。还是看一个例子。
1.以姓名为关键字进行升序排序
如下图所示,将左表变为右表,F列是姓名的首字母,是我自己添加的,为了方便大家比较。如果用基础操作来完成,十分简单,点下排序就可以了。如果用函数来实现呢?还是有点小小的困难。我们之前的文章说过对数字的排序,今天就在那个的基础上说说对文本的排序。首先要把文本变为数字,并且数字要代表文本的排名大小,然后再按对数字排序的思路完成就可以了。
在D3单元格输入公式=INDEX(A:A,MOD(SMALL(COUNTIF($A$3:$A$12,"<="&$A$3:$A$12)/1%+ROW($3:$12),ROW(A1)),100)),按ctrl+shift+enter三键结束,向右向下填充,完成。
先来看=COUNTIF($A$3:$A$12,"<="&$A$3:$A$12)这部分,返回的结果如下图C列所示,意思就是在$A$3:$A$12这个区域中统计,小于等于"吴云"的有几个;小于等于"吴力杰"的有几个;小于等于"曾海山"的有几个,...以此类推。因为第2参数是个数组,所以就相当于对每个姓名计算一次。得到的结果是按最小值的顺序排序的,比如8代表的是第8个最小值,1代表的就是第1个最小值。因为我们是按升序排序,所以要得到的第1个姓名是1对应的"曾海山"。
=COUNTIF($A$3:$A$12,"<="&$A$3:$A$12)/1%+ROW($3:$12)这部分是用上一步排名的结果乘以100再加上对应的行号,结果如下图C列所示。这样的话就把排名和行号结合起来了,比如"曾海山"对应的105代表的意思是第1个最小的姓名在第5行。接下来我们就要依次提取第1个最小值,第2个最小值,。。。一直提取完。
=SMALL(COUNTIF($A$3:$A$12,"<="&$A$3:$A$12)/1%+ROW($3:$12),ROW(A1))这部分就是用small提取出上一步的第1个最小值105,公式下拉,提取第2个最小值210;再下拉提取第3个最小值307,。。。一直提完。这样的话姓名就是按从小到大的顺序排列的。接下来就是从名次和行号组合的数字中取出行号,也就是后2位数字。
=MOD(SMALL(COUNTIF($A$3:$A$12,"<="&$A$3:$A$12)/1%+ROW($3:$12),ROW(A1)),100)这部分就是用mod除以100取出行号,当然你也可以用right从右边取出2位。再下来就是用index返回对应行列的内容。
=INDEX(A:A,MOD(SMALL(COUNTIF($A$3:$A$12,"<="&$A$3:$A$12)/1%+ROW($3:$12),ROW(A1)),100))这部分就是用index返回A列对应的内容。如下图C列所示,这样就得到了升序排序的姓名。公式右拉得到了B列对应的部门。
还有一点要说明的是,它不能识别出多音字,比如"曾海山"应该是读zeng,它识别为ceng。手工点击排序也不能识别多音字,大家可以通过手工排序的方式来验证下公式的结果是否正确。另外,如果以姓名为关键字进行降序排序又该如何做呢?大家可以想一下。
文件链接:
https://pan.baidu.com/s/18Ja1IDz0OcP8cAMiTIer5Q
提取码:s6l2