新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V6.0版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 943|回复: 0

[Excel课程] 使用动态数组去除重复值

[复制链接]
发表于 2020-4-6 12:31:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

x
在使用数组函数将单元格中的文本进行分隔后写入到工作表Sheet1中的A列单元格,但是如果文本中含有大量的重复值,在写入时也会将重复值写入到工作表中,此时可以使用动态数组去除文本中的重复值,如下面的代码所示。
  1. Sub Splitarr()
    " O2 i3 F) s% [% J
  2.      Dim Splarr() As String
      C( n/ ?' {- t3 P4 R4 P- \3 v
  3.      Dim Arr() As String% @8 a# z0 c; l
  4.      Dim Temp() As String
      U% r  |! U4 w& D
  5.      Dim r As Integer
    : G- Q: H: z$ @, H
  6.      Dim i As Integer5 n' Q+ e% d( K" [. j
  7.      On Error Resume Next! A7 Q0 z  V8 @  t: _
  8.      Splarr = Split(Sheet2.Range("a1"), ",")" [9 k2 B0 n5 i8 m! G
  9.      For i = 0 To UBound(Splarr)
    0 a( `8 S" i8 L3 @; n" b7 X
  10.          Temp = Filter(Arr, Splarr(i))* ]+ k! i/ r  r/ j0 a
  11.          If UBound(Temp) < 0 Then
    8 d' \5 X1 s3 A
  12.              r = r + 1
    2 N7 s; V/ A5 t* P( K) j  @
  13.             ReDim Preserve Arr(1 To r)
    9 S' f9 k! U9 r" m5 R; A3 L* i
  14.             Arr(r) = Splarr(i)
    " o6 N1 N1 h/ G& ^2 r8 O
  15.         End If! b! w5 C7 n  \( ?6 y* ~
  16.      Next
    7 ]0 h2 a$ u& a, V
  17.     Sheet1.Range("a1").Resize(r, 1) = Application.Transpose(Arr)
    - u0 }1 a4 {9 W# F
  18. End Sub
复制代码
7 S1 m8 P1 T! }! r4 t
代码解析
Splitarr过程将工作表Sheet2中A1单元格的文本去除重复值后写入到工作表Sheet1中的A列单元格。
第2行代码声明数组Splarr用来保存Sheet2中A1单元格的文本。
第3行代码声明数组Arr用来保存去除重复值后的文本。
第4行代码声明数组Temp用来判断文本是否重复。
第5行代码声明变量r用来保存去除重复值后的文本数量。
第7行代码启动错误处理程序来忽略错误,因为在程序运行到第11行代码会发生下标越界错误。
第8行代码使用Split 函数以Sheet2中A1单元格的文本创建一个下标从零开始的一维数组。关于Split函数请参阅技巧169-2。
第9行代码使用For...Next语句遍历数组Splarr的所有元素。
第10行代码使用Filter函数创建一个数组Temp用来保存以当前Splarr数组的值在Arr数组中的搜索结果。Filter函数返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集,语法如下:
Filter(sourcesrray,match[, include[, compare]])
参数sourcesrray是必需的,要执行搜索的一维字符串数组。
参数match是必需的,要搜索的字符串。
参数include是可选的,Boolean值,表示返回子串是否包含match字符串。如果参数include是True,Filter函数返回的是包含match参数子字符串的数组子集。如果参数include是False,Filter函数返回的是不包含match参数子字符串的数组子集。
参数compare是可选的,所使用的字符串比较类型。
第11行代码根据返回的数组Temp的最大下标来判断当前Splarr数组的值是否重复。在使用使用Filter函数时如果没有相匹配的值,将返回一个空数组,最大下标小于0。
第12行代码如果当前Splarr数组的值不重复则将变量r的值加1。
第13行代码重新定义动态数组大小。ReDim语句,在过程级别中使用,用于为动态数组变量重新分配存储空间,语法如下:
ReDim [Preserve]varname(subscripts) [As type] [, varname(subscripts) [As type]]
参数Preserve是可选的,关键字,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。
参数varname是必需的,变量的名称。
参数subscripts是必需的,数组变量的维数,最多可以定义 60 维的多维数组,使用下面的语法;
[lower To] upper[,[lower To] upper]
第14行代码将不重复值添加到数组Arr中。
第15行代码使用工作表Transpose函数将去除重复值的的文本转置后写入到工作表的A列单元格中。
如果需要将去除重复值的的文本写入到第一行单元格中,可以将第15行代码改成下面的代码:
Sheet1.Range("a1").Resize(1,r) = Arr
如果需要将去除重复值的的文本还是以逗号作为分隔符写入到A1单元格中,可以将第15行代码改成下面的代码:
Sheet1.Range("a1")= Join(Arr, ",")
Join函数返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的,语法如下:
Join(sourcearray[,delimiter])
参数sourcearray是必需的,包含被连接子字符串的一维数组。
参数delimiter是可选的,在返回字符串中用于分隔子字符串的字符,如果忽略则使用空格(" ")来分隔子字符串。: l( L4 X5 z' d: S* z" p
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2026-2-26 21:32 , Processed in 0.073395 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表