ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: 周江

[求助]排序问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-11-5 18:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

用large实现rank现实的功能

Co0Tlfhu.rar (4.64 KB, 下载次数: 11)


借鉴了上一个公式的思路进行了“羊肉变人肉”过程。
心得,sum函数是个亮点,row(第一行数据),sum,if,row,结合来进行数组中符合某种条件的数的记数是关键。

=IF(ROW()-1>$C$1,"",INDEX($A$2:$A$14,SMALL(IF(LARGE(TLARGE,ROW()-1)=TLARGE,ROW($A$1:$A$13),""),ROW()+SUM(IF(LARGE(TLARGE,ROW()-1)=TLARGE,ROW($L$1:$X$1),""))-1-SUM(IF(LARGE(TLARGE,ROW()-1)<=TLARGE,ROW($L$1:$X$1),"")))))

进行名称定义简化

=IF(ROW()-1>$C$1,"",INDEX($A$2:$A$14,SMALL(IF(LARGE(TLARGE,ROW()-1)=TLARGE,ROW($A$1:$A$13),""),ROW()+sumlargedy-1-sumlargedydy)))

逻辑分析,发现自己是个大笨蛋,可以直接简化如下

=IF(ROW()-1>$C$1,"",INDEX($A$2:$A$14,SMALL(IF(LARGE(TLARGE,ROW()-1)=TLARGE,ROW($A$1:$A$13),""),ROW()+-1-sumlargexy)))

这里sumlargexy=SUM(IF(LARGE(TLARGE,ROW()-1)<TLARGE,ROW($L$1:$X$1),""))

[此贴子已经被作者于2006-11-5 19:04:06编辑过]

TA的精华主题

TA的得分主题

发表于 2006-11-5 19:31 | 显示全部楼层

看了liyh67后直冒汗,哈哈,那个index,match,large组合太厉害了。那个large把大小给比,直接用match把序号给留下了,厉害。

不过感觉不对的吧,相同的奖金没法解决,呵呵,是用辅助列的

思路是相同的,就是把数值的大小和原来的排位两者的信息都用上就可以了

[此贴子已经被作者于2006-11-5 19:40:50编辑过]

TA的精华主题

TA的得分主题

发表于 2006-11-7 00:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

总结:这类排序问题应该考虑到那个 关键词(用来作为排序的依据的那个字段)相等的情况.所以单单=index{ref,match[large(f(ref1),row()-1),f(ref1),0]}的格式是不完美的(这里为了看请括号的层次用了大中小括号,只是用来表达而已).在这里ref表示对应的应用,f()表示一个具体的函数,如果是比文本的长度就代表LEN(),如果直接是数字就可以省略.不完美体现在当关键词相同的两个ref中的不同单元格在排序时显示为第一个单元格的内容,原因应该是match函数只返回第一个match(匹配)上的位置.从信息的角度讲,这里只利用了关键词的信息,忽略了原来的排位信息,所以我们的实现途径就是要把原来排序的信息量用上去.现在我总结了两种方法,具有普遍性.

思路1:设置新关键词,这个关键词同时含有原关键词和原先序号(用row()来体现),一个简单的做法就是f(ref1)*10000-row(),这里用-主要考虑序号和原来的序号保持一致性(降序相同,升序相反,比较符合一般认知).具体如果f()=len(),那么就是len(ref1)*10000-row().这里完美公式就是={ref,match[large(f(ref1)*10000-row(),row()-1),f(ref1)*10000-row(),0]}

思路2:进行分步走,先通过关键词比较, 并把比较信息登记到一个"寄存器"(其实是一个数组)中,这里可能有多个记录,再利用row()函数递增的特性区分出第一个,第二个,...提供一个我自己常用的具体实现的一般形式:index{ref,small[if(small(f(ref1),row()-1)=f(ref1),row(ref),""),row()-1-sum(if(small(f(ref1),row()-1)<f(ref1),column(ref),""))]}

希望对你有用,支持我,呵呵

rbi32P4K.rar (3.9 KB, 下载次数: 16)
[此贴子已经被作者于2006-11-7 0:26:43编辑过]

TA的精华主题

TA的得分主题

发表于 2010-12-31 11:37 | 显示全部楼层
有这个必要吗,添加辅助列最简单。什么公式的不要

TA的精华主题

TA的得分主题

发表于 2011-6-13 22:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
多单元格数组公式:=INDEX(A:A,MATCH(LARGE($B$2:$B$14+ROW($B$2:$B$14)%,ROW(1:7)),$B$2:$B$14+ROW($B$2:$B$14)%,)+1)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-25 07:24 , Processed in 0.034086 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表