ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创]VBA筛选非重复值方法比较

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-5-29 13:54 | 显示全部楼层
本帖已被收录到知识树中,索引项:去重复
以下是引用[I]UNARTHUR[/I]在2005-9-2 11:30:26的发言:

t五十步

一种不错的方法!和collection方法异曲同工![em17]

可惜最后赋值不能直接赋值,需要循环,另外中间一个if判断可以取消

谢谢补充!

可以直接赋值的,请看代码 另在我的机子上用错误开关比用Exists快 借用五十步的代码 Sub Uniquedata() Dim d As New Dictionary Dim Arr, c, t Application.ScreenUpdating = False t = Timer p = [a65536].End(xlUp).Row 'Set d = CreateObject("Scripting.Dictionary") Arr = Range("a2:a" & p) For Each c In Arr If Not d.Exists(CStr(c)) Then d.Add CStr(c), c End If Next Sheet1.Range("d2:d" & d.Count - 1) = Application.Transpose(d.Items) t = Timer - t Application.ScreenUpdating = True MsgBox t '0.146秒 End Sub Sub Uniquedata_a() Dim d As New Dictionary Dim Arr, c, t Application.ScreenUpdating = False t = Timer p = [a65536].End(xlUp).Row 'Set d = CreateObject("Scripting.Dictionary") Arr = Range("a2:a" & p) For Each c In Arr On Error Resume Next d.Add CStr(c), c If Not Err.Number = 0 Then Err.Clear On Error GoTo 0 End If Next Sheet1.Range("d2:d" & d.Count - 1) = Application.Transpose(d.Items) t = Timer - t Application.ScreenUpdating = True MsgBox t '0.125秒 End Sub
[此贴子已经被作者于2006-5-29 13:55:23编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-20 08:33 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-20 09:36 | 显示全部楼层

[2006-06-20] 经研究,发现方法5(collection)的代码尚可进一步优化,优化后与其他所有方法相比综合表现最优!暂时不公布答案,感兴趣的朋友不妨先思考一下?

TA的精华主题

TA的得分主题

发表于 2006-6-20 09:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-6-20 12:26 | 显示全部楼层
http://club.excelhome.net/dispbbs.asp?boardid=102&replyid=410633&id=170109&page=1&skin=0&Star=2 楼主早有答案了,看了楼主的出手当时就想到这一帖.试做如下,好在没有多余的代码. Sub 按钮3_单击() t = Timer Dim col As New Collection On Error Resume Next arr = Range("a1:a65536") '目标列转到数组,跑得快 ar = Range("z1:z65536") '随便找个空列,建个数组 For a = 1 To [a65536].End(xlUp).Row col.Add arr(a, 1) & "", arr(a, 1) & "" '处理数值必须要"" Next a For Each xxx In col '集合转到数组 ar(i + 1, 1) = xxx i = i + 1 Next Range("c1:c" & col.Count) = ar '填写表格 MsgBox Timer - t End Sub
[此贴子已经被作者于2006-6-20 12:38:53编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-20 12:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
仔细看了一下1楼的帖子。呵呵,应该是一个1周年贴嘛。

TA的精华主题

TA的得分主题

发表于 2006-6-20 12:45 | 显示全部楼层

又仔细比较了一下,

For a = 1 To [a65536].End(xlUp).Row
col.Add arr(a, 1) & "", arr(a, 1) & "" '处理数值必须要""
Next a
改成

For a = 1 To [a65536].End(xlUp).Row aa = arr(a, 1) & "" '处理数值必须要"" col.Add aa, aa Next a 虽说多了一句代码,但要快一点,10%左右.
[此贴子已经被作者于2006-6-20 12:47:24编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-20 14:25 | 显示全部楼层

ldy888朋友好仔细!被你言中了!奖一朵鲜花,呵呵![em23]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-20 14:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-6-23 17:56 | 显示全部楼层

cstr可以强制将一个表达式转换成某种特定数据类型

楼主功力深厚! 比我的方法又快10%.PFPF

这是学费请笑纳![em24]

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 16:00 , Processed in 0.043433 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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