ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何按成绩和性别分班

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-7-24 20:00 | 显示全部楼层
jxndwxs 发表于 2014-7-24 17:14
如果在“报名信息”表中改变了字段(增加或减少),在“基数统计”使用中,有些功能会出错。

每个人设计的表格都不尽相同,无法写出万能的代码。如果原表增减列,代码必会出错。
如果想增加或减少某列,自己需懂点VBA才好。
同班重名的问题,再大的学校重名现象出现的不会太多,可 人工调整。本来速度就不够快,再循环多次只会增加运行时间。
健康状况,如果表中有实际数据也可以统计。
如果有实际数据任何项目均可以统计。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-24 20:59 | 显示全部楼层
aoe1981 发表于 2014-7-24 19:54
你提的一个“择班”问题,一个“重姓名”问题,都是重磅的呀……看来这个工作应当分步骤完成,指着一次性 ...

也是的,任何一个程序不可能十全十美。你和hlly888老师都很尽力的完善程序了,而且都设计的很好。谢谢你们了。

TA的精华主题

TA的得分主题

发表于 2014-7-24 21:03 | 显示全部楼层
hlly888 发表于 2014-7-24 20:00
每个人设计的表格都不尽相同,无法写出万能的代码。如果原表增减列,代码必会出错。
如果想增加或减少某 ...

是呀,我不懂VBA,只是自己想怎么样,就要求老师做到怎么样。实在对不起。请老师原谅。

TA的精华主题

TA的得分主题

发表于 2014-7-24 21:51 | 显示全部楼层
本帖最后由 香川群子 于 2014-7-24 21:55 编辑

分班条件:
1、先男生后女生分开,然后按总分从高到低排序后依名次顺序分班。力争各班成绩搭配均匀。
2、假如分5个班,名次要按:12345,23451,34512,45123,51234 错位分配。
  1. Sub kagawa()

  2.     tms = Timer '开始计时
  3.     k = Sheets("分班").Range("g1") '获取分班数k

  4.     Sheets("报名信息").Activate
  5.     m = [a65536].End(3).Row - 2 '数据表有效行数m
  6.     n = 17  '数据表有效列数n=17 (到Q列)
  7.     Range("a3").Resize(m, n).Sort [c3], 1, [p3], , 2, , , 2 '按男女、总分 进行工作表倒序排序
  8.     arr = Range("a3").Resize(m, n) '工作表排序后的数据读入数组arr
  9.         
  10.     ReDim brr(k - 1) '按班级数定义嵌套数组
  11.     ReDim crr(-1 To m \ k, 1 To n) '记录每个班信息的嵌套子数组
  12.     For j = 1 To n
  13.         crr(-1, j) = Cells(2, j) '写入班级信息标题栏
  14.     Next
  15.     For i = 0 To k - 1
  16.         brr(i) = crr '嵌套数组初始化
  17.     Next
  18.         
  19.     ReDim crr(m - 1, 0) '记录实际分班序号
  20.     ReDim drr(9, 2)       '按要求统计各班男女生人数、总分合计
  21.     For t = 0 To m - 1 '按排序后的顺序 遍历原始数据各行
  22.         c = (t + t \ k) Mod k '计算当前班级 【注意:可按楼主要求自动进行班级顺序错位】
  23.                                      '即 12345 23451 34512 45123 51234 12345 ……这样的错位进行
  24.         crr(t, 0) = c + 1
  25.         i = t \ k  '计算当前班级所在行序号i
  26.         brr(c)(i, 1) = c + 1 '第1列写入分配班级
  27.         For j = 1 To n '第2-18列 照搬原始数据
  28.             If j = 5 Or j = 10 Then brr(c)(i, j) = "'" & arr(t + 1, j) Else brr(c)(i, j) = arr(t + 1, j)
  29.         Next
  30.         
  31.         If arr(t + 1, 3) = "男" Then drr(c, 0) = drr(c, 0) + 1 Else drr(c, 1) = drr(c, 1) + 1
  32.         drr(c, 2) = drr(c, 2) + arr(t + 1, 16)
  33.     Next
  34.     MsgBox Format(Timer - tms, "0.000s") '172个学生分成5个班计算耗时约 0.03-0.04秒
  35.     Range("a3").Offset(, n).Resize(m) = crr '在报名信息表最后一列输出现在的分班班序
  36.    
  37.     Sheets("分班").Range("c2:e11") = drr '分班后统计结果输出
  38. '    Stop

  39.     '删去以前的工作表
  40.     Application.DisplayAlerts = False
  41.     For i = Sheets.Count To 3 Step -1
  42.         Sheets(i).Delete
  43.     Next
  44.    
  45.     '下面是新建工作表并逐个输出各班级结果
  46.     For i = 0 To k - 1
  47.         Sheets.Add After:=Sheets(Sheets.Count)
  48.         Sheets(Sheets.Count).Name = "班" & Right(0 & i + 1, 2)
  49.         Sheets(Sheets.Count).Range("a1").Resize(m \ k + 2, n) = brr(i)
  50.     Next
  51.     Sheets("分班").Activate
  52. End Sub
