Excel精英培训网

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

[已解决]字典法统计重号个数

[复制链接]
发表于 2017-9-25 12:22 | 显示全部楼层 |阅读模式
本帖最后由 zhhait 于 2017-9-25 12:24 编辑

问题描述:

    1、有近8万注号码,现在要分别统计每个号码在这8万注号里的重复个数。如:67134一共重复了4次,则就在每个号码的后面标注次数 4 。号码26669共重复了3次,则在每个号码后标 3 。再如61550在这8万注里只出现了一次,则在这个号码后而标注 1 。

    2、如果用统计函数那会极其的慢,我也曾用 for + 数组  ,也是极其的慢。有没有什么好的方法呢? 可惜我不会用字典,所以请各位大师相助。烦请写出代码并注释。

    3、还有一种思路:就是先将号码 写入到 access表中,再用 sql查询,不知道效果怎么样,因为我也不会这个。如果有大师会这个,也烦请写出代码,我学习一下。

    4、如果现在又输入了一个新号,那么所有号码重复个数又要重新统计一次。
    谢谢!


最佳答案
2017-9-25 13:03
  1. Sub tt()
  2.     Dim i As Long, arr, d As Object, brr
  3.     t = Timer
  4.     Set d = CreateObject("scripting.dictionary")
  5.     arr = Range("b2:c" & Cells(Rows.Count, 2).End(3))
  6.     ReDim brr(1 To UBound(arr), 1 To 1)
  7.     For i = 1 To UBound(arr)
  8.         d("'" & arr(i, 2)) = d("'" & arr(i, 2)) + 1
  9.     Next
  10.     For i = 1 To UBound(arr)
  11.         brr(i, 1) = d("'" & arr(i, 2))
  12.     Next
  13.     [d2].Resize(UBound(brr)) = brr
  14.     [e2].Resize(d.Count) = Application.Transpose(d.Keys) '去重复统计号码
  15.     [f2].Resize(d.Count) = Application.Transpose(d.items) '去重复统计数量
  16.     MsgBox Timer - t
  17. End Sub
复制代码

用一个字典速度还是可以接受的
捕获.PNG

字典法统计重号个数.rar

449.54 KB, 下载次数: 13

发表于 2017-9-25 13:03 | 显示全部楼层    本楼为最佳答案   
  1. Sub tt()
  2.     Dim i As Long, arr, d As Object, brr
  3.     t = Timer
  4.     Set d = CreateObject("scripting.dictionary")
  5.     arr = Range("b2:c" & Cells(Rows.Count, 2).End(3))
  6.     ReDim brr(1 To UBound(arr), 1 To 1)
  7.     For i = 1 To UBound(arr)
  8.         d("'" & arr(i, 2)) = d("'" & arr(i, 2)) + 1
  9.     Next
  10.     For i = 1 To UBound(arr)
  11.         brr(i, 1) = d("'" & arr(i, 2))
  12.     Next
  13.     [d2].Resize(UBound(brr)) = brr
  14.     [e2].Resize(d.Count) = Application.Transpose(d.Keys) '去重复统计号码
  15.     [f2].Resize(d.Count) = Application.Transpose(d.items) '去重复统计数量
  16.     MsgBox Timer - t
  17. End Sub
复制代码

用一个字典速度还是可以接受的
回复

使用道具 举报

 楼主| 发表于 2017-9-25 14:21 | 显示全部楼层
苏子龙 发表于 2017-9-25 13:03
用一个字典速度还是可以接受的

谢谢你帮我解决了这个难题,我认真体会一下这些代码。我要力争早日学会字典。
还有最后需要释放字典占用的内存空间吗?
回复

使用道具 举报

发表于 2017-9-25 14:42 | 显示全部楼层
zhhait 发表于 2017-9-25 14:21
谢谢你帮我解决了这个难题,我认真体会一下这些代码。我要力争早日学会字典。
还有最后需要释放字典占用 ...

set d=nothing
养成习惯最好{:011:}
回复

使用道具 举报

发表于 2017-9-25 15:21 | 显示全部楼层
对于数值型key,可以直接用数组代替字典。
经测试,用数组速度比sql快10倍。
QQ截图20170925152449.png

字典法统计重号个数.rar

566.13 KB, 下载次数: 15

评分

参与人数 1 +1 收起 理由
zhhait + 1 很给力

查看全部评分

回复

使用道具 举报

发表于 2017-9-25 15:24 | 显示全部楼层
另外sql要注意号码的数据类型问题。由于前8个全是数值型,所以提取字符型会出错。必须前8个中包含数值型和字符型才行。5楼附件对第一个数值按文本进行了处理。

评分

参与人数 1学分 +2 收起 理由
hzg303 + 2 学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-9-25 15:35 | 显示全部楼层
grf1973 发表于 2017-9-25 15:21
对于数值型key,可以直接用数组代替字典。
经测试,用数组速度比sql快10倍。

谢谢,我正想了解一下 VBA + sql 相关内容的。我参考练习一下。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 06:24 , Processed in 0.410423 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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