本文是《一起学Excel专业开发22:使用类模块创建对象1》的后续内容。
在《一起学Excel专业开发22:使用类模块创建对象1》中,我们使用类模块创建了自已的对象CCell,通过这个对象可以创建任意多个对象实例,用来分析工作表或者多个区域中的单元格。
创建集合
当存在多个对象实例时,管理它们的最简单方法是将所有对象实例放到一个集合中。我们在VBE中,插入一个标准模块,输入代码:
'声明公共变量
Public gcolCells As Collection
Public Sub CreateCellsCollection()
Dim clsCell As CCell
Dim rngCell As Range
'创建新的Cells集合
Set gcolCells = New Collection
'对所选区域中的每个单元格创建Cell对象
For Each rngCell In Application.Selection
Set clsCell = New CCell
Set clsCell.Cell = rngCell
clsCell.Analyze
'添加Cell到集合
gcolCells.Add Item:=clsCell, Key:=rngCell.Address
Next rngCell
'显示存储的Cell对象的数量
MsgBox "存储的单元格数量:" & CStr(gcolCells.Count)
End Sub
在CreateCellsCollection过程中,Set gcolCells = New Collection创建了一个新的集合实例。然后,For Each循环遍历所选区域的每个单元格,Set clsCell = New CCell为每个单元格创建一个CCell对象实例,集合对象的Add方法将这些实例添加到集合中,集合中每个元素项的关键字为单元格地址。
集合对象是VBA提供的内置对象,可用来保存对象和数据。集合对象对于存放在其中的数据的类型没有任何限制,不同类型的数据也可以存放在同一个集合对象中。集合对象有4种基本方法:
1.Add方法:添加集合元素项
2.Count方法:统计集合元素项数量
3.Item方法:获取集合元素
4.Remove方法:删除集合元素
可以通过下列方式来访问集合中的对象:
1.使用For Each循环语句逐个访问集合中的对象。
2.通过位置或关键字来访问集合中的单个对象。
注意,Item方法是集合对象的默认方法,因此对于上文中的示例,可使用下列代码访问特定的Cell对象:
SetrngCell = gcolCells(3) ‘访问集合中的第3个元素
SetrngCell = gcolCells(“$A$3”) ‘访问集合中关键字为$A$3的元素
我们可以控制添加到集合中的对象的类型,也可以在集合中添加一些新方法,例如,使用一个方法来高亮显示相同类型的单元格,再用另一个方法来取消这些高亮显示。
在CCell类模块中,增加两个新的方法。Highlight方法根据CellType的值对Cell对象添加颜色;UnHighlight方法取消这些颜色。
Public Sub Highlight()
Cell.Interior.ColorIndex = Choose(muCellType + 1, 5, 6, 7, 8)
End Sub
Public Sub UnHighlight()
Cell.Interior.ColorIndex = xlNone
End Sub
再插入一个新的类模块,将其命名为CCells,输入代码:
Private mcolCells As Collection
Private Sub Class_Initialize()
Set mcolCells = New Collection
End Sub
Property Get Count() As Long
Count = mcolCells.Count
End Property
Property Get Item(ByVal vID As Variant)As CCell
Set Item = mcolCells(vID)
End Property
Public Sub Add(ByRef rngCell As Range)
Dim clsCell As CCell
Set clsCell = New CCell
Set clsCell.Cell = rngCell
clsCell.Analyze
mcolCells.Add Item:=clsCell, Key:=rngCell.Address
End Sub
Public Sub Highlight(ByVal uCellType AsanlCellType)
Dim clsCell As CCell
For Each clsCell In mcolCells
If clsCell.CellType = uCellType Then
clsCell.Highlight
End If
Next clsCell
End Sub
Public Sub UnHighlight(ByVal uCellType AsanlCellType)
Dim clsCell As CCell
For Each clsCell In mcolCells
If clsCell.CellType = uCellType Then
clsCell.UnHighlight
End If
Next clsCell
End Sub
在CCells类模块中,集合对象变量mcolCells声明为私有的、模块级类型,Initialize过程对其进行实例化。
由于集合对象对于外部是不可见的,因此编写自已的Add方法,并且还创建Count和Item属性过程用于表示集合中的对应属性。将Item属性过程的输入参数声明为Variant型,使之既可以根据数值型的索引值,又可以根据字符型的关键字来获取相应的集合成员。
Highlight方法通过循环语句遍历集合中的每个成员,如果CCell对象的CellType属性和参数uCellType指定的类型值相同,则执行CCell对象的Highlight方法。同理,UnHighlight方法通过循环语句遍历集合中的每个成员,如果CCell对象的CellType属性和参数uCellType指定的类型值相同,则执行CCell对象的UnHighlight方法。
为了能引用新创建的自定义集合类,我们修改本文最开始的CreateCellsCollection过程:
'声明公共变量
Public gclsCells As CCells
Public Sub CreateCellsCollection()
Dim clsCell As CCell
Dim lIndex As Long
Dim lCount As Long
Dim rngCell As Range
'创建新的Cells集合
Set gclsCells = New CCells
'对当前工作表中已使用区域中的每个单元格创建Cell对象
For Each rngCell In Application.ActiveSheet.UsedRange
gclsCells.Add rngCell
Next rngCell
'统计集合中公式单元格的数量
For lIndex = 1 To gclsCells.Count
If gclsCells.Item(lIndex).CellType = anlCellTypeFormula Then
lCount = lCount + 1
End If
Next lIndex
MsgBox "公式单元格数量:" & CStr(lCount)
End Sub
在上述代码中,声明了名为gclsCells的公共对象变量,用于存放自定义的CCells集合。CreateCellsCollection过程先将gclsCell实例化,使用For Each循环将当前工作表所使用区域内的单元格添加到集合中,然后统计集合中包含公式的单元格数目并显示统计结果。
下图1演示了高亮显示当前工作表中不同类型单元格:
下面的程序高亮显示工作表中包含公式的单元格:
Public Sub ShowFormulas()
gclsCells.Highlight anlCellTypeFormula
MsgBox "高亮显示公式单元格."
gclsCells.UnHighlight anlCellTypeFormula
End Sub
下面的程序高亮显示工作表中包含常量的单元格:
Public Sub ShowConstants()
gclsCells.Highlight anlCellTypeConstant
MsgBox "高亮显示常量单元格."
gclsCells.UnHighlight anlCellTypeConstant
End Sub
下面的程序高亮显示工作表中的空单元格:
Public Sub ShowEmpties()
gclsCells.Highlight anlCellTypeEmpty
MsgBox "高亮显示空单元格."
gclsCells.UnHighlight anlCellTypeEmpty
End Sub
下面的程序高亮显示工作表中包含标签的单元格:
Public Sub ShowLabels()
gclsCells.Highlight anlCellTypeLabel
MsgBox "高亮显示标签单元格."
gclsCells.UnHighlight anlCellTypeLabel
End Sub