有时候真是怀疑自己的智商,一个排座位算法就耗掉我一个多小时。受不了!
不过,总算是搞定了。
代码如下:
Option Explicit
Sub pai()
Range("A3:C38").Sort key1:=Range("C3") '按视力排序
'增加新表在"视力表"工作表之后
' Sheets.Add after:=Sheets("视力表")
' '新表的名字定义为座位表
' ActiveSheet.Name = "座位表4"
'询问要分几级
Dim Izu As Integer '定义表示组数的变量Izu
'Val函数将字符转换为数字
'将输入的数字赋给变量Izu
Izu = Val(InputBox("您想将学生分为几组?"))
paiwei (Izu) '调用Paiwei函数给学生排位
Sheets("座位表").Activate '激活"座位表工作表"
End Sub
Sub paiwei(Iz As Integer)
Dim i As Integer, j As Integer '定义循环变量
'激活"视力表"工作表
Sheets("视力表").Activate
'定义座位表行变量,列变量,及"视力表"学生行变量
Dim Irows As Integer, Icols As Integer, Ixs As Integer
Irows = 36 / Iz + 1 '初始化行变量
Icols = Iz '初始化列变量
Ixs = 3 '初始化"视力表"学生行变量
'For i = 1 To Icols
' '第一个学生是从第3行开始的
' '每组学生都从下一个开始选取
' Ixs = i + 2
' '空出两行,画一个讲桌
' For j = 3 To Irows + 3
' '给座位表赋值
' Sheets("座位表3").Cells(j, i) = Sheets("视力表").Cells(Ixs, 2)
' '下一个学生为当前第Iz个学生
' Ixs = Ixs + Iz '
' Next j
'Next i
For i = 3 To Irows + 2
'第一个学生是从第3行开始的
'空出两行,画一个讲桌
For j = 1 To Icols
'给座位表赋值
Sheets("座位表").Cells(i, j) = Sheets("视力表").Cells(Ixs, 2)
'下一个学生为当前第Iz个学生
Ixs = Ixs + 1 '
Next j
Ixs = (i - 2) * Icols + 3
Next i
End Sub
示例中的算法已被我注释掉,我的方法为行扫描法,我认为更容易理解。
后记:
这段代码的关键,在于发现行、列变量与源单元格行号之间的对应关系。可以列出几个边界值来辅助快速确立这种关系。没有章法,势必低效,且容易犯错。