|
本帖最后由 捞屎人 于 2023-5-2 11:32 编辑
加一列辅助列产生随机数 然后再排序就是了
但是细审问题感觉你要的不是随机排序 而是班级穿插
呵呵 中小学考场编排 我最专业
- Public Function 考场模式(rng As Range, lie1%, moshi$, Optional biaotihang = 0) '根据不同的模式对考生排序
- Dim i&, j&, arr, brr, dic As Object, key, lie%
- j = 1
- With rng
- lie = IIf(lie1 < 0, .Columns.Count, lie1)
- Select Case moshi
- Case "按成绩降序" '按成绩降序排考场
- .Sort key1:=.Cells(1, lie), order1:=2, Header:=2 - biaotihang '数据源按成绩降序排序
- 考场模式 = 1
- Exit Function
- Case "按班级升序" '按班级不打散排考场
- .Sort key1:=.Cells(1, 2), order1:=1, key2:=.Cells(1, lie), order2:=2, Header:=2 - biaotihang '数据源按班级升序/成绩降序排序
- arr = .Value '载入年级人数
- For i = 1 To .Rows.Count '遍历所有学生
- If arr(i, Abs(lie1)) <> "" Then
- arr(i, Abs(lie1)) = j '如果成绩不为空,则编号
- j = j + 1
- End If
- Next
- 考场模式 = 2
- Case "按班级交叉" '按班级均匀交叉排考场
- .Sort key1:=.Cells(1, 2), order1:=1, key2:=.Cells(1, lie), order2:=2, Header:=2 - biaotihang '数据源按班级升序/成绩降序排序
- Set dic = 分段(rng, 2, 1) '计算各班考生起止位置
- i = 1
- arr = .Value '载入年级人数
- While dic.Count
- For Each key In dic '遍历各班
- brr = dic(key)
- If arr(brr(1), Abs(lie1)) <> "" Then
- arr(brr(1), Abs(lie1)) = j '从各班取出一个人编号
- j = j + 1
- End If
- i = i + 1
- If brr(1) = brr(2) Then '如果班级人员取完
- dic.Remove (key) '移除字典
- Else
- brr(1) = brr(1) + 1 '班级起始位置下移一位
- dic(key) = brr
- End If
- Next
- Wend
- 考场模式 = 3
- Case Else
- 考场模式 = 0
- End Select
- .Value = arr
- .Sort key1:=.Cells(1, Abs(lie1)), order1:=1, Header:=2 - biaotihang
- End With
- End Function
复制代码
|
|