Excel VBA高效办公应用-第十一章-教师员工数据管理-Part3 (排座位小程序)

有时候真是怀疑自己的智商,一个排座位算法就耗掉我一个多小时。受不了!

不过,总算是搞定了。



代码如下:

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


示例中的算法已被我注释掉,我的方法为行扫描法,我认为更容易理解。
后记:
这段代码的关键,在于发现行、列变量与源单元格行号之间的对应关系。可以列出几个边界值来辅助快速确立这种关系。没有章法,势必低效,且容易犯错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值