|
- Option Explicit
- Sub 考场编排()
- ' 定义常量:考场标准人数和尾考场人数
- Const 考场标准人数% = 45, 尾考场人数% = 8
- ' 声明变量:数组arr,最后一行号lastRow,循环变量i和j,字典对象d,专业名称,考场数,考场号
- Dim arr(), lastRow&, i&, j&, d As Object, 专业, 考场数%, 考场号%
- ' 创建字典对象
- Set d = CreateObject("scripting.dictionary")
- ' 使用Sheet1工作表
- With Sheet1
- ' 获取最后一行的行号
- lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
- ' 将A1到D列最后一行的数据赋值给数组arr
- arr = .Range("a1:d" & lastRow).Value
- ' 遍历数组arr,从第二行开始
- For i = 2 To UBound(arr)
- ' 获取当前行的专业名称
- 专业 = arr(i, 2)
- ' 如果字典中不存在该专业,则添加到字典中,并创建一个集合
- If Not d.exists(专业) Then
- Set d(专业) = New Collection
- d(专业).Add i
- Else
- ' 如果字典中已存在该专业,则将当前行号添加到集合中
- d(专业).Add i
- End If
- Next
- ' 遍历字典中的每个专业
- For Each 专业 In d.keys
- ' 计算该专业的考场数
- 考场数 = IIf((d(专业).Count Mod 考场标准人数) <= 尾考场人数, d(专业).Count \ 考场标准人数, d(专业).Count \ 考场标准人数% + 1)
- ' 遍历每个考场,除了最后一个考场
- For i = 1 To 考场数 - 1
- ' 增加考场号
- 考场号 = 考场号 + 1
- ' 遍历每个考场的标准人数
- For j = 1 To 考场标准人数
- ' 更新数组arr中的考场号和座位号
- arr(d(专业)(1), 3) = 考场号
- arr(d(专业)(1), 4) = j
- ' 从集合中移除已处理的行号
- d(专业).Remove 1
- Next
- Next
- ' 处理最后一个考场
- 考场号 = 考场号 + 1
- ' 遍历最后一个考场中的所有学生
- For i = 1 To d(专业).Count
- ' 更新数组arr中的考场号和座位号
- arr(d(专业)(i), 3) = 考场号
- arr(d(专业)(i), 4) = i
- Next
- Next
- ' 清除G1单元格开始的区域内容
- .[G1].Resize(UBound(arr), UBound(arr, 2)).ClearContents
- ' 将更新后的数组arr内容写入G1单元格开始的区域
- .[G1].Resize(UBound(arr), UBound(arr, 2)) = arr
- End With
- End Sub
复制代码 |
|