ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 Office知识技巧免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 11741|回复: 20

[原创]多行多列取不重复值(VBA版)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-8-22 14:48 | 显示全部楼层 |阅读模式

加载宏安装:工具----加载宏----浏览----查找文件---OK

GLWoW2UG.rar (10.5 KB, 下载次数: 4145)

[原创]多行多列取不重复值(VBA版)

[原创]多行多列取不重复值(VBA版)

评分

参与人数 1鲜花 +2 收起 理由
FOB_FN_L + 2 值得肯定

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-8-22 14:58 | 显示全部楼层
繁体版: PGkvJgSH.rar (10.36 KB, 下载次数: 124)

TA的精华主题

TA的得分主题

发表于 2007-8-23 09:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-8-25 23:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-9-1 15:11 | 显示全部楼层

收藏 , 謝謝 ANDYSKY 版主提供分享 !!!

[em23][em23][em23][em24][em24][em24][em27][em27][em27]

TA的精华主题

TA的得分主题

发表于 2008-1-22 20:37 | 显示全部楼层

向andysky兄学习,研究了你的去重复值的方法,和狼版的字典的应用,发现andysky的方法还可以提速30多倍,也许还可以更高。

经过测试,在我的电脑上,1万条数据有8000多条不重复的,由6秒多提速到不到0.2秒。

其实也没什么新鲜的,就是将单元格用数组代替了。

文件超过250K了传不上来,发代码吧:

Sub 去重复值()    '支持多区域多行多列
    'On Error Resume Next    '消除选区重复值
    Dim cell As Range, i&, j%, Results As VbMsgBoxResult
    Dim Cn As Integer, Rn&, are As Byte, aa, arr, arr1()
    If Selection.Count = 1 Then MsgBox "请选择要去重复值的区域,再点此按钮。", vbInformation: Exit Sub
    If (Selection.Rows.Count > 1 And Selection.Columns.Count > 1) Or Selection.Areas.Count > 1 Then
        Results = MsgBox("先列后行点击“是(Y)”" & Chr(10) & "先行后列点击“否(N)”", vbYesNo, "取值顺序")
    End If
    aa = Timer
    With CreateObject("Scripting.Dictionary")
        If Results = vbNo Then
            For are = 1 To Selection.Areas.Count
                Set rng = Selection.Areas(are)
                Rn = rng.Rows.Count
                Cn = rng.Columns.Count
                arr = rng
                For i = 1 To Rn
                    For j = 1 To Cn
                        If arr(i, j) <> "" And (Not .Exists(arr(i, j))) Then .Add arr(i, j), ""
                    Next j
                Next i
            Next are
        Else
            For are = 1 To Selection.Areas.Count
                Set rng = Selection.Areas(are)
                Rn = rng.Rows.Count
                Cn = rng.Columns.Count
                arr = rng
                For j = 1 To Cn
                    For i = 1 To Rn
                        If arr(i, j) <> "" And (Not .Exists(arr(i, j))) Then .Add arr(i, j), ""
                    Next i
                Next j
            Next are
        End If
        Selection.ClearContents
        arr = .keys
        ReDim arr1(UBound(arr), 0)
        For i = 0 To UBound(arr)
            arr1(i, 0) = arr(i)
        Next
        'arr = WorksheetFunction.Transpose(.keys) '2000里面不成功
        Selection.Cells(1, 1).Resize(UBound(arr) + 1, 1) = arr1
    End With

    MsgBox "程序共运行了" & Format(Timer - aa, "0.00") & "秒"    '记录程序运行的总时间,timer函数表示当前时间
End Sub

[此贴子已经被作者于2008-1-22 20:49:11编辑过]

TA的精华主题

TA的得分主题

发表于 2009-8-11 23:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-10-23 14:05 | 显示全部楼层
收藏 , 謝謝 ANDYSKY 版主提供分享 !!!

TA的精华主题

TA的得分主题

发表于 2010-12-9 21:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-12 21:54 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

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

GMT+8, 2020-3-28 17:08 , Processed in 0.081775 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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