一、快速实现中文排序
通过第25期的介绍,用户了解到SMALL函数和LARGE函数可以对数值进行升降序排列,如果用户希望对文本利用函数进行排序操作,则相对麻烦。其实根据各个字符在系统字符集中内码值的大小关系,;用COUNTIF函数也能够实现对文本数据的排序操作。
例1从二维数据表中提取商家名单
下图展示了一份股票信息表,目前左表已经按股票代码排序,下面将利用公式将股票名称进行升序排列,排序效果如图1中L列所示。
为便于用户理解,首先将股票数据B2:J11区域创建为Excel
2010的数据表,系统会自动生成一个名称:{表1}
L2单元格利用INDEX函数结合SMALL函数的排序数组公式如下:
{=INDEX($C:$C,RIGHT(SMALL(COUNTIF(INDEX(表1,,2),”<=”&INDEX(表1,,2))*100000+ROW(表1),row()-1),5))}
该公式最关键的处理技巧在于利用COUNTIF函数分别对股票名称列(即用INDEX函数从表1中取出第2列)利用ASCII码值进行大小比较,统计出<=各股票名称的个数,即是姓名文本的升序排列结果。
用户在编辑栏中选择COUNTIF(INDEX(表1,,2),”<=”&INDEX(表1,,2))公式段,并按键可查看运算结果为内存数组:{6;1;9;3;10;8;4;5;2;7}。
整个公式主要利用COUNTIF比较结果与行号组合生成新的数组,再由SMALL函数从小到大逐个取出,最后根据从RIIGHT函数提取的行号利用INDEX函数返回具体的员工姓名。
虽然用户可以直接在数据表中选择“排序”功能进行名称排序,但在某些应用环境中,需要将该数据生成为内存数组,供其他数据进行再处理,则需要借助函数公式来实现,下面将利用命名公式将上述结果生成内存数组:
=LOOKUP(--RIGHT(SMALL(COUNTIF($C$2:$C$11,”<=”&$C$2:$C$11)*100000+ROW(表1),ROW(表1)-1),5),ROW(表1),$C$2:$C$11)
注意:目前COUNTIN排序结果为按音序的升序排列,如果用户希望按降序排列,只需要将公式中”<=”&$C$2:$C$11,修改为”>=”
&$C$2:$C$11即可,或使用LARGE函数替代SMALL函数构造公式。
二、根据产品产量进行排序
例2按产品产量进行排序
如图2所示,模拟了一份某企业生产车间的钢铁生产量明细表,下面的公式将实现根据生产量进行产品类别排序。
方法1:RANK函数化零为整排序法
G2单元格产品类别数组公式如下:
{INDEX($C:$C,RIGHT(SMALL(RANK($D$2:$D$8,$D$2:$D$8)*100000+ROW($D$2:$D$8),ROW()-ROW($1:$1)),5))}
H2单元格生成产量公式如下:
=VLOOKUP($G2,$C:$D,2,)
其中,产品类别列表公式主要利用RANK函数与ROW函数重新生成内存数组,利用SMALL函数从小到大进行提取,最后利用INDEX函数按降序生成产品类别。
提示:利用RANK函数将数值化零为整地转换为 数值排名,在很多对大数值同时存在小数的排名应用中非常实用,以避免Excel的15位有效整数的位数限制。
方法2:SMALL函数和LARGE函数排名法
L2单元格产量排序公式如下:
=LARGE($D:$D,ROW()-ROW($1:$1))
K2单元格提取产品类别的数组公式如下:
{=INDEX($A:$A,SMALL(IF($E$2:$E$8=$L2,ROW($E$2:$E$8)),CUNTIF($L$2:$L2,$L2)))}
公式中最关键是利用了COUNTIF函数的混合引用的动态统计的技巧,以便于提取出相同产量的产品类别名称。具体的排序结果如图3所示。
三、多关键字排序技巧
例3按各个奖牌数量进行名次降序排列
如图4所示,展示了一份2010年新加坡青奥会奖牌榜明细表,要求使用公式按各个国家进行降序排列,排列的要求为:依次按金、银、铜牌数量进行降序排列,如果所有奖牌数均相同,则名次并列。
从表格中可以看出,虽然日本和匈牙利两个国家的金牌数相同,但银牌和铜牌数都不同,因此日本的名次应该排在匈牙利的前面。
由于各个奖牌数量都为数值,并且都是正整数,且奖牌数都没有超过2位数因此可以通过(*10^N)的方式重新建立新的数组进行比较。
首先创建命名公式是NewNum:
=$C$2:$C$17*10^10+$D$2:$D$17*10^8+$E$2:$E$17*10^6
通过对命名公式NewNum生成的内存数组进行判断,就可以实现名次的排列和部门信息的提取。
方法1:先对A列生成名次,再通过名次提取各个国家名称和奖牌数量
A3单元格的数组公式为:
{=INDEX(MMULT(N(NewNum
由于RANK函数和COUNTIF函数只支持对引用的排名,所以这里使用了“数值比较法”得出0和1的组合数组,再通过MMULT函数进行横向求和,就可以得出各数值的排名情况。
注意:由于Excel对于数值的整数部分只能保留15位有效数值,所以这个实例可以用数值比较法进行处理。但如果参与重构数组的列数更多,用户就需要考虑使用文本连接的方法来重新组合文本,再通过文本比较的方法来处理这类问题。
方法2:直接利用各奖牌数进行排名,最后查询取得奖牌数量
如H3单元格的数组公式如下:
{=OFFSET($B$2,RIGHT(SMALL(MMULT(N(NewNum
该解法也同样利用了MMULT函数的比较判断对数组进行排序的方法,将结果与数组行号重新组成新的数组,再通过SMALL函数取得对应的位置行号,最终使用OFFSET函数提取出国家名称,排序结果如图5所示。
最后在I3单元格的奖牌查询公式如下:
=VLOOKUP($H3,$B$F,5,0)
nta�6qu���