Excel精英培训网

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

[已解决]去年重复值留下唯一的值 ,要求运行速度快,求助!·!

[复制链接]
发表于 2013-1-5 20:27 | 显示全部楼层 |阅读模式
根据总表得出唯一值,要求:
1、不要用数组,因为总表数据要达到上万行,而且列数有多列,用了数组,运行速度就慢了。
2、尽量要求运行速度快,可以和公式函数或者VBA。

Book1.rar (2.29 KB, 下载次数: 13)
发表于 2013-1-5 20:42 | 显示全部楼层
金额是怎么算的呢?
如果上万行,就用数据透视表好了,快捷方便。
选择源数据所在区域任一位置——>ALT+D+P——>完成
在新的数据透视表上,将姓名放拖到行标签即可。
回复

使用道具 举报

发表于 2013-1-5 20:51 | 显示全部楼层
  1. select distinct 姓名,first(金额) as 金额 from[总表$] group by 姓名
复制代码
sql查询。速度快,数据量大时优势明显
010501.gif
回复

使用道具 举报

发表于 2013-1-5 20:51 | 显示全部楼层
本帖最后由 zhoucs00 于 2013-1-5 20:53 编辑
  1. Sub zhoucs00()
  2. Dim arr, brr, crr, i As Integer
  3. arr = Sheets("总表").Range("A3:B" & Sheets("总表").Cells(Rows.Count, 1).End(3).Row)
  4. On Error Resume Next
  5. With CreateObject("scripting.dictionary")
  6.    For i = 1 To UBound(arr, 1)
  7.       .Add arr(i, 1), arr(i, 2)
  8.    Next i
  9.    arr = .keys
  10.    crr = .items
  11.    Sheets("唯一值").Range("A4").Resize(.Count, 1) = Application.WorksheetFunction.Transpose(arr)
  12.    Sheets("唯一值").Range("A4").Offset(0, 1).Resize(.Count, 1) = Application.WorksheetFunction.Transpose(crr)
  13. End With
  14. End Sub
复制代码
试下这段代码,看你模拟的结果并没有将张三的不同金额汇总,而是取了第一个,我也就直接取了第一个了
回复

使用道具 举报

 楼主| 发表于 2013-1-5 21:09 | 显示全部楼层
CheryBTL 发表于 2013-1-5 20:42
金额是怎么算的呢?
如果上万行,就用数据透视表好了,快捷方便。
选择源数据所在区域任一位置——>ALT+D ...

数据透视表固然是好,就是每次在汇总表增加内容,都要刷新后数据才会更新,不会自动更新,这点不太方便。
回复

使用道具 举报

 楼主| 发表于 2013-1-5 21:13 | 显示全部楼层
zhoucs00 发表于 2013-1-5 20:51
试下这段代码,看你模拟的结果并没有将张三的不同金额汇总,而是取了第一个,我也就直接取了第一个了

很不错,但与要求不太相符,估计是我描述有误,列与列没有对等关系,只要把每一列的唯一值提取出来就行。
能修改一下吗
回复

使用道具 举报

 楼主| 发表于 2013-1-5 21:14 | 显示全部楼层
w1098 发表于 2013-1-5 20:51
sql查询。速度快,数据量大时优势明显

很不错,但与要求不太相符,估计是我描述有误,列与列没有对等关系,只要把每一列的唯一值提取出来就行。
能修改一下吗
回复

使用道具 举报

 楼主| 发表于 2013-1-5 21:14 | 显示全部楼层
每次在汇总表增加内容,唯一值自动更新
回复

使用道具 举报

发表于 2013-1-5 21:19 | 显示全部楼层    本楼为最佳答案   
双飞叶 发表于 2013-1-5 21:14
每次在汇总表增加内容,唯一值自动更新
  1. Sub zhoucs00()
  2. Dim arr, brr, crr, err, drr, i As Integer
  3. arr = Sheets("总表").Range("A3:A" & Sheets("总表").Cells(Rows.Count, 1).End(3).Row)
  4. drr = Sheets("总表").Range("B3:B" & Sheets("总表").Cells(Rows.Count, 2).End(3).Row)
  5. On Error Resume Next
  6. With CreateObject("scripting.dictionary")
  7.    For i = 1 To UBound(arr)
  8.       .Add arr(i, 1), ""
  9.    Next i
  10.    err = .keys
  11.    Sheets("唯一值").Range("A4").Resize(.Count, 1) = Application.WorksheetFunction.Transpose(err)
  12. End With
  13. With CreateObject("scripting.dictionary")
  14.    For i = 1 To UBound(drr)
  15.       .Add drr(i, 1), ""
  16.    Next i
  17.    crr = .keys
  18.    Sheets("唯一值").Range("A4").Offset(0, 1).Resize(.Count, 1) = Application.WorksheetFunction.Transpose(crr)
  19. End With
  20. End Sub
复制代码
这段代码,更新时,重新运行一下就是了
回复

使用道具 举报

 楼主| 发表于 2013-1-5 21:33 | 显示全部楼层
zhoucs00 发表于 2013-1-5 21:19
这段代码,更新时,重新运行一下就是了

不错,就是这种效果
要是能加入点保存时自动更新或者新打开工作表时自动更新,这样就更完美了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 01:03 , Processed in 1.460076 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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