ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: mjzxlmg

[已解决] 帮忙做个各科成绩快速排名方法?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-3-9 23:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个文件,由于时间仓促,肯定有很多错误,不能仔细考虑,你试试看吧,采用数据透视表+公式做的,错误之处,请多包涵:
排名次.rar (18.03 KB, 下载次数: 77)

TA的精华主题

TA的得分主题

发表于 2011-3-9 23:28 | 显示全部楼层
VBA去排序的话,1W条数据无论如何不应该超过 0.1 秒钟

问题的核心其实是排序而已,如果调用Excel的排序功能,那么也是很快的

如果自己用VBA代码排序,那么就更快

用VBA去填写工作表函数如RANK之类,肯定快不到哪里去。

[ 本帖最后由 灰袍法师 于 2011-3-9 23:41 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-3-9 23:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 32楼 灰袍法师 的帖子

在很多贴子里见到法师的VBA功力,使用字典和数组解决大容量数据的问题,代码效率极高,可是一直不得窍要。法师能否在这里能否示范一下?我竭尽全力,但27楼的附件中代码仍需3秒多的时间,请法师指点代码优化的方向。

TA的精华主题

TA的得分主题

发表于 2011-3-9 23:56 | 显示全部楼层
原帖由 灰袍法师 于 2011-3-9 23:28 发表
VBA去排序的话,1W条数据无论如何不应该超过 0.1 秒钟

问题的核心其实是排序而已,如果调用Excel的排序功能,那么也是很快的

如果自己用VBA代码排序,那么就更快

用VBA去填写工作表函数如RANK之类,肯定快不 ...

曾经见过用数组排序的代码,不过当时没有太留心学习,现在一时竟找不出来了。以后要跟着法师多学习学习!

TA的精华主题

TA的得分主题

发表于 2011-3-10 05:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个应该够快了

楼上看我发表的主题帖就能找到全论坛最快的排序代码

本附件也是修改该帖的代码而已

其实这类排名问题很简单,就是繁琐而已。

楼主的数据还带空值,那就更讨厌了,至少需要多一些判断语句

本附件不限多少列,反正统分表每一列都排序,算排名,输出为两列

要改校内排名。全级排名,全班排名也一样道理,把要排序的数据放到arr_score(), arr_position(),调用希尔排序

然后计算名次即可

虽然VBA代码看起来行数很多,但实际上计算速度比调用工作表RANK函数的“简单代码”要快得多。

VBA速度快的关键有三点:
1 把单元格所有数据读入数组,计算完毕一次写回工作表,绝对不要逐个单元格去读写
2 不要在循环内部使用工作表的函数公式(虽然这有时候意味着自己要写代码实现同样的功能)
3 一定要用VBA字典,或者类似的快速算法去搜索某个值,不要穷举。如本附件排序前记录成绩的行号,然后排名次后,就可以根据行号一下找回该成绩对应的人

[ 本帖最后由 灰袍法师 于 2011-3-10 05:13 编辑 ]

成绩表.rar

103.75 KB, 下载次数: 513

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-3-10 08:12 | 显示全部楼层
多谢法师示范,里面的方法够我学的了,特别是希尔排序的函数原理。
此外,法师对空值的处理也非常技巧,此前我写的代码中就觉得排除空值很烦人,曾经想过用筛选法处理,但是觉得代码很哆嗦,就索性忽略了,

TA的精华主题

TA的得分主题

发表于 2011-3-10 10:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
真是听君一席话  胜读十年书

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-10 14:29 | 显示全部楼层
原帖由 灰袍法师 于 2011-3-10 05:05 发表
这个应该够快了

楼上看我发表的主题帖就能找到全论坛最快的排序代码

本附件也是修改该帖的代码而已

其实这类排名问题很简单,就是繁琐而已。

楼主的数据还带空值,那就更讨厌了,至少需要多一些判断语句 ...




非常好,楼主真是高手。计算速度很快,符合快捷的要求。
谢谢谢谢!

TA的精华主题

TA的得分主题

发表于 2011-3-10 18:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 cbtaja 于 2011-3-10 08:12 发表
多谢法师示范,里面的方法够我学的了,特别是希尔排序的函数原理。
此外,法师对空值的处理也非常技巧,此前我写的代码中就觉得排除空值很烦人,曾经想过用筛选法处理,但是觉得代码很哆嗦,就索性忽略了,


希尔排序的原理可以在维基百科,或者算法书找到详细介绍

我的排序帖最大特点是找到了最快的h序列,维基百科也没有提到这个问题,实际上讨论希尔排序同时提到最佳h序列的书也不多

不过具体到楼主这个实例,实际上最快的排序方法我觉得应该是基数排序,不我我觉得基数排序的应用比较少,所以没研究,在这里就直接套用以前的算法代码了。

编程就是个综合考虑啊,要节约编写代码的时间,恐怕最后的代码运行效率就比较低了,正如调用excel函数可以节约很多编程时间,但是效率就。。。。。。呵呵呵。
希尔排序简要说明.jpg

TA的精华主题

TA的得分主题

发表于 2011-3-11 09:13 | 显示全部楼层
我看了一下,觉得理解希尔排序还很难的。
我这样来理解,通过一组预定的界点值,把要排序的数据分段归类,这样可以用相对较少的对比次数就能把每个值送到到它最后位置所最靠近的界点,而在这些限定的每一个比较“狭小”的空间内,每一个数据可以用较少的次数到达它最后的位置,从而提高效率。
不知这种理解是否合适?



或者这样理解:
把要排序的数据划分为不同的“重量级”,不在同一个“级别”的就根本无需比较了。

[ 本帖最后由 cbtaja 于 2011-3-11 09:20 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 12:52 , Processed in 0.035801 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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