ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求助:帮忙使用VBA安排考场,不胜感激!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-19 23:50 | 显示全部楼层
JS代码,这个问题还挺麻烦的
  1. function 考场安排(){
  2.         const arr=Sheets.Item("考场号和座位号安排").Range("a1").CurrentRegion.Value2;
  3.         let obj={};
  4.         let st=arr.slice(1).reduce((st,[,a,b],i)=>{
  5.                 return obj[a]=i+1, st.add(b), st;
  6.         },new Set());
  7.         st.forEach(kd=>{
  8.                 let ksarr=arr.filter(([,,b])=>b==kd);                //筛选点的考生
  9.                 let ksct=Math.ceil(ksarr.length/30);
  10.                 let dic={};
  11.                 for (let k=1;k<=ksct;k++){
  12.                         let temp=[[`第${k}考场考试座位安排表`],["前门","讲台"],...Array.from(Array(7),x=>Array(4)),["后门","",,,]];
  13.                         let zw=0;
  14.                         for (let j=3;j>=0;j--){
  15.                                 for (let i=2;i<=9;i++){
  16.                                         if (ksarr.length!=0 && temp[i][j]==null){
  17.                                                 let n=parseInt(Math.random()*ksarr.length);                //随机抽取
  18.                                                 temp[i][j]=ksarr.splice(n,1)[0][1];
  19.                                                 let m=obj[temp[i][j]];
  20.                                                 arr[m][3]=`${String(k).padStart(2,0)}${String(++zw).padStart(2,0)}`;                //准考证号
  21.                                         }
  22.                                 }
  23.                         }
  24.                         dic[k]=temp;
  25.                 }
  26.                 Sheets.Add(null,Sheets.Item(Sheets.Count)).Name=kd;
  27.                 for (let key in dic){
  28.                         let rng=Range("a"+ Rows.Count).End(xlUp);
  29.                         rng=rng.Row==1?rng:rng.Offset(2,0);
  30.                         let temp=dic[key];
  31.                         rng.Resize(10,4).Value2=temp;
  32.                         rng.Resize(10,4).HorizontalAlignment=xlHAlignCenter;
  33.                         rng.Resize(10,4).Borders.LineStyle=1;
  34.                         [[1,1,1,3],[0,0,1,4]].forEach(([a,b,c,d])=>rng.Offset(a,b).Resize(c,d).Merge());
  35.                 }
  36.         })
  37.         Sheets.Item("考场号和座位号安排").Range("a1").CurrentRegion.Value2=arr;                //填入准考证号
  38. }
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-19 23:51 | 显示全部楼层
附件,WPS打开测试

求助:随机考场和座位安排.rar

19.46 KB, 下载次数: 18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-20 00:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-20 09:53 | 显示全部楼层
wang-way 发表于 2024-6-20 00:11
看着代码量好吓人

学习阶段,堆代码先出效果再说

TA的精华主题

TA的得分主题

发表于 2024-6-20 10:09 | 显示全部楼层
Sub 生成考号()
Application.ScreenUpdating = False
Dim ar As Variant
Dim br()
Dim d As Object
Set d = CreateObject("scripting.dictionary")
With Sheets("考场号和座位号安排")
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    If r < 2 Then MsgBox "考场号和座位号安排为空!": End
    .Range("d2:d" & r) = Empty
    ar = .Range("a1:d" & r)
    For i = 2 To UBound(ar)
        If ar(i, 3) <> "" Then
            If Not d.exists(ar(i, 3)) Then Set d(ar(i, 3)) = CreateObject("scripting.dictionary")
            d(ar(i, 3))(i) = ""
        End If
    Next i
    .Range("a2:d" & r) = Empty
    For Each k In d.keys
        n = 0
        ReDim br(1 To UBound(ar), 1 To UBound(ar, 2))
        For Each kk In d(k).keys
            n = n + 1
            For j = 1 To 3
                br(n, j) = ar(kk, j)
            Next j
            br(n, 4) = WorksheetFunction.RandBetween(0, d(k).Count) '工作表随机函数
        Next kk
        For i = 1 To n
            For s = i + 1 To n
                If br(i, 4) > br(s, 4) Then
                    For j = 1 To 4
                        ff = br(i, j)
                        br(i, j) = br(s, j)
                        br(s, j) = ff
                    Next j
                End If
            Next s
        Next i
        m = 0
        For i = 1 To n Step 30
            m = m + 1
            t = 0
            For s = i To i + 29
                If s <= n Then
                    t = t + 1
                    br(s, 4) = Format(m, "00") & Format(t, "00")
                End If
            Next s
        Next i
        rs = .Cells(Rows.Count, 1).End(xlUp).Row + 1
        .Cells(rs, 1).Resize(n, UBound(br, 2)) = br
    Next k
End With
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-20 10:09 | 显示全部楼层
求助:随机考场和座位安排.rar (17.01 KB, 下载次数: 16)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-20 10:10 | 显示全部楼层
同一个考点内的考生随机打散安排考号,供参考

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-20 11:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

非常感谢,有心了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-20 11:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-20 11:08 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 19:01 , Processed in 0.034456 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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