ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 417|回复: 6

[讨论] 不用字典编程去除单列中重复的数据保留唯一值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-31 17:24 | 显示全部楼层 |阅读模式
今天讨论编程去除单列中重复的数据,保留唯一值,当然用字典实现简单速度快,用菜单命令删除重复项更简单易得.

发这个帖子,主要讨论VBA编程基础知识,看看有没有更好的算法实现.感兴趣的请顶一下.

image.png

我先发两段程序,已经测试,正常运行.代码如下:


  1. '利用一个数组时间复杂度高,慢
  2. Sub 去除单列中重复项1()
  3.     Dim arr
  4.     Dim i, j, m, max_row As Long
  5.     t = Timer
  6.     max_row = Range("a1008888").End(xlUp).Row - 1
  7.     arr = WorksheetFunction.Transpose([a2].Resize(max_row, 1))
  8.       
  9.    '查找去除单列中重复值
  10.     For i = 1 To max_row
  11.         If arr(i) = Chr(0) Then Exit For
  12.         For j = max_row To i + 1 Step -1
  13.             If arr(i) = arr(j) Then
  14.                 m = j
  15.                 Do While m < max_row
  16.                     arr(m) = arr(m + 1): m = m + 1
  17.                 Loop
  18.                 arr(m) = Chr(0) '清空并设置标志
  19.             End If
  20.         Next j
  21.     Next i
  22.    
  23.     Range("c2:c" & max_row).Clear
  24.     Range("c2").Resize(max_row, 1) = WorksheetFunction.Transpose(arr)
  25.     Erase arr

  26.     MsgBox Timer - t

  27. End Sub



  28. '利用临时数组中转,空间复杂度高,较快

  29. Sub 去除单列中重复项2()
  30.     Dim arr, arr_temp()
  31.     Dim i, j, m, g, max_row As Long
  32.     t = Timer
  33.     max_row = Range("a1008888").End(xlUp).Row - 1
  34.     arr = WorksheetFunction.Transpose([a2].Resize(max_row, 1))
  35.       
  36.    '查找单列中重复值并清空
  37.     For i = 1 To max_row
  38.         For j = i + 1 To max_row
  39.             If arr(i) = arr(j) Then
  40.                 arr(j) = Chr(0)
  41.             End If
  42.         Next j
  43.     Next i
  44.    
  45.     '将不重复值放入临时数组
  46.     For i = 1 To max_row
  47.         If arr(i) <> Chr(0) Then
  48.             g = g + 1
  49.             ReDim Preserve arr_temp(1 To g)
  50.             arr_temp(g) = arr(i)
  51.         End If
  52.     Next i
  53.    
  54.     Range("e2:e" & max_row).Clear
  55.     Range("e2").Resize(g, 1) = WorksheetFunction.Transpose(arr_temp)
  56.     Erase arr, arr_temp
  57.    
  58.     MsgBox Timer - t

  59. End Sub

复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-31 17:28 | 显示全部楼层
本帖最后由 吴中泉 于 2023-3-31 17:33 编辑

实际测试5000行单列有重复数据,两段程序都在1秒左右,差不多.

不用字典编程去除单列中重复的数据.zip

17.88 KB, 下载次数: 12

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-4 14:47 | 显示全部楼层
  1. '利用一个自定义集合时间复杂度低,非常快,和用字典相当
  2. Sub 去除单列中重复项()
  3.     Dim arr, brr, nums As New Collection
  4.     Dim i, max_row As Long
  5.     't = Timer
  6.     max_row = Range("a1008888").End(xlUp).Row - 1
  7.     arr = [a2].Resize(max_row, 1)
  8.       
  9.    '用自定义集合去除单列中重复值
  10.     On Error Resume Next
  11.     For i = 1 To max_row
  12.         nums.Add arr(i, 1), CStr(arr(i, 1))
  13.     Next i
  14.    
  15.     '写入J列
  16.     Range("j2:j" & max_row).Clear
  17.     ReDim brr(1 To nums.Count)
  18.     i = 1
  19.     For Each Item In nums
  20.         brr(i) = Item: i = i + 1
  21.     Next
  22.     Range("j2").Resize(nums.Count, 1) = _
  23.         WorksheetFunction.Transpose(brr)
  24.     Erase arr
  25.     Set nums = Nothing

  26.     'MsgBox Timer - t

  27. End Sub



复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-4 14:50 | 显示全部楼层
本帖最后由 吴中泉 于 2023-4-4 15:37 编辑

用自定义集合只是一个思路,实际用到这里不如字典方便,虽然速度差不多。

TA的精华主题

TA的得分主题

发表于 2023-4-25 16:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
RemoveDuplicates
系统自带的函数不用,搞那么复杂

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-25 16:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-4-25 22:44 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-3 04:41 , Processed in 0.033808 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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