ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 考生打乱顺序,并按要求安排考场

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-13 17:07 | 显示全部楼层
522236128 发表于 2014-1-13 10:41
能否随机排完,再判断是否有连续,有就移到不连续的地方。

你提的这个建议也可行,就怕数据太少使程序陷入死循环,比如只有两个班,一个班比另一个班多两个以上人员,这样怎么排列都会有一个班的两个学生相邻,程序就会进入死循环。

TA的精华主题

TA的得分主题

发表于 2015-6-24 10:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-5-2 11:26 | 显示全部楼层
本帖最后由 捞屎人 于 2023-5-2 11:32 编辑

加一列辅助列产生随机数  然后再排序就是了
但是细审问题感觉你要的不是随机排序 而是班级穿插
QQ截图20230502112854.png
呵呵  中小学考场编排 我最专业
  1. Public Function 考场模式(rng As Range, lie1%, moshi$, Optional biaotihang = 0)  '根据不同的模式对考生排序
  2.     Dim i&, j&, arr, brr, dic As Object, key, lie%
  3.     j = 1
  4.     With rng
  5.         lie = IIf(lie1 < 0, .Columns.Count, lie1)
  6.         Select Case moshi
  7.             Case "按成绩降序" '按成绩降序排考场
  8.                 .Sort key1:=.Cells(1, lie), order1:=2, Header:=2 - biaotihang '数据源按成绩降序排序
  9.                 考场模式 = 1
  10.                 Exit Function
  11.             Case "按班级升序" '按班级不打散排考场
  12.                 .Sort key1:=.Cells(1, 2), order1:=1, key2:=.Cells(1, lie), order2:=2, Header:=2 - biaotihang '数据源按班级升序/成绩降序排序
  13.                 arr = .Value '载入年级人数
  14.                 For i = 1 To .Rows.Count '遍历所有学生
  15.                     If arr(i, Abs(lie1)) <> "" Then
  16.                         arr(i, Abs(lie1)) = j '如果成绩不为空,则编号
  17.                         j = j + 1
  18.                     End If
  19.                 Next
  20.                 考场模式 = 2
  21.             Case "按班级交叉" '按班级均匀交叉排考场
  22.                 .Sort key1:=.Cells(1, 2), order1:=1, key2:=.Cells(1, lie), order2:=2, Header:=2 - biaotihang '数据源按班级升序/成绩降序排序
  23.                 Set dic = 分段(rng, 2, 1) '计算各班考生起止位置
  24.                 i = 1
  25.                 arr = .Value '载入年级人数
  26.                 While dic.Count
  27.                     For Each key In dic '遍历各班
  28.                         brr = dic(key)
  29.                         If arr(brr(1), Abs(lie1)) <> "" Then
  30.                             arr(brr(1), Abs(lie1)) = j '从各班取出一个人编号
  31.                             j = j + 1
  32.                         End If
  33.                         i = i + 1
  34.                         If brr(1) = brr(2) Then '如果班级人员取完
  35.                             dic.Remove (key) '移除字典
  36.                         Else
  37.                             brr(1) = brr(1) + 1 '班级起始位置下移一位
  38.                             dic(key) = brr
  39.                         End If
  40.                     Next
  41.                 Wend
  42.                 考场模式 = 3
  43.             Case Else
  44.                 考场模式 = 0
  45.         End Select
  46.         .Value = arr
  47.         .Sort key1:=.Cells(1, Abs(lie1)), order1:=1, Header:=2 - biaotihang
  48.     End With
  49. End Function
复制代码


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

本版积分规则

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

GMT+8, 2024-11-17 03:39 , Processed in 0.030129 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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