复制代码

七年级分班.rar

36.94 KB, 下载次数: 232

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-24 22:05 | 显示全部楼层
aoe1981 发表于 2014-7-24 19:59
这个的确是的,您是数组、组合……的鼻祖!

发现我的代码计算耗时,还包括了重新排序的时间。

如果不算排序时间(事先已经排序完成),那么我的代码耗时更少……大约0.01秒以下。


因为我的班级计算只要一句代码:c = (t + t \ k) Mod k

你的复杂多了。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-24 22:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2014-7-24 22:05
发现我的代码计算耗时,还包括了重新排序的时间。

如果不算排序时间(事先已经排序完成),那么我的代码 ...

我这会正在研究,发现三个优点:
1.按性别+总分事先进行排序,省去了大量循环内部的性别条件判断,也进一步简化了代码,提升了速度;
2.标题行的写入优化了,我的还是逐工作表、逐单元格的写入方式,以为少了,便没动心思;
3.这一句:c = (t + t \ k) Mod k极端精彩!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-24 22:15 | 显示全部楼层
香川群子 发表于 2014-7-24 22:05
发现我的代码计算耗时,还包括了重新排序的时间。

如果不算排序时间(事先已经排序完成),那么我的代码 ...

下面我再与我的整体代码参考、借用、磨合下!

TA的精华主题

TA的得分主题

发表于 2014-7-24 22:27 | 显示全部楼层
aoe1981 发表于 2014-7-24 19:49
什么叫“同姓名的人分在同一班”?附件中是模拟数据,基本的有170人,为了测试代码的效率,复制粘贴了若干 ...

谢谢aoe1981大侠的回答,我做教务大约有10年时间,分班更不止10年,分班的好坏对班主任和授课教师,甚至整个学校都有影响,同姓名在班里面做事比较麻烦,小事情。我还想到的是,择班生楼主提的很好,(我不知道楼主的择班生是什么原因,但我大致上心中有数),目前我还想到的还有另外的一些原因:1、家庭特别困难的学生(包括孤儿),2、性格较差,特别难管的,3、弱智的,这些学生都不能分在一个班,不管他们的成绩,最好分散他们,便于照顾和管理。当然这些学生情况先摸清楚,这些学生不能先拿出来分班,作为特殊的一块均匀分班,同时也要考虑他们的成绩。以前我校一个年级有5个孤儿,都分在一个班,事后才知道,大家看这个班主任要带好学生,与其他班主任比较……,难管的学生在一个班,他们就成了团体……,弱智的和困难学生一样需要照顾……,一般分下去了,有的一带就是三年……

TA的精华主题

TA的得分主题

发表于 2014-7-24 22:29 | 显示全部楼层
你们研究的这个分班程序,我可能用得着,谢谢你们!

TA的精华主题

TA的得分主题

发表于 2014-7-24 22:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我已经收藏,会关注你们,我用Excel 做事,大部分是用函数公式来的,目前正在做一个表,一个年级6200多人的成绩,用公式慢死了,准备学学vba

点评

这个应该可以帮助你, http://club.excelhome.net/thread-1034379-1-1.html  发表于 2014-7-31 14:41
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 15:50 , Processed in 0.039495 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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