Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: bai7190

[已解决]百万行的数据,如何能够快速标记某列中单元格的重复数???求大神指教!!!

[复制链接]
发表于 2016-11-25 15:22 | 显示全部楼层
本帖最后由 香川群子 于 2016-11-25 15:23 编辑
望帝春心 发表于 2016-11-25 13:03
谢谢香川老师!如果方便还请给段示例代码,再次感谢

简单示例代码如下:

  1. Sub test1()

  2.     m = [e65536].End(3).Row - 1 'E列最大行数
  3.     arr = [e2].Resize(m) '读取E列身份证数据
  4.    
  5.     Set d = CreateObject("scripting.dictionary")
  6.     '设置第1级字典 仅以省市区的前6位码 作为key
  7.    
  8.     For i = 1 To m
  9.         t = arr(i, 1): t1 = Left(t, 6): t2 = Mid(t, 7)
  10.         '读取身份证号码 并拆分为前6位t1 和后12位t2

  11.         If Not d.Exists(t1) Then Set d(t1) = CreateObject("scripting.dictionary")
  12.         '如果该省市区码在1级字典为空 则加入1级字典并设置2级嵌套字典

  13.         d(t1)(t2) = d(t1)(t2) + 1
  14.         '在对应2级嵌套字典中存入后12位t2作为关键字 并以此进行去重复统计
  15.     Next

  16.     For i = 1 To m
  17.         t = arr(i, 1): t1 = Left(t, 6): t2 = Mid(t, 7)
  18.        '遍历原始数据
  19.       
  20.        arr(i, 1) = d(t1)(t2)
  21.        '按分级字典关键字t1、t2读取嵌套字典中的统计结果
  22.     Next
  23.    
  24.     [f2].Resize(m) = ""  '清空输出区域
  25.     [f2].Resize(m) = arr '输出结果
  26.    
  27.     '以下为对嵌套字典 分级效果的统计
  28.     kr = d.keys
  29.     For i = 0 To d.Count - 1
  30.         kr(i) = kr(i) & " = " & d(kr(i)).Count
  31.     Next
  32.     MsgBox Join(kr, vbCr)
  33. '列出以省市区6位码为关键字的第1级字典中对应各个嵌套字典中的不重复项目个数
  34.    
  35. End Sub
复制代码



当然,为了提高运算效率,还有很多细节需要处理改善,
但这样一来,可能不了解的看了反而不容易理解代码思路,所以我并没有进行算法效率优化。


如果真正的楼主需要,我下周可以做一下代码优化的。
(过程中尽量减少字典使用,并且最后的处理可以只用数组,无需逐行提取身份证号码再使用字典查询统计结果。)


评分

参与人数 4 +19 金币 +12 收起 理由
bai7190 + 3 评分晚了,不好意思,感谢指教!
xcharmer + 1 来学习
fgt258 + 3 来学习
望帝春心 + 12 + 12 来学习,谢谢!

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2016-11-25 15:26 | 显示全部楼层
本帖最后由 望帝春心 于 2016-11-25 15:27 编辑
香川群子 发表于 2016-11-25 15:22
简单示例代码如下:

收到,谢谢香川老师,我好好学习学习。今天评分经验值用完了,回头再谢
回复

使用道具 举报

发表于 2016-11-26 18:00 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2016-11-27 18:42 | 显示全部楼层
香川群子 发表于 2016-11-25 15:22
简单示例代码如下:




麻烦老师再指教下,什么办法更能节约计算时间,

数据库就不学了,跨度有点大,感谢!

回复

使用道具 举报

 楼主| 发表于 2016-11-27 18:47 | 显示全部楼层
香川群子 发表于 2016-11-25 15:22
简单示例代码如下:

实际中我需要处理的数据更多,

需要做一个跨表(在一个工作簿内)的数据处理,



求指教!


很久没弄VBA,本来基础就差,辛苦老师了!
回复

使用道具 举报

发表于 2016-11-28 08:09 | 显示全部楼层
bai7190 发表于 2016-11-27 18:47
实际中我需要处理的数据更多,

需要做一个跨表(在一个工作簿内)的数据处理,

求助要有具体的附件。空说没有办法解决问题。

评分

参与人数 1 +3 收起 理由
bai7190 + 3 我弄一下附件,稍后发!

查看全部评分

回复

使用道具 举报

发表于 2016-11-28 11:23 | 显示全部楼层
望帝春心 发表于 2016-11-25 15:26
收到,谢谢香川老师,我好好学习学习。今天评分经验值用完了,回头再谢

使用分级字典进行重复统计,然后仅使用数组而不再逐行使用字典的输出统计结果方法代码。

当数据量较大时,节约时间的优势明显。


  1. Sub test2()
  2.     Dim arr, d, kr, sr, tr, i&, j&, k&, m&, n&, t$, t1$, t2$
  3.    
  4.     m = [e65536].End(3).Row - 1
  5.     arr = [e2].Resize(m)
  6.    
  7.     Set d = CreateObject("scripting.dictionary")
  8.     For i = 1 To m
  9.         t = arr(i, 1): t1 = Left(t, 6): t2 = Mid(t, 7)
  10.         If Not d.Exists(t1) Then Set d(t1) = CreateObject("scripting.dictionary")
  11.         d(t1)(t2) = d(t1)(t2) & "," & i  '在相同身份证号码的二级字典项目中 记录各个行序号。
  12.     Next
  13.    
  14.     kr = d.keys '读取分级字典keys 即按省市区码分类
  15.     For i = 0 To UBound(kr)
  16.         tr = d(kr(i)).items
  17.        '读取同一个第1级字典key下面各个具体身份证对应的2级字典项目(实为重复项的行序号记录)
  18.         For j = 0 To UBound(tr)
  19.             sr = Split(tr(j), ",") '行序号记录tr拆分为数组sr
  20.             n = UBound(sr)     '此即为重复次数
  21.             For k = 1 To n
  22.                 arr(sr(k), 1) = n '按照行序号记录写入对应重复次数
  23.             Next
  24.         Next
  25. '        kr(i) = kr(i) & " = " & UBound(tr) + 1  '统计分级字典使用情况
  26.     Next
  27. '    MsgBox Join(kr, vbCr)
  28. '
  29.     [f2].Resize(m) = ""
  30.     [f2].Resize(m) = arr
  31. End Sub
复制代码


评分

参与人数 3 +29 金币 +20 收起 理由
苏子龙 + 6 来学习。。。,字典还能这样用!
bai7190 + 3 赞一个
望帝春心 + 20 + 20 来学习~

查看全部评分

回复

使用道具 举报

发表于 2016-11-28 11:25 | 显示全部楼层
香川群子 发表于 2016-11-28 11:23
使用分级字典进行重复统计,然后仅使用数组而不再逐行使用字典的输出统计结果方法代码。

当数据量较大 ...

收到,谢谢香川老师!
回复

使用道具 举报

 楼主| 发表于 2016-11-28 20:29 | 显示全部楼层
香川群子 发表于 2016-11-28 08:09
求助要有具体的附件。空说没有办法解决问题。

求助1.rar (11.73 KB, 下载次数: 4)
回复

使用道具 举报

发表于 2016-11-29 08:24 | 显示全部楼层
bai7190 发表于 2016-11-28 20:29
这个是我的范例,麻烦老师抽空看下,谢谢

原始数据一共就固定只分为2个表吗?还是以后会扩展到3个、4个表?

要根据你这个条件来写代码的。

评分

参与人数 1 +3 收起 理由
bai7190 + 3 感谢老师光临指导!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 04:28 , Processed in 0.274675 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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