利用动态数组去除重复值的方法

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华 ,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。

这套字典教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:第二十二讲:利用动态数组去除重复值的方法

【分享成果,随喜正能量】每个人在自己的时区都有自己的步程。不用嫉妒或嘲笑他人。他们都在自己的时区里,你也是!等待正确的行动时机,放轻松。你虽然没有领先但也没有落后。在命运为你安排的属于自己的时区里,一切都准时。。

第二十二讲 利用动态数组去除重复值的方法

大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法。如果文本中含有大量的重复值,此时,如果我们要剔除重复值,该怎么办?用VBA的方法该如何做到呢?我在这讲和下一讲中将解答这个问题,并提供给读者一个可以测试的实例。今日先讲这个内容要用到的知识点。

1 Filter函数说明

这个函数返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集。

语法如下:Filter(sourcesrray, match[, include[, compare]])

参数:

  1. sourcesrray是必须的,要执行搜索的一维字符串数组。

  2. match是必须的,要搜索的字符串。

  3. include是可选的,Boolean值,表示返回子串是否包含match字符串。如果参数include是True,Filter函数返回的是包含match参数子字符串的数组子集。如果参数include是False,Filter函数返回的是不包含match参数子字符串的数组子集。

  4. compare是可选的,所使用的字符串比较类型。

2 ReDim语句说明

这个语句在过程级别中使用,用于为动态数组变量重新分配存储空间。

语法如下:

ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]]

参数:

  1. Preserve是可选的,关键字,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据

  2. varname是必须的,变量的名称。

  3. subscripts是必须的,数组变量的维数,最多可以定义 60 维的多维数组,使用下面的语法;[lower To] upper [,[lower To] upper]

3 利用动态数组去除重复值得实例方案

使用动态数组去除文本中的重复值,如下面的代码所示。

Sub MyNZsz_5() '第22讲 利用数组排重的方法

Dim Splarr() As String

Dim Arr() As String

Dim Temp() As String

Dim r As Integer

Dim i As Integer

On Error Resume Next

Splarr = Split(Sheets("22").Range("a1"), " ")

For i = 0 To UBound(Splarr)

Temp = Filter(Arr, Splarr(i))

If UBound(Temp) < 0 Then

r = r + 1

ReDim Preserve Arr(1 To r)

Arr(r) = Splarr(i)

End If

Next

Sheets("22").Range("a5").Resize(r, 1) = Application.Transpose(Arr)

End Sub

代码的截图:

代码解析:

1) 以上过程将工作表Sheets("22")中A1单元格的文本去除重复值后写入到工作表Sheets("22")中的A列单元格。

2) 第2行代码声明数组Splarr用来保存Sheets("22")中A1单元格的文本。

3) 第3行代码声明数组Arr用来保存去除重复值后的文本。

4) 第4行代码声明数组Temp用来判断文本是否重复。

5) 第5行代码声明变量r用来保存去除重复值后的文本数量。

6) 第7行代码启动错误处理程序来忽略错误,因为在程序运行到第11行代码会发生下标越界错误。

7) 第8行代码使用Split 函数以Sheets("22")中A1单元格的文本创建一个下标从零开始的一维数组。

8) 第9行代码使用For...Next语句遍历数组Splarr的所有元素。

9) 第10行代码使用Filter函数创建一个数组Temp用来保存以当前Splarr数组的值在Arr数组中的搜索结果。

10) 第11行代码根据返回的数组Temp的最大下标来判断当前Splarr数组的值是否重复。在使用Filter函数时,如果没有相匹配的值,将返回一个空数组,最大下标小于0。即:如果没有找到,返回的结果是-1.

11) 第12行代码如果当前Splarr数组的值不重复则将变量r的值加1。

12) 第13行代码重新定义动态数组大小。

13) 第14行代码将不重复值添加到数组Arr中。

14) 第17行代码使用工作表Transpose函数将去除重复值的的文本转置后写入到工作表单元格中。

运行前的截图:很显然有很多的重复数值:

运行后的截图:

今日内容回向:

1 上述代码是否清楚了它的运行过程呢?

2 第7行代码启动错误处理程序来忽略错误,这是为什么呢?

我多年的VBA实践经验,全部浓缩在以下教程中:

相关推荐
酷炫码神4 分钟前
C#运算符
开发语言·c#
小秋学嵌入式-不读研版8 分钟前
C42-作业练习
c语言·开发语言·笔记
休息一下接着来15 分钟前
C++ 条件变量与线程通知机制:std::condition_variable
开发语言·c++·算法
小哈里34 分钟前
【pypi镜像源】使用devpi实现python镜像源代理(缓存加速,私有仓库,版本控制)
开发语言·python·缓存·镜像源·pypi
努力学习的小廉39 分钟前
【C++】 —— 笔试刷题day_29
开发语言·c++·算法
电商数据girl1 小时前
酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论
java·大数据·开发语言·python·json·旅游
天天打码1 小时前
python版本管理工具-pyenv轻松切换多个Python版本
开发语言·python
CircleMouse1 小时前
基于 RedisTemplate 的分页缓存设计
java·开发语言·后端·spring·缓存
ktkiko111 小时前
顶层架构 - 消息集群推送方案
java·开发语言·架构
楠奕1 小时前
python中使用neo4j
开发语言·python·neo4j