|
|
楼主你看看,这样是否可以
应该说楼主表达的信息还是非常工整详尽的,这个题也不难,繁琐度也一般。我分享一下其中的思路吧。
在电子线路中我们使用传感器将各种物理量转换为电量,因为电子器件不能对物理量直接识别、操作或运算,所以传感器起到了转换的作用。我们EXCEL函数公式最擅长处理的是数值,所以我们的思路就是想方设法将各种信息转化为数值。这里提到了优先级的问题,语文>数学>英语...怎么把这种优先级转化为数值呢?呵呵,其实只要大家想到要把这些信息量转换为数值,那么整个思路就出来了。我们把语文的成绩放在 数值的高位,数学的次之,英语再次之...好在7个科目,如果为每个科目分配两位数字那么需要 14位,正好在Excel的数值精度范围内(超过15位的数字以0填充,比如身份证18最后只三位会变成0)。
不管最后的公式到底长的如何,我们把每位同学的成绩转换为排序的依据一定不会有错。于是,先把所有注意力集中在这一点上就可以了。考虑成绩会出现100分(三位数字),又会出现空单元格(0),这个比较头疼,我们可以先预处理,如果不是0,那么原始分数-1(破解三位的数字问题),如果是0的,那么可以保持0,我在公式用了1,现在想想应该用0更合适。
考虑到分数可能出现个位数(从严谨性考虑,我当然希望他能考的好点),所以为了严格的给每科成绩分配数字的位数,我使用了TEXT(数值,"00")强制以两位显示,否则会影响优先级。
所以成绩转换为排序依据的公式大致为:TEXT(IF(语文成绩组,语文成绩组-1,0),"00") & TEXT(IF(数学成绩,数学成绩-1,0),"00")&...& ...记为公式1
因为这是个文本,所以最后需要将其转换为数值,所以可以做一个处理 --公式1.
最后如果成绩完全相同依然需要区分出来,那么就需要把位置信息(行号)也考虑进去,很显然位置信息是最微不足道的,优先级最低,所以我使用了 0.01*row(区域)。
所以最后的排序依据数组得到了,我们记为 成绩加行号。
最后是排名,这个可以对原始区域整行整行拍,也可以完成对姓名的排名,然后VLOOKUP完善一下各科的成绩也行。附件是对整行排名的,这里我就简单讲一下对姓名的排名吧。
不管怎么说,公式应该是从 一列姓名中返回满足条件的那个姓名。于是可以使用INDEX,第一参数就是那个姓名的列区域,于是关键是 提取位置信息。比如第一名在姓名列中的位置信息,这个我们可以通过 成绩加行号 中最大的那个LARGE(成绩加行号,1),在成绩加行号 整个数组中的位置来提供,也就是说这里需要一次MATCH。因此第一名的公式很自然的出现了: INDEX(姓名列区域,MATCH(LARGE(成绩加行号,1),成绩加行号))。最后对LARGE第二参数进行数组化(即1 升级为row(1:15)就能以个多单元格数组公式返回排序后的名单了。
这里关键还是 将各种信息转换为数值..
[ 本帖最后由 胡剑0227 于 2011-5-7 16:52 编辑 ] |
|