ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-7-25 12:11 | 显示全部楼层
夏秋梦 发表于 2014-7-24 22:33
我已经收藏,会关注你们,我用Excel 做事,大部分是用函数公式来的,目前正在做一个表,一个年级6200多人的 ...

我的天,一个年级6200人,有好多个班?

TA的精华主题

TA的得分主题

发表于 2014-7-25 17:54 | 显示全部楼层
liyunfei099 发表于 2014-7-25 12:11
我的天,一个年级6200人,有好多个班?

没说假话,不是我们学校的,实实在在这个年级有6254人,是全县的一个年级,一共126个班级,你说我这个分析表该多大,都用函数,运行太慢,哪天有空,请教这些高手,试试用vba做一下。

TA的精华主题

TA的得分主题

发表于 2014-7-25 17:58 | 显示全部楼层
说点看法,谈点感想,大家不要见笑(主要是看到你们讨论的也是我多年来所想的),能开发这么好的程序来,为广大教育工作者节约了很多时间、少动好多脑筋,真的谢谢您们:
根据我多年分班经历,和从班主任反映的情况来看,提点建议:你们研究这个程序我认为执行速度是次要的,实用是主要的,一个学校分班不是一下子完成的,考虑的东西多。我认为要优化的是,一个是分步完成分班,第二个是在表中增加分步按钮,第四个是将特殊学生单独提取出来(用一个标志在“报名信息表“标明,分班好后,tm单独存放在一个表中,一目了然):1、在“报名信息表“中,不要手工操作,单独制作两个按钮,一个是按你们设置排序方法排序按钮,另一个是撤销排序按钮,当排序好后,再执行分班。2、在分班信息中:(1)增加个一键清除按钮,当执行程序分班后,如果效果不好,撤销操作。(2)、分班后的信息要详细(因为大家都不认识和了解新生)、班主任要了解的是总平均分、各科平均分、男女人数、有多少难管的等特殊学生等信息,还有就是那些排名最前的学生自己分了多少个,第一名谁抽到了。
我从1999年分班到现在,改了很多的方法,有时候分班烦躁,干脆把学生交给班主任他们自己分也做过。分班的一个目的是追求公平,各个班在同一起跑线上赛跑(这个公平就是同一起跑线)。至于以后的赛跑成绩就看他们的本事了。
题外话:一般情况新生都是在假期分好班的,不管你怎么分均匀,但开学报名,新生稳定下来,再统计他们的成绩,班主任有的欢喜有的忧,为什么呢?大家都知道,现在流动人口多,很多家长、甚至一家全国跑。跨省读书的很多,转回的学生成绩很多不可信(这是我多年的见识,老师教上一段时间才知道)。转来转去,原装学生的总平均分、各科平均分、男女人数差距明显出来了,有的班主任运气差,前几名的学生跑得差不多了,有的班一个没跑,这不是学生的原因,而是家庭的原因。起跑线不同了,转入的学生就是走得多的班主任也不想要,一般均分,或者抽签。起跑线不同,有的班主任会一直抱怨,毕竟绝大部分是要带好几年。
怎么办呢?可能绝大部分学校无可奈何,一直这样分班下去,大家也习以为常。针对这种情况,我们这几年就改了一下,把起跑线尽量拉近:开学不分班,按原校报名组成临时班,一般一两天时间报完名,转入的重新考试,人数多就单独分班,这样一般一个晚上就能分好班(因为要考虑的因素多,走后门的也多,一般熬夜),这样以到校学生和实实在在的成绩分班,什么都基本相同的了,起码男女生是能分均匀了。分好后马上抽签。
有的可能会问,升学前的成绩可靠吗?对!不可靠!我们学校改革分班的第一年,我们把原来的期考成绩丢在一边,新生入学后,不管是转入的还是原装的,统统重新考试,再分班。第二年我们为了减少一次考试,我们就和有关领导沟通好,升学前的期考,我们派人(监考员一般是这些学生的班主任和授课教师)去监考、考完后把试卷带回本校,由我们阅卷,阅卷完后,再派人核查,对阅卷老师搞错一分的都要进行处理,绝不留情。这样成绩应该公平了。目前我认为这些办法是最公平的了。
正因为如此,我们就不能像在假期一样有时间慢慢分,要打起精神,速战速决,熬夜难免。如果有了你们开发的这个程序,我想今年不需要熬夜了,就是我们分 好了,班主任不满意,也可以快速分班,先向你们敬礼!谢谢!

TA的精华主题

TA的得分主题

发表于 2014-7-25 18:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2014-7-25 11:52
好的,我抽空再研究下……有劳了……

