EXCEL VBA代码编写问题,新手看下面一段代码,没有注释,看起来很辛苦,哪位高手能给个注释么?谢谢了

代码如下:
Sub MakeGroups()
Application.ScreenUpdating = False
Dim class As Range
Dim Members As Range
groupSize = Int(Range("number_per_group"))
If groupSize < 3 Then
MsgBox "“每组人数”不能少于2人!"
Range("number_per_group").Select
Exit Sub
End If

Set class = Range("A2", Range("A2").End(xlDown))

n = class.Rows.Count

Set Members = Range("e2", Range("f2").Offset(n - 1, 0))
For i = 1 To class.Rows.Count
Members(i, 1) = class(i)
Randomize

Members(i, 2) = Rnd()
Next i

Members.Sort Members.Columns(2)

ActiveSheet.Columns(3).Clear
Range("c1").Select
ActiveCell = "小组"
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
ActiveCell.Font.Bold = True

randomMember = 1
For groupNumber = 1 To n \ Range("number_per_group")
ActiveCell = "小组" & groupNumber
ActiveCell.Font.Bold = True

For groupMember = 1 To groupSize
ActiveCell.Offset(groupMember, 0) = Members(randomMember, 1)
randomMember = randomMember + 1
Next groupMember

ActiveCell.Offset(groupMember + 1, 0).Select
Next groupNumber

leftovers = n - (randomMember - 1)

If leftovers > 1 Then

ActiveCell = "Group " & i
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
Else

ActiveCell.Offset(-1, 0).Select
End If

For i = 1 To leftovers
ActiveCell = Members(randomMember, 1)
ActiveCell.Offset(1, 0).Select
randomMember = randomMember + 1
Next i

ActiveSheet.Columns(5).Clear
ActiveSheet.Columns(6).Clear

Application.ScreenUpdating = True
End Sub

代码中,比如一个Range对象后面用一个数字做参数,上面代码中:class(1) 这种,代表什么意思?像Range("c1") , Range("f1") 这种参数中用小写字母的,是代表单元格C1,F1吗?还是小写字母代表其他意思,没看明白,跪求高手注释详解给我这菜鸟学习学习,万分感激~

CLASS(i)是引用CLASS这个对象集合中的第i个对象
代码中声明了CLASS是RANGE对象集合
并且用 Set class = Range("A2", Range("A2").End(xlDown)) 指明,CLASS是单元格A2到A列最后一个不为零的单元格,是一个纵列单元格集合。通常引用单元格集合对象时,需要指明行坐标和列坐标,即CLASS(行, 列),但由于现在CLASS实际上只是单列单元格集合,所以列坐标可以省略,直接用CLASS(i)代表CLASS中第i行的单元格。
Range属性的参数引用不区分大小写,Range("c1")和Range("C1")是完全一样的。追问

class(i) 是代表class中第i行单元格的值,还是单元格本身?

追答

class(i)是代表class中第i行单元格这个完整对象,继承了这个单元格对象的所有属性、方法

例如:
Set class = Range("A2", Range("A2").End(xlDown)) 指明class是A列的一系列单元格对象集合

于是,class(1)就代表这个集合中的第一个对象,即A1单元格这个对象
class(1)就相当于range("A1")
class(1).value是A1单元格的值
class(1).row是A1单元格的行号
class(1).copy可以复制A1单元格
……

追问

Set Members = Range("e2", Range("f2").Offset(n - 1, 0))

For i = 1 To class.Rows.Count
Members(i, 1) = class(i)
Randomize
Members(i, 2) = Rnd()
Next i
Members.Sort Members.Columns(2)
把class(i)对象赋值给Members(i,1)对象? 赋值的结果是什么?Member(i,1)会得到class(i)的所有属性和方法?比如说,class(1)填入了数值,Member(i,1)都能取到?

追答

这一段只是简单的单元格填充
range对象的默认属性是value
现在,Members和class都是range对象集合
Members(i, 1) = class(i) 就相当于 Members(i, 1).value = class(i).value

只是将单元格class(i)的值填充到单元格Members(i, 1)中
单元格Members(i, 1)具有那个单元格的所有属性,但单元格Members(i, 1)不是单元格class(i)

再解释一下吧
Members是E、F两列的单元格区域,Members(1,1)就是单元格E2
class(1)是单元格A2
Members(1, 1) = class(1) 就是把A2的内容填到E2中

但很明显,Members(1, 1) 不是 class(1),改变class(1)的内容,Members(1, 1) 不会改变

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-21
class(1)应该是个错误吧!
如楼主提供的代码
For i = 1 To class.Rows.Count
根据推测应该是从第1行循环到第class.Rows.Count行,而class.Rows.Count却不能计算出行数。正确的计算行数代码应该类似
ActiveSheet.cells.Rows.Count——当前工作表的所有行数。
比如,03版EXCEL中,计算A列的最后一个数据行数,则可以用代码:
ActiveSheet.cells(Rows.count,1).end(xlUp).Row

ActiveSheet.cells(65536,1).end(xlUp).Row
用行列方式来表示单元格应该这样 cells(h,l)。
至于单元格对象Range("c1")中的单元格c1大小写都没有关系,但一定要用半角双引号括起来!
希望对你有帮助。追问

class.Rows.Count 没错啊,定义出来的一个区域是一列数字,而且程序跑出来的结果都符合预期的,这有什么问题吗?

本回答被网友采纳
第2个回答  2013-03-20
range("c1")
这种用引 号引起的,代表是该字母和数字指定的单元格,即C1单元格。