Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2464|回复: 9

[已解决]不重复数统计(怎样提速)

[复制链接]
发表于 2009-10-2 23:27 | 显示全部楼层 |阅读模式

2f0xfZTQ.rar (160.34 KB, 下载次数: 17)

oXHr0sFf.rar

11.16 KB, 下载次数: 13

不重复数统计(怎样提速)

发表于 2009-10-2 23:35 | 显示全部楼层

p1Dciwml.rar (196.24 KB, 下载次数: 3)
回复

使用道具 举报

发表于 2009-10-2 23:43 | 显示全部楼层    本楼为最佳答案   

还可以在楼上的基础上取出arr1数组等于字典值的语句,这样又可以进一步提速O(∩_∩)O
Option Explicit

Sub 不重复数统计()
Dim i&, arr, t
Dim d As Object
t = Timer
Application.ScreenUpdating = False
Columns("C:D").ClearContents
arr = Range("A1:A" & Range("A65536").End(xlUp).Row)
    '求A列不重复数
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr)
    d(arr(i, 1)) = d(arr(i, 1)) + 1
Next i
[c1].Resize(d.Count, 1) = Application.Transpose(d.keys)
[d1].Resize(d.Count, 1) = Application.Transpose(d.items)
Application.ScreenUpdating = True
MsgBox Timer - t & "秒"
End Sub
回复

使用道具 举报

 楼主| 发表于 2009-10-3 00:05 | 显示全部楼层

谢谢雨狐、suye1010!!

d(arr(i, 1)) = d(arr(i, 1)) + 1这句,原来:

=左边的d(arr(i, 1))表示key;

=右边的d(arr(i, 1))起到了计数的作用呀。

学习啊,我估计没法再快了[em04]

[em27][em27]
回复

使用道具 举报

发表于 2009-10-3 05:39 | 显示全部楼层

学习[em02][em02]
回复

使用道具 举报

发表于 2009-10-3 09:45 | 显示全部楼层

引用字典都快不了

uRwmu9mr.rar (197.47 KB, 下载次数: 1)

回复

使用道具 举报

发表于 2009-10-3 11:05 | 显示全部楼层

Sub 不重复数统计排序()
    Dim i As Integer, k%
    Dim t As Single
    Dim ARR
    Dim arr0(1000, 1)

   
    t = Timer
    Application.ScreenUpdating = False
    Columns(1).Sort Cells(1, 1)
    Columns("C:D").Clear

    ARR = Range("A1:A" & Range("A65536").End(xlUp).Row)

    k = 0
    '求A列不重复数
    arr0(k, 0) = ARR(1, 1)
    arr0(k, 1) = 1
    For i = 2 To UBound(ARR)
        If ARR(i, 1) = ARR(i - 1, 1) Then
            arr0(k, 1) = arr0(k, 1) + 1
            Else
            k = k + 1
            arr0(k, 0) = ARR(i, 1)
            arr0(k, 1) = 1
        End If
    Next i

    [d1].Resize(UBound(arr0) + 1, 2) = arr0
       
   
    Application.ScreenUpdating = True
    MsgBox Timer - t & "秒"
End Sub

回复

使用道具 举报

 楼主| 发表于 2009-10-3 11:42 | 显示全部楼层

谢谢zjxia889!!

原来数组也可累加噢,学习了!

回复

使用道具 举报

发表于 2009-10-4 10:02 | 显示全部楼层

因为你要判断的是数值而非文本值,所以直接以逻辑值判断会比用字典判断占优势。

  1. Sub yy()<br/>&nbsp;&nbsp;&nbsp; Dim rng, i&amp;, j&amp;, t!, ARR<br/>&nbsp;&nbsp;&nbsp; Dim b(1000) As Boolean, c(1000) As Integer<br/>&nbsp;&nbsp;&nbsp; t = Timer<br/>&nbsp;&nbsp;&nbsp; rng = Range([a1], [a65536].End(3))<br/>&nbsp;&nbsp;&nbsp; ReDim ARR(1 To UBound(rng), 1 To 2)<br/>&nbsp;&nbsp;&nbsp; For i = 1 To UBound(rng)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If b(rng(i, 1)) = False Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = j + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c(rng(i, 1)) = j<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b(rng(i, 1)) = True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARR(j, 1) = rng(i, 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARR(j, 2) = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARR(c(rng(i, 1)), 2) = ARR(c(rng(i, 1)), 2) + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next<br/>&nbsp;&nbsp;&nbsp; [e1].Resize(j, 2) = ARR<br/>&nbsp;&nbsp;&nbsp; MsgBox Timer - t<br/>End Sub<br/>
复制代码

回复

使用道具 举报

 楼主| 发表于 2009-10-4 20:25 | 显示全部楼层

谢谢O版!

看晕了,没明白

[em04]
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-4 12:00 , Processed in 0.272292 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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