ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 计算学校名次、班级名次代码优化

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-3-8 10:11 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这是我写的一段对已按学校名称、班级名称排序的数据(原表约4W条记录)按总分计算学校名次,班级名次的的代码  请求高手优化

排名次.rar

196.93 KB, 下载次数: 86

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-8 11:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的设计思路是:
用字典获取所有 学校名称  和  所有的 班级名称
根据学校名称获取学校的起止行号,循环获取全部班级的行号,写入RANK 函数
但对字典不熟悉,循环的时候不是这个学校的班级也会参与循环(但不会写入RANK函数),这样无形中就会有很多不必要的循环,不知如何能进行优化。
期待各位大侠的指点

TA的精华主题

TA的得分主题

发表于 2011-3-8 12:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
给您一个非常好的解决方案!
这也是困扰了我很久的一个问题!

排名次-非常好.rar (25.47 KB, 下载次数: 151)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-8 13:15 | 显示全部楼层
原帖由 liuqiwen 于 2011-3-8 12:06 发表
给您一个非常好的解决方案!
这也是困扰了我很久的一个问题!

884544

非常感谢您的回答
您的代码我试过了,不过比较遗憾,比我设计的代码执行时间还要长

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-8 17:53 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-8 19:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-3-9 19:43 | 显示全部楼层

关键是先要排序

原帖由 mxf21cn 于 2011-3-8 11:28 发表
我的设计思路是: ...


用不用字典无所谓,关键是因为你在计算排名前没有对数据排序。
只要先对数据进行了排序,然后就很容易对数进行分段处理了,定位数据段的起始位置也变得很简单,因此就不必自定义函数了。

另外,如果出现不同学校有同名的班级如“理11”,就不能仅只按“班级”字段来计算班内排名,而应把“学校”和“班级”两个字段联合成一个字段起来处理。我的处理方法是构造一个辅助数组,用于定位班级的起始和结尾位置。采用这种办法,有几个条件,就合并几个字段,可以轻松解决多重条件分段排名。

[ 本帖最后由 cbtaja 于 2011-3-9 20:06 编辑 ]

排名次.rar

178.23 KB, 下载次数: 146

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-9 21:14 | 显示全部楼层
原帖由 cbtaja 于 2011-3-9 19:43 发表


用不用字典无所谓,关键是因为你在计算排名前没有对数据排序。
只要先对数据进行了排序,然后就很容易对数进行分段处理了,定位数据段的起始位置也变得很简单,因此就不必自定义函数了。

另外,如果出现不同 ...

非常感谢您的回答,你的算法非常好,让我又多学到了很多。
有个问题还望指教:按理说你的算法比我的算法要科学,执行的时间应该更短,可是你的代码在我的电脑上执行时间是3.57,而我的代码执行时间是2.57

TA的精华主题

TA的得分主题

发表于 2011-3-9 21:55 | 显示全部楼层

回复 8楼 mxf21cn 的帖子

可能是几种原因综合造成:
1、你的代码没有计算总名次,因此少干了活。
2、你的代码中没有排序,因此又少干了活。(但如果此前没有对数据进行过手动排序的话,你的代码结果将出现错误。)
3、你的代码中,对于班内的排名,是想要限制在同一校内分段处理的,思路很好,定位班级起止位置时,这样就可以在一个小范围内快速定位,但代码似乎还有些缺陷;而我的代码是按“学校&班级”联合字段在全部数据范围内进行定位的,因此查找的时间会较多,虽然只查找十来个班级,但你全部查找的范围加起来才相当于我一次查找的范围,如果我每次定位一个班级需要0.01秒,十次就需0.1秒,而你总共就只需0.01秒了。在这一点上,我首先考虑的是保证代码的正确性,毕竟定位5W行相当于1000个班级的时间可能也就只需1~2秒。当然,该代码还可以更优化,我认为从构建的辅助数组中按条件截取一部分,就能达到限制查找范围在同一个学校的数据段的效果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-9 22:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 cbtaja 于 2011-3-9 21:55 发表
可能是几种原因综合造成:
1、你的代码没有计算总名次,因此少干了活。
2、你的代码中没有排序,因此又少干了活。(但如果此前没有对数据进行过手动排序的话,你的代码结果将出现错误。)
3、你的代码中,对于班内 ...


刚才又测试了下,确实是我的代码少干活了, 把该干的活干了  时间就一样了,也是3.57
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 05:39 , Processed in 0.034159 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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