Excel精英培训网

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

[已解决]【求助】EXCEL 按照出现次数进行统计和排序

[复制链接]
发表于 2012-10-9 20:34 | 显示全部楼层 |阅读模式
本帖最后由 malteser 于 2012-10-10 07:52 编辑

我公司要按照公司的客户资料进行统计,分别从各个直辖市/省份 来了多少人。就像我的sheet里面的。  数据是每天不停更新的,所以我无法知道到哪一行截止

我希望能通过VBA实现:
1.  自动在统计那里,人数按照由多至少(就是各个省/直辖市在C列出现的次数)的顺序,进行排序,  比如   
上海   7
江苏   5

等等(请假设中国有多少个省/直辖市 我们是不知道的,因为我还要统计他们是哪个公司推荐过来的,推荐公司的总数和名字是我现在无法知道的)

2.  按照来自的省份、直辖市,在另外一张sheet重新排序,就是类似这样
北京
北京
北京
北京
北京
山东
山东                    以此类推,不知道我解释清楚没有,如果没有解释清楚,请和我说一下,我重新说







最佳答案
2012-10-10 00:03
本帖最后由 suye1010 于 2012-10-10 00:40 编辑
  1. Sub Test()
  2. Dim arr0, Temparr, d, i%, j%, k%, m%, n%, Itm, arr, T1, T2, arr9(1 To 10000, 1 To 3), CT%
  3. Set d = CreateObject("Scripting.Dictionary")
  4. arr0 = Range("A1").CurrentRegion
  5. '这里记录每个城市出现的人名和代号,方便后续继续处理各个城市的信息
  6. For i = 2 To UBound(arr0)
  7.     If d.exists(arr0(i, 3)) Then
  8.         Temparr = d(arr0(i, 3))
  9.         ReDim Preserve Temparr(1 To 2, 1 To UBound(Temparr, 2) + 1)
  10.         Temparr(1, UBound(Temparr, 2)) = arr0(i, 1)
  11.         Temparr(2, UBound(Temparr, 2)) = arr0(i, 2)
  12.         d(arr0(i, 3)) = Temparr
  13.     Else
  14.         ReDim Temparr(1 To 2, 1 To 1)
  15.         Temparr(1, 1) = arr0(i, 1)
  16.         Temparr(2, 1) = arr0(i, 2)
  17.         d.Add arr0(i, 3), Temparr
  18.     End If
  19.     Erase Temparr
  20. Next i
  21. ReDim arr(1 To d.Count, 1 To 2)
  22. '统计各个城市的人数
  23. For Each Itm In d.keys
  24.     k = k + 1
  25.     arr(k, 1) = Itm
  26.     arr(k, 2) = UBound(d(Itm), 2)
  27. Next
  28. '对各个城市的人数进行排序
  29. For m = 1 To UBound(arr) - 1
  30.     For n = m + 1 To UBound(arr)
  31.         If arr(m, 2) < arr(n, 2) Then
  32.             T1 = arr(m, 1)
  33.             T2 = arr(m, 2)
  34.             arr(m, 1) = arr(n, 1)
  35.             arr(m, 2) = arr(n, 2)
  36.             arr(n, 1) = T1
  37.             arr(n, 2) = T2
  38.         End If
  39.     Next n
  40. Next m
  41. Cells(2, 8).Resize(d.Count, 2) = arr

  42. '以下对数据进行按城市名的重排
  43. For j = 1 To UBound(arr)
  44.     For p = 1 To UBound(d(arr(j, 1)), 2)
  45.         CT = CT + 1
  46.         arr9(CT, 1) = CT
  47.         arr9(CT, 2) = arr(j, 1)
  48.         arr9(CT, 3) = d(arr(j, 1))(2, p)
  49.     Next p
  50. Next j
  51. Sheets(2).Cells(1, 1).Resize(10000, 3) = arr9
  52. End Sub
复制代码
求助统计和排序.zip (19.23 KB, 下载次数: 5, 售价: 1 个金币)

求助统计和排序.rar

17.27 KB, 下载次数: 17

发表于 2012-10-10 00:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suye1010 于 2012-10-10 00:40 编辑
  1. Sub Test()
  2. Dim arr0, Temparr, d, i%, j%, k%, m%, n%, Itm, arr, T1, T2, arr9(1 To 10000, 1 To 3), CT%
  3. Set d = CreateObject("Scripting.Dictionary")
  4. arr0 = Range("A1").CurrentRegion
  5. '这里记录每个城市出现的人名和代号,方便后续继续处理各个城市的信息
  6. For i = 2 To UBound(arr0)
  7.     If d.exists(arr0(i, 3)) Then
  8.         Temparr = d(arr0(i, 3))
  9.         ReDim Preserve Temparr(1 To 2, 1 To UBound(Temparr, 2) + 1)
  10.         Temparr(1, UBound(Temparr, 2)) = arr0(i, 1)
  11.         Temparr(2, UBound(Temparr, 2)) = arr0(i, 2)
  12.         d(arr0(i, 3)) = Temparr
  13.     Else
  14.         ReDim Temparr(1 To 2, 1 To 1)
  15.         Temparr(1, 1) = arr0(i, 1)
  16.         Temparr(2, 1) = arr0(i, 2)
  17.         d.Add arr0(i, 3), Temparr
  18.     End If
  19.     Erase Temparr
  20. Next i
  21. ReDim arr(1 To d.Count, 1 To 2)
  22. '统计各个城市的人数
  23. For Each Itm In d.keys
  24.     k = k + 1
  25.     arr(k, 1) = Itm
  26.     arr(k, 2) = UBound(d(Itm), 2)
  27. Next
  28. '对各个城市的人数进行排序
  29. For m = 1 To UBound(arr) - 1
  30.     For n = m + 1 To UBound(arr)
  31.         If arr(m, 2) < arr(n, 2) Then
  32.             T1 = arr(m, 1)
  33.             T2 = arr(m, 2)
  34.             arr(m, 1) = arr(n, 1)
  35.             arr(m, 2) = arr(n, 2)
  36.             arr(n, 1) = T1
  37.             arr(n, 2) = T2
  38.         End If
  39.     Next n
  40. Next m
  41. Cells(2, 8).Resize(d.Count, 2) = arr

  42. '以下对数据进行按城市名的重排
  43. For j = 1 To UBound(arr)
  44.     For p = 1 To UBound(d(arr(j, 1)), 2)
  45.         CT = CT + 1
  46.         arr9(CT, 1) = CT
  47.         arr9(CT, 2) = arr(j, 1)
  48.         arr9(CT, 3) = d(arr(j, 1))(2, p)
  49.     Next p
  50. Next j
  51. Sheets(2).Cells(1, 1).Resize(10000, 3) = arr9
  52. End Sub
复制代码
求助统计和排序.zip (19.23 KB, 下载次数: 5, 售价: 1 个金币)
回复

使用道具 举报

 楼主| 发表于 2012-10-10 15:27 | 显示全部楼层
suye1010 发表于 2012-10-10 00:03

太谢谢你了!版主!!!

不过我能不能多问一句? 就是重新排列的时候,我需要将 地区 原来对应的序列号 一起放在新的sheet里面,而且本来在姓名那一栏都是有东西的,但是由于公司的保密政策,我就删除了。

所以如何将他们按照地区的顺序,整个一行那么重新排列过? 如果是一个新的MACRO那最好了,我不想将 统计和 重新排序 放在一个macro里面一起运行!!

五体投地 !!!!感谢!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 10:24 , Processed in 0.356704 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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