ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助代码,取重复值并显示所在行号

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-20 17:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢老师,您的代码正是我需要的,好用,再次谢谢!!!

TA的精华主题

TA的得分主题

发表于 2016-11-20 17:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ykqrs 发表于 2016-11-20 17:03
没有这个意思,我是说我写的啰嗦,呵呵,VBA也是近一两年才慢慢接触

呵呵,跟您们的代码一对比,我就恨不得找个地洞钻进去啦,惭愧。

TA的精华主题

TA的得分主题

发表于 2016-11-20 18:36 | 显示全部楼层
字典套个数组。练习下。。
  1. Sub 找重复值()
  2. Dim d As Object, arr, ar(0 To 6), m, ds
  3. Set d = VBA.CreateObject("Scripting.dictionary")
  4. arr = Range("a1:a" & Cells(Rows.Count, 1).End(3).Row)
  5. For i& = 2 To UBound(arr)
  6.     If Not d.Exists(arr(i, 1)) Then
  7.         ar(0) = 1: ar(ar(0)) = i: d(arr(i, 1)) = ar
  8.     Else
  9.         m = d(arr(i, 1)): m(0) = m(0) + 1: m(m(0)) = i: d(arr(i, 1)) = m
  10.     End If
  11. Next i
  12. For Each ds In d.Keys
  13. If d(ds)(0) = 1 Then d.Remove ds
  14. Next ds
  15. [c2:k65536].ClearContents
  16. [C2].Resize(d.Count) = WorksheetFunction.Transpose(d.Keys)
  17. [D2].Resize(d.Count, 7) = Application.Rept(d.Items, 1)
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-20 19:56 | 显示全部楼层

谢谢您了,我测试了一下,当数据源达到1400行时,用时是33秒,太慢了,我之前做的用时是0,2秒,我嫌慢才来求助的,18楼的快,同样1400行的数据源,我实测用时是0.07秒

TA的精华主题

TA的得分主题

发表于 2016-11-20 20:00 | 显示全部楼层
lzqmsy 发表于 2016-11-20 19:56
谢谢您了,我测试了一下,当数据源达到1400行时,用时是33秒,太慢了,我之前做的用时是0,2秒,我嫌慢才来求助 ...

呵呵,我是初学者,还请老师多多指导。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-20 20:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
fxl447098457 发表于 2016-11-20 18:36
字典套个数组。练习下。。

谢谢,但试验不成功

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-11-20 20:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jsgj2023 发表于 2016-11-20 20:00
呵呵,我是初学者,还请老师多多指导。

Sub 试验()
tt = Timer
Dim d As Object, i%, arr, brr()
Set d = CreateObject("scripting.dictionary")
arr = Sheet1.Range("A1").CurrentRegion
For i = 1 To UBound(arr)
    If Not d.Exists(arr(i, 1)) Then
        ReDim brr(1 To 3)
        brr(1) = arr(i, 1)
    Else
        brr = d(arr(i, 1))
    End If
    brr(2) = brr(2) + 1
    brr(3) = brr(3) & i & ","
    d(arr(i, 1)) = brr
Next
For Each aa In d.keys
    If d(aa)(2) = 1 Then
       d.Remove (aa)
    End If
Next
Range("A4").Resize(d.Count, 3) = Application.Transpose(Application.Transpose(d.Items))
MsgBox Timer - tt
End Sub
数据源1412行,仅用0.03125秒,是目前最快的代码了

TA的精华主题

TA的得分主题

发表于 2016-11-20 20:53 | 显示全部楼层
lzqmsy 发表于 2016-11-20 20:43
Sub 试验()
tt = Timer
Dim d As Object, i%, arr, brr()

学习了,十分精妙。

TA的精华主题

TA的得分主题

发表于 2016-11-20 21:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wzsy2_mrf 于 2016-11-20 21:09 编辑
  1. Sub test()
  2.     Dim r%, i%, arr, brr, mkey
  3.     Set d = CreateObject("scripting.dictionary")
  4.     r = Cells(Rows.Count, 1).End(xlUp).Row
  5.     arr = Range("a1:a" & r)
  6.     For i = 2 To UBound(arr)
  7.         If Not d.exists(arr(i, 1)) Then
  8.             d(arr(i, 1)) = i
  9.         Else
  10.             d(arr(i, 1)) = d(arr(i, 1)) & "," & i
  11.         End If
  12.     Next
  13.     ReDim brr(1 To d.Count, 1 To 3)
  14.     i = 0
  15.     For Each mkey In d.keys
  16.         r = UBound(Split(d(mkey), ","))
  17.         If r > 0 Then
  18.             i = i + 1: brr(i, 1) = mkey: brr(i, 2) = r + 1: brr(i, 3) = d(mkey)
  19.         End If
  20.     Next
  21.     Range("i2").Resize(10000, UBound(brr, 2)).Clear
  22.     Range("i2").Resize(i, UBound(brr, 2)) = brr
  23.     Range("i2").Resize(i, UBound(brr, 2)).Borders.LineStyle = xlContinuous
  24.     Erase arr, brr: Set d = Nothing
  25. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2016-11-20 21:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 Vicel 于 2016-11-20 21:35 编辑
lzqmsy 发表于 2016-11-20 20:43
Sub 试验()
tt = Timer
Dim d As Object, i%, arr, brr()


刚才的代码有误,更正一下
Sub test()
    Dim ar, br(), d As Object, i&, j&, n&
    t = Timer
    Set d = CreateObject("scripting.dictionary")
    ar = Sheets("数据").[A1].CurrentRegion
    ReDim br(1 To UBound(ar), 1 To 3)
    For i = 2 To UBound(ar)
        If Not d.exists(ar(i, 1)) Then
            d(ar(i, 1)) = i
        Else
            If InStr(d(ar(i, 1)), ",") = 0 Then
                n = n + 1
                d(n) = ar(i, 1)
            End If
            d(ar(i, 1)) = d(ar(i, 1)) & "," & i
        End If
    Next i
    For i = 1 To n
        br(i, 3) = d(d(i))
        br(i, 1) = d(i)
        ar = Split(br(i, 3), ",")
        br(i, 2) = UBound(ar) + 1
    Next i
    [I2].Resize(n, 3) = br
    Set d = Nothing
    MsgBox Timer - t
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 14:40 , Processed in 0.047037 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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