索性写成函数过程以便任意调用。
  1. Sub test()
  2.     '在其它代码中调用的例子,非常简单 只需输入待分组学生总人数m、和分班班级数k

  3.     '例子-1 排序后的2380个学生分到5个班级
  4.     br = bj(2380, 5)
  5.     Stop
  6.    
  7.     '例子2 排序后的2380个学生分到10个班级
  8.     br = bj(2380, 10)
  9.     Stop
  10. End Sub

  11. Function bj(m&, k&) 'm个学生排序后分派到k个班级 的自定义函数过程
  12.     '分班要求 按班级错位分配: 12345 54321 23451 15432 34512 21543 45123 32154 51234 43215
  13.     Dim i&, t&
  14.     t = k ^ 2 * 2 '循环基数t
  15.     ReDim a&(t - 1) '定义存放顺序循环结果的数组a
  16.     For i = 0 To k - 1 '首先、生成第一组基数
  17.         a(i) = i          '升序 01234
  18.         a(k * 2 - i - 1) = i '降序 43210
  19.     Next
  20.     '接下来 生成余下的基数
  21.     For i = k * 2 To t - 1
  22.         a(i) = (a(i - k * 2) + 1) Mod k '其实只是比第1组基数+1 然后求余即可
  23.     Next
  24.     For i = 0 To t - 1
  25.         a(i) = a(i) + 1 '为提高效率 +1转换为 1开始的班级序号
  26.     Next
  27.    
  28.     '下面m个学生需要分班 则计算得到班级分配序号的一维数组
  29.     ReDim b&(1 To m)
  30. '    ReDim b&(1 To m, 1 To 1) '或生成多行单列的二维数组以便直接输出结果到工作表
  31.     For i = 1 To m
  32.         b(i) = a((i - 1) Mod t)
  33. '        b(i, 1) = a((i - 1) Mod t)
  34.     Next
  35.    
  36.     bj = b '这样得到一维或二维数组对应的分班序号结果数组bj
  37. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-25 19:09 | 显示全部楼层
香川群子 发表于 2014-7-25 18:52
索性写成函数过程以便任意调用。

这还真不会用。

TA的精华主题

TA的得分主题

发表于 2014-7-25 19:22 | 显示全部楼层
夏秋梦 发表于 2014-7-25 17:54
没说假话,不是我们学校的,实实在在这个年级有6254人,是全县的一个年级,一共126个班级,你说我这个分析 ...

如果你是一个学校的教师而去分析全县的成绩,那教育局那些人是干什么的?

TA的精华主题

TA的得分主题

