1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助多条件排考场

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-3-29 20:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
戎马书生222 发表于 2025-3-29 16:50
感谢感谢。能不随机安排吗?因为平常考试都是按照考试成绩,怕学习差的学生抄袭学习好的同学。

你的表里也没看到成绩数据,按什么顺序来排呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-3-29 20:57 | 显示全部楼层
sunya_0529 发表于 2025-3-29 20:43
你的表里也没看到成绩数据,按什么顺序来排呢?

考号就是成绩,1号是第一名

TA的精华主题

TA的得分主题

发表于 2025-3-29 21:03 | 显示全部楼层
戎马书生222 发表于 2025-3-29 20:57
考号就是成绩,1号是第一名
  1. function 考场安排() {
  2.     const room = Sheets('条件').Cells(1).CurrentRegion();
  3.     with (Sheets('考场').Cells(1).CurrentRegion) {
  4.         const language = {}, group1 = {}, group2 = {};
  5.         let dicCM, dicLanguage, dicGroup, dicBG;
  6.         const addToGroup = (dic, key, value) => {
  7.             dic[key] ??= []; // 初始化空数组
  8.             dic[key].push(value); // 加入数组
  9.         };
  10.         Value2.slice(1).forEach(([, , C, D, E]) => {
  11.             addToGroup(language, D, E); // 加入“西”、“日”、“英”组合
  12.             addToGroup(group1, C.substr(0, 2), E); // 加入“物化”和“政史”组合
  13.             addToGroup(group2, C.substr(-1, 1), E); // 加入“生”、“地”、“政”组合
  14.         });
  15.         function arrangeAll() { // 全部随机分配考场和座号
  16.             let [idRoom, idSeat, res] = [1, 1, {}];
  17.             Value2.slice(1).map(v => v[4]).sort().forEach(id => {
  18.                 if (idSeat > room[idRoom][1]) { // 一个考场排满后换下一个
  19.                     idRoom++;
  20.                     idSeat = 1;
  21.                 }
  22.                 res[id] ??= [idRoom, idSeat++]; // 记录考号对应的外语考场和座位
  23.             });
  24.             return res;
  25.         }
  26.         function arrangeGroup(dic) { //按分组随机分配考场和座号
  27.             let [idRoom, idSeat, res] = [1, 1, {}];
  28.             Object.entries(dic).map(([k, v]) => [k, v.length])
  29.                 .sort((a, b) => a[1] - b[1]) // 按参考人数排序,从人少到人多
  30.                 .forEach(([k, v]) => {
  31.                     dic[k].sort().forEach(id => { // 随机排序待分配考号
  32.                         if (idSeat > room[idRoom][1]) {
  33.                             idRoom++;
  34.                             idSeat = 1;
  35.                         }
  36.                         res[id] ??= [idRoom, idSeat++];
  37.                     });
  38.                     idRoom++; // 一个分组排完后排下一个,换到下一个考场
  39.                     idSeat = 1; // 初始化考场座号
  40.                 });
  41.             return res;
  42.         }
  43.         dicCM = arrangeAll(); // 随机分配“语文和数学”考场和座号
  44.         dicLanguage = arrangeGroup(language); // 随机分配“外语”考场和座号
  45.         dicGroup = arrangeGroup(group1); // 随机分配“物化和政史”考场和座号
  46.         dicBG = arrangeGroup(group2); // 随机分配“生物和地理”考场和座号

  47.         Value2 = Value2.map((v, i) => i ? [...v.slice(0, 4), `'${v[4]}`, ...dicCM[v[4]], ...dicLanguage[v[4]], ...dicGroup[v[4]], ...dicBG[v[4]]] : v);
  48.     }
  49. }

  50. function 统计结果() {
  51.     const dic = Sheets('考场').Cells(1).CurrentRegion().slice(1).reduce((a, [, , C, D, , F, , H, , J, , L,]) => {
  52.         [['语数', F], [D, H], [C.substr(0, 2), J], [C.substr(-1, 1), L]].forEach(([k, v]) => {
  53.             a[k] ??= {};
  54.             a[k][v] ??= 0;
  55.             a[k][v]++
  56.         });
  57.         return a;
  58.     }, {});
  59.     const order = ['语数', '西', '日', '英', '物化', '政史', '政', '生', '地'];
  60.     const res = Object.entries(dic).map(([k, v]) => {
  61.         const arr = Object.entries(v).filter(v => v[1] !== 0).sort((a, b) => a[0] - b[0]);
  62.         const brr = Object.values(v).filter(Boolean).sort((a, b) => a - b);
  63.         return [k, `${arr[0][0]}~${arr.at(-1)[0]}`, brr[0]];
  64.     }).sort((a, b) => order.indexOf(a[0]) - order.indexOf(b[0]));
  65.     res.unshift(['学科', '考场范围', '尾考场人数']);
  66.     with (Sheets('考场').Range('T1').Resize(res.length, res[0].length)) {
  67.         CurrentRegion.Clear();
  68.         Value2 = res;
  69.         Borders.LineStyle = xlContinuous;
  70.         HorizontalAlignment = xlHAlignCenter;
  71.     }
  72. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-30 11:18 | 显示全部楼层
你们的考场这么复杂啊,我们都是按组合按成绩排序,学生固定,四选二的科目学生也固定,个别混合考场就分别配对应的试卷。

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-3-30 15:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lcmphy 发表于 2025-3-30 11:18
你们的考场这么复杂啊,我们都是按组合按成绩排序,学生固定,四选二的科目学生也固定,个别混合考场就分别 ...

关键是学校没有教室,有时候一个考场50,有时候48,现在是跨3个楼,教室大小不一致。

TA的精华主题

TA的得分主题

发表于 2025-3-30 17:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个是很好的帖子,踩一下。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-6 18:43 , Processed in 0.021868 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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