大家好,今天的VBA数组和预解决方案22讲座:我将继续讨论如何在VBA中使用动态数组,以及如何使用动态数组消除重复值。
如果文本中含有大量的重复值,此时,如果我们要剔除重复值,该怎么办?用VBA的方法该如何做到呢?我在这讲和下一讲中将解答这个问题,并提供给读者一个可以测试的实例。今日先讲这个内容要用到的知识点。
一 :Filter函数:这个函数返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集,语法如下:Filter(sourcesrray, match[, include[, compare]])
参数
a) sourcesrray是必须的,要执行搜索的一维字符串数组。
b) match是必须的,要搜索的字符串。
c) include是可选的,Boolean值,表示返回子串是否包含match字符串。如果参数include是True,Filter函数返回的是包含match参数子字符串的数组子集。如果参数include是False,Filter函数返回的是不包含match参数子字符串的数组子集。
d) compare是可选的,所使用的字符串比较类型。
二:ReDim语句,这个语句在过程级别中使用,用于为动态数组变量重新分配存储空间,语法如下:
ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]]
参数
a) Preserve是可选的,关键字,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。
b) varname是必须的,变量的名称。
c) subscripts是必须的,数组变量的维数,最多可以定义 60 维的多维数组,使用下面的语法;[lower To] upper [,[lower To] upper]
使用动态数组去除文本中的重复值,如下面的代码所示。
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) = A(Arr)
End Sub
代码解析:
MySplitarr过程将工作表Sheets("22")中A1单元格的文本去除重复值后写入到工作表Sheets("22")中的A列单元格。
第2行代码声明数组Splarr用来保存Sheets("22")中A1单元格的文本。
第3行代码声明数组Arr用来保存去除重复值后的文本。
第4行代码声明数组Temp用来判断文本是否重复。
第5行代码声明变量r用来保存去除重复值后的文本数量。
第7行代码启动错误处理程序来忽略错误,因为在程序运行到第11行代码会发生下标越界错误。
第8行代码使用Split 函数以Sheets("22")中A1单元格的文本创建一个下标从零开始的一维数组。
第9行代码使用For…Next语句遍历数组Splarr的所有元素。
第10行代码使用Filter函数创建一个数组Temp用来保存以当前Splarr数组的值在Arr数组中的搜索结果。
第11行代码根据返回的数组Temp的最大下标来判断当前Splarr数组的值是否重复。在使用使用Filter函数时如果没有相匹配的值,将返回一个空数组,最大下标小于0。如果没有找到,返回的结果是-1.
第12行代码如果当前Splarr数组的值不重复则将变量r的值加1。
第13行代码重新定义动态数组大小。
第14行代码将不重复值添加到数组Arr中。
第15行代码使用工作表Transpose函数将去除重复值的的文本转置后写入到工作表单元格中。
代码的截图:
运行前的截图:很显然有很多的重复数值:
运行后的截图:
今日内容回向:
1 上述代码是否清楚了它的运行过程呢?
2 第7行代码启动错误处理程序来忽略错误,这是为什么呢?
1.文章《如何返回二维数组 如何返回一个二维数组…》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《如何返回二维数组 如何返回一个二维数组…》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好