发表于 2014-7-25 19:45 | 显示全部楼层
改成调用分班函数的算法:
  1. Option Explicit
  2. Sub kagawa()
  3.     Dim arr, xh, c&, i&, j&, k&, l&, m&, n&, t&, tms#
  4.     tms = Timer '开始计时
  5.     k = Sheets("分班").Range("g1") '获取分班数k

  6.     Sheets("报名信息").Activate
  7.     m = [a65536].End(3).Row - 2 '数据表有效行数m
  8.     n = 17  '数据表有效列数n=17 (到Q列)
  9.     Range("a3").Resize(m, n).Sort [c3], 1, [p3], , 2, , , 2 '按男女、总分 进行工作表倒序排序
  10.     arr = Range("a3").Resize(m, n) '工作表排序后的数据读入数组arr
  11.         
  12.     ReDim brr(1 To k)
  13.     ReDim crr(m \ k, 1 To n) '记录每个班信息的嵌套子数组
  14.     For j = 1 To n
  15.         crr(0, j) = Cells(2, j) '写入班级信息标题栏
  16.     Next
  17.     For j = 1 To k
  18.         brr(j) = crr '嵌套数组初始化
  19.     Next
  20.         
  21.     ReDim crr(1 To 10, 1 To 3)
  22.     xh = bj(m, k) '对于排序后的学生数据表 直接调用分班函数得到分班班级序号
  23.     For t = 1 To m Step k '按排序后的顺序 遍历原始数据各行
  24.         i = i + 1 '插入各个班级是的当前行号
  25.         For l = 0 To k - 1
  26.             c = xh(t + l, 1)
  27.             For j = 1 To n '第1-18列 照搬原始数据
  28.                 If j = 5 Or j = 10 Then brr(c)(i, j) = "'" & arr(t + l, j) Else brr(c)(i, j) = arr(t + l, j)
  29.             Next
  30.             If arr(t + l, 3) = "男" Then crr(c, 1) = crr(c, 1) + 1 Else crr(c, 2) = crr(c, 2) + 1
  31.             crr(c, 3) = crr(c, 3) + arr(t + l, 16)
  32.         Next
  33.     Next
  34.     MsgBox Format(Timer - tms, "0.000s") '172个学生分成5个班计算耗时约 0.03-0.04秒
  35.     Range("a3").Offset(, n).Resize(m) = xh '在报名信息表最后一列输出现在的分班班序
  36.    
  37.     Sheets("分班").Range("c2:e11") = crr '分班后统计结果输出
  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 = 1 To k
  47.         Sheets.Add After:=Sheets(Sheets.Count)
  48.         Sheets(Sheets.Count).Name = "班" & Right(0 & i, 2)
  49.         Sheets(Sheets.Count).Range("a1").Resize(m \ k + 1, n) = brr(i)
  50.     Next
  51.     Sheets("分班").Activate
  52. End Sub
  53. Function bj(m&, k&) 'm个学生排序后 按错位法分班的函数过程
  54.     '按班级错位分配: 12345 54321 23451 15432 34512 21543 45123 32154 51234 43215
  55.     Dim i&, t&
  56.     t = k ^ 2 * 2 '循环基数t
  57.     ReDim a&(t - 1) '定义存放顺序循环结果的数组a
  58.     For i = 0 To k - 1 '首先、生成第一组基数
  59.         a(i) = i          '升序 01234
  60.         a(k * 2 - i - 1) = i '降序 43210
  61.     Next
  62.     '接下来 生成余下的基数
  63.     For i = k * 2 To t - 1
  64.         a(i) = (a(i - k * 2) + 1) Mod k '其实只是比第1组基数+1 然后求余即可
  65.     Next
  66.     For i = 0 To t - 1
  67.         a(i) = a(i) + 1 '为提高效率 +1转换为 1开始的班级序号 01234 -> 12345
  68.     Next
  69.    
  70.     '下面m个学生需要分班 则计算得到班级分配序号的一维数组
  71. '    ReDim b&(1 To m)
  72.     ReDim b&(1 To m, 1 To 1) '或生成多行单列的二维数组以便直接输出结果到工作表
  73.     For i = 1 To m
  74. '        b(i) = a((i - 1) Mod t)
  75.         b(i, 1) = a((i - 1) Mod t)
  76.     Next
  77.    
  78.     bj = b '这样得到一维或二维数组对应的分班序号结果数组bj
  79. End Function
复制代码

七年级分班.rar

38.15 KB, 下载次数: 125

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-25 19:57 | 显示全部楼层
本帖最后由 张雄友 于 2014-7-25 20:02 编辑
香川群子 发表于 2014-7-25 19:45
改成调用分班函数的算法:

G1单元格,点击3 个班,或者 4个班时,会下标越界。只可以分5,或 10 个班?

TA的精华主题

TA的得分主题

发表于 2014-7-25 20:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
夏秋梦 发表于 2014-7-25 17:58
说点看法,谈点感想,大家不要见笑(主要是看到你们讨论的也是我多年来所想的),能开发这么好的程序来,为 ...

VBA帮助程序分班只能按以下思路:

1、特殊学生手工标记,不参与程序分配。
2、剩余学生,严格按照【男女】、【总分名次】排序后自动分配。

3.  手工添加特殊学生 并随时得到新的统计结果 (也用VBA程序)
4.  根据统计结果再次调整
重复3-4 直到统计结果令人满意。

…………
现在,第2个问题已经基本解决了。
所以,下一步就是:
1. 如何确定需要的统计项目、内容。
2. 如何提示需要再次调整的班级、学生。

呵呵

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-25 20:21 | 显示全部楼层
本帖最后由 hlly888 于 2014-7-25 20:23 编辑
达州张先生 发表于 2014-7-25 09:28
这段代码啊替换那里啊,用我的附件发个附件看看(不要改格式,试试能否运行)!谢谢!

   
分班统计表                                                                        班级数
班级        总人数        男        女        总分        平均分                11
合计        170        98        72        33145        460.35                
七1        15        9        6        2979        496.50                
七2        16        9        7        3114        444.86                
七3        16        9        7        3078        439.71                
七4        16        9        7        3072        438.86                
七5        16        9        7        3061        437.29                
七6        16        9        7        3050        435.71                
七7        16        9        7        3057        436.71                
七8        14        8        6        2827        471.17                
七9        15        9        6        2974        495.67                
七10        15        9        6        2971        495.17                
七11        15        9        6        2962        493.67                

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 13:35 , Processed in 0.049633 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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