|
本帖最后由 香川群子 于 2014-7-24 21:55 编辑
分班条件:
1、先男生后女生分开,然后按总分从高到低排序后依名次顺序分班。力争各班成绩搭配均匀。
2、假如分5个班,名次要按:12345,23451,34512,45123,51234 错位分配。- Sub kagawa()
- tms = Timer '开始计时
- k = Sheets("分班").Range("g1") '获取分班数k
- Sheets("报名信息").Activate
- m = [a65536].End(3).Row - 2 '数据表有效行数m
- n = 17 '数据表有效列数n=17 (到Q列)
- Range("a3").Resize(m, n).Sort [c3], 1, [p3], , 2, , , 2 '按男女、总分 进行工作表倒序排序
- arr = Range("a3").Resize(m, n) '工作表排序后的数据读入数组arr
-
- ReDim brr(k - 1) '按班级数定义嵌套数组
- ReDim crr(-1 To m \ k, 1 To n) '记录每个班信息的嵌套子数组
- For j = 1 To n
- crr(-1, j) = Cells(2, j) '写入班级信息标题栏
- Next
- For i = 0 To k - 1
- brr(i) = crr '嵌套数组初始化
- Next
-
- ReDim crr(m - 1, 0) '记录实际分班序号
- ReDim drr(9, 2) '按要求统计各班男女生人数、总分合计
- For t = 0 To m - 1 '按排序后的顺序 遍历原始数据各行
- c = (t + t \ k) Mod k '计算当前班级 【注意:可按楼主要求自动进行班级顺序错位】
- '即 12345 23451 34512 45123 51234 12345 ……这样的错位进行
- crr(t, 0) = c + 1
- i = t \ k '计算当前班级所在行序号i
- brr(c)(i, 1) = c + 1 '第1列写入分配班级
- For j = 1 To n '第2-18列 照搬原始数据
- If j = 5 Or j = 10 Then brr(c)(i, j) = "'" & arr(t + 1, j) Else brr(c)(i, j) = arr(t + 1, j)
- Next
-
- If arr(t + 1, 3) = "男" Then drr(c, 0) = drr(c, 0) + 1 Else drr(c, 1) = drr(c, 1) + 1
- drr(c, 2) = drr(c, 2) + arr(t + 1, 16)
- Next
- MsgBox Format(Timer - tms, "0.000s") '172个学生分成5个班计算耗时约 0.03-0.04秒
- Range("a3").Offset(, n).Resize(m) = crr '在报名信息表最后一列输出现在的分班班序
-
- Sheets("分班").Range("c2:e11") = drr '分班后统计结果输出
- ' Stop
- '删去以前的工作表
- Application.DisplayAlerts = False
- For i = Sheets.Count To 3 Step -1
- Sheets(i).Delete
- Next
-
- '下面是新建工作表并逐个输出各班级结果
- For i = 0 To k - 1
- Sheets.Add After:=Sheets(Sheets.Count)
- Sheets(Sheets.Count).Name = "班" & Right(0 & i + 1, 2)
- Sheets(Sheets.Count).Range("a1").Resize(m \ k + 2, n) = brr(i)
- Next
- Sheets("分班").Activate
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|