楼主 lrlxxqxa |
先描述一下问题:求一个排列:从103行开始B103:I103列按从小到大的顺序排列,输出的是对应的B3:I3区域的号,B3:I3是从0到7,B103:I103里有相同的时,要求相同的数按B3:I3的顺序排出,如下图所示: 11.jpg 解析一下思路:对于在一个区域中进行升序或者将序排列,我们都很熟悉了,用RANK函数可以轻松解决;但此实例中并不是返回B103:I103的顺序号,而是要求按照对应关系返回图中黄色区域(B3:I3)相对应的标识号,这就需要我们在排序时把二者联系起来;既加入黄色区域对应的标识又不影响原始区域内RANK的排序;下面分解来看: 1、因为要求是从小到大排列,所以用RANK($B103:$I103,$B103:$I103,1)求出每一个单元格在B103:I103中的顺序号,即{7,2,4,7,3,5,1,6}; 2、观察黄色区域的{0,1,2,3,4,5,6,7}有何规律;发现与COLUMN($A:$H)构建出来的{1,2,3,4,5,6,7,8}依次相差1; 3、为了让COLUMN($A:$H)这个标志不影响主题顺序,缩小100倍,即加权为COLUMN($A:$H)%; 4、利用RANK($B103:$I103,$B103:$I103,1)+COLUMN($A:$H)%进行排序,即加权后变为{7.01,2.02,4.03,7.04,3.05,5.06,1.07,6.08}; 5、要从小到大一次输入,很自然想到SMALL函数,于是在横向单元格区域中应以SMALL({7.01,2.02,4.03,7.04,3.05,5.06,1.07,6.08},1)、SMALL({7.01,2.02,4.03,7.04,3.05,5.06,1.07,6.08},2)以此类推,即公式中的SMALL(RANK($B103:$I103,$B103:$I103,1)+COLUMN($A:$H)%,J$3+1)部分; 6、最后需要排序完成后在横向的单元格区域中已经是由小到大排列了,但需要我们提取出黄色区域的标识;即小数点后第二位的加权标志; 7、因为在SMALL部分的J$3+1可以看出,加权标志是比实际的黄色区域内的对应值大1的,所以最后提取时要再减去,即RIGHT(SMALL(RANK($B103:$I103,$B103:$I103,1)+COLUMN($A:$H)%,J$3+1))-1 完整数组公式为:
|
2楼 亡者天下 |
加权排序,一个新概念啊! |
3楼 poiuyman5 |
Good |