前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel VBA解读(151): 数据结构——增强集合功能的代码

Excel VBA解读(151): 数据结构——增强集合功能的代码

作者头像
fanjy
发布2019-07-19 16:41:06
9580
发布2019-07-19 16:41:06
举报
文章被收录于专栏:完美Excel

学习Excel技术,关注微信公众号:

excelperfect

集合是一种很有用的数据结构,能够让我们更方便地实现一些程序功能。本文介绍几段代码,能够进一步增强集合的功能。

判断键值是否存在

在集合中,没有内置方法判断键是否已存在。下面的代码检查指定的键是否已存在:

代码语言:javascript
复制
Function KeyIsExists(col AsCollection, key As String) As Boolean
   On Error GoTo ExitHere
   col.Item key
   KeyIsExists = True
ExitHere:
End Function

测试KeyIsExists函数的代码如下:

代码语言:javascript
复制
Sub testKey()
   Dim colMy As New Collection
   colMy.Add Item:="完美Excel", key:="excelperfect"
   colMy.Add Item:="微信公众号", key:="weixin"
   Debug.Print KeyIsExists(colMy, "excelperfect")
   Debug.Print KeyIsExists(colMy, "me")
End Sub

运行结果如下图1所示。

图1

对集合元素进行排序

在集合中,没有内置的排序方法。这里,使用快速排序算法来对集合中的元素排序:

代码语言:javascript
复制
Sub SortToCollection(col AsCollection, lFirst As Long, lLast As Long)
   Dim vMiddle As Variant, vTemp As Variant
   Dim lTempLow As Long
   Dim lTempHi As Long
   lTempLow = lFirst
   lTempHi = lLast
   vMiddle = col((lFirst + lLast) \ 2)
   Do While lTempLow <= lTempHi
        Do While col(lTempLow) < vMiddle AndlTempLow < lLast
            lTempLow = lTempLow + 1
        Loop
        Do While vMiddle < col(lTempHi) AndlTempHi > lFirst
            lTempHi = lTempHi - 1
        Loop
        If lTempLow <= lTempHi Then
            '交换值
            vTemp = col(lTempLow)
            col.Add col(lTempHi),After:=lTempLow
            col.Remove lTempLow
            col.Add vTemp, Before:=lTempHi
            col.Remove lTempHi + 1
            '移到到下一个位置
            lTempLow = lTempLow + 1
            lTempHi = lTempHi - 1
        End If
   Loop
   If lFirst < lTempHi Then SortToCollection col, lFirst, lTempHi
   If lTempLow < lLast Then SortToCollection col, lTempLow, lLast
End Sub

测试SortToCollection过程的代码如下:

代码语言:javascript
复制
Sub testSort()
   Dim colMy As New Collection
   colMy.Add "3"
   colMy.Add "9"
   colMy.Add "2"
   colMy.Add "5"
   colMy.Add "1"
   SortToCollection colMy, 1, colMy.Count
   Dim temp As Variant
   For Each temp In colMy
        Debug.Print temp
   Next temp
End Sub

运行结果如下图2所示。

图2

获取唯一值

可以利用集合的键不能重复的特点,来获取列表中不重复的值。下面的GetUniqueValue函数返回一个集合,其元素内容不重复:

代码语言:javascript
复制
Function GetUniqueValue(ValueList)As Collection
   Dim colUnique As New Collection
   Dim var As Variant
   On Error Resume Next
   For Each var In ValueList
        colUnique.Add var, CStr(var)
   Next var
   Set GetUniqueValue = colUnique
End Function

代码中,给集合添加元素时,键值使用了CStr函数将键值转换成字符串,因为键值只能是字符串。

下面来测试GetUniqueValue函数。如下图3所示的工作表Sheet1的列A中有一系列数据:

图3

下面的代码使用GetUniqueValue函数获取列A中的不重复值:

代码语言:javascript
复制
Sub testUnique()
   Dim rng As Range
   Dim colTemp As Collection
   Dim temp As Variant
   With Worksheets("Sheet1")
        Set rng = .Range("A1", .Range("A1").End(xlDown))
   End With
   Set colTemp = GetUniqueValue(rng)
   For Each temp In colTemp
        Debug.Print temp
   Next temp
End Sub

运行代码的结果如下图4所示。

图4

注意

1.如果要声明遍历集合的变量,则应将其声明为Variant型。

2.不能对集合中已有元素直接重新赋值。

3.集合是对象,因此返回集合时应使用Set来赋值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,助力维护团队卓越代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档