前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起学Excel专业开发23:使用类模块创建对象2

一起学Excel专业开发23:使用类模块创建对象2

作者头像
fanjy
发布2019-11-09 13:19:56
1.2K0
发布2019-11-09 13:19:56
举报
文章被收录于专栏:完美Excel完美Excel

本文是《一起学Excel专业开发22:使用类模块创建对象1》的后续内容。

在《一起学Excel专业开发22:使用类模块创建对象1》中,我们使用类模块创建了自已的对象CCell,通过这个对象可以创建任意多个对象实例,用来分析工作表或者多个区域中的单元格。

创建集合

当存在多个对象实例时,管理它们的最简单方法是将所有对象实例放到一个集合中。我们在VBE中,插入一个标准模块,输入代码:

代码语言:javascript
复制
'声明公共变量
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方法取消这些颜色。

代码语言:javascript
复制
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,输入代码:

代码语言:javascript
复制
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过程:

代码语言:javascript
复制
'声明公共变量
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
图1

下面的程序高亮显示工作表中包含公式的单元格:

代码语言:javascript
复制
Public Sub ShowFormulas()
   gclsCells.Highlight anlCellTypeFormula
   MsgBox "高亮显示公式单元格."
   gclsCells.UnHighlight anlCellTypeFormula
End Sub

下面的程序高亮显示工作表中包含常量的单元格:

代码语言:javascript
复制
Public Sub ShowConstants()
   gclsCells.Highlight anlCellTypeConstant
   MsgBox "高亮显示常量单元格."
   gclsCells.UnHighlight anlCellTypeConstant
End Sub

下面的程序高亮显示工作表中的空单元格:

代码语言:javascript
复制
Public Sub ShowEmpties()
   gclsCells.Highlight anlCellTypeEmpty
   MsgBox "高亮显示空单元格."
   gclsCells.UnHighlight anlCellTypeEmpty
End Sub

下面的程序高亮显示工作表中包含标签的单元格:

代码语言:javascript
复制
Public Sub ShowLabels()
   gclsCells.Highlight anlCellTypeLabel
   MsgBox "高亮显示标签单元格."
   gclsCells.UnHighlight anlCellTypeLabel
End Sub
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档