学习Excel技术,关注微信公众号:
excelperfect
本文是《一起学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 = xlNoneEnd Sub
再插入一个新的类模块,将其命名为CCells,输入代码:
Private mcolCells As Collection Private Sub Class_Initialize() Set mcolCells = New CollectionEnd Sub Property Get Count() As Long Count = mcolCells.CountEnd 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.AddressEnd 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 clsCellEnd 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 clsCellEnd 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演示了高亮显示当前工作表中不同类型单元格:
图1
下面的程序高亮显示工作表中包含公式的单元格:
Public Sub ShowFormulas() gclsCells.Highlight anlCellTypeFormula MsgBox "高亮显示公式单元格." gclsCells.UnHighlight anlCellTypeFormulaEnd Sub
下面的程序高亮显示工作表中包含常量的单元格:
Public Sub ShowConstants() gclsCells.Highlight anlCellTypeConstant MsgBox "高亮显示常量单元格." gclsCells.UnHighlight anlCellTypeConstantEnd Sub
下面的程序高亮显示工作表中的空单元格:
Public Sub ShowEmpties() gclsCells.Highlight anlCellTypeEmpty MsgBox "高亮显示空单元格." gclsCells.UnHighlight anlCellTypeEmptyEnd Sub
下面的程序高亮显示工作表中包含标签的单元格:
Public Sub ShowLabels() gclsCells.Highlight anlCellTypeLabel MsgBox "高亮显示标签单元格." gclsCells.UnHighlight anlCellTypeLabelEnd Sub