Excel精英培训网

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

[已解决]如何合并数据及统计重复次数?

  [复制链接]
发表于 2012-1-4 15:46 | 显示全部楼层 |阅读模式
想把大量数据合并整理,涉及到重复合并的一些问题,详情见附件,请老师们得空指点一二!


最佳答案
2012-1-4 16:14
速度还OK,我的配置的话,0.2S左右

  1. Sub juSTTest()
  2.     Dim Arr, D As New Dictionary, At(1 To 2) As New Dictionary, K&, ArrT(1 To 10000, 1 To 5)
  3.     Dim i&, S$, Ar, j&, Akd, Ak, Ai, ASp, a As Byte, AStr(1 To 2) As String, t
  4.     t = Timer
  5.     Arr = Range("a1:e" & Cells(Rows.Count, 1).End(3).Row).Value
  6.     For i = 1 To UBound(Arr)
  7.         S = Arr(i, 1) & vbTab & Arr(i, 4) & vbTab & Arr(i, 5)
  8.         If D.Exists(S) Then
  9.             Ar = D(S)
  10.             If Ar(1).Exists(Arr(i, 2)) Then
  11.                 Ar(1)(Arr(i, 2)) = Ar(1)(Arr(i, 2)) + 1
  12.             Else
  13.                 Ar(1).Add Arr(i, 2), 1
  14.             End If
  15.             If At(2).Exists(Arr(i, 3)) Then
  16.                 Ar(2)(Arr(i, 3)) = Ar(2)(Arr(i, 3)) + 1
  17.             Else
  18.                 Ar(2).Add Arr(i, 3), 1
  19.             End If
  20.             D(S) = Ar
  21.         Else
  22.             Erase At
  23.             At(1).Add Arr(i, 2), 1
  24.             At(2).Add Arr(i, 3), 1
  25.             D.Add S, At
  26.         End If
  27.     Next
  28.     Akd = D.Keys
  29.     For i = 0 To UBound(Akd)
  30.         Ar = D(Akd(i))
  31.         For a = 1 To 2
  32.             Ak = Ar(a).Keys: Ai = Ar(a).Items
  33.             For j = 0 To UBound(Ak)
  34.                 AStr(a) = AStr(a) & ";" & Ak(j) & "(" & Ai(j) & ")"
  35.             Next j
  36.         Next a
  37.         K = K + 1: ASp = Split(Akd(i), vbTab)
  38.         ArrT(K, 1) = ASp(0): ArrT(K, 4) = ASp(1): ArrT(K, 5) = ASp(2)
  39.         ArrT(K, 2) = Mid(AStr(1), 2)
  40.         ArrT(K, 3) = Replace(Mid(AStr(2), 2), ";", "_")
  41.     Next i
  42.     With Sheet2
  43.         .Range("a2:e" & .Rows.Count).ClearContents
  44.         .Range("A2").Resize(K, 5) = ArrT
  45.         .Activate
  46.     End With
  47.     MsgBox "处理完毕,用时" & Timer - t
  48.     Set D = Nothing
  49. End Sub
复制代码

book2.rar (19.15 KB, 下载次数: 87)

book2.rar

9.48 KB, 下载次数: 50

发表于 2012-1-4 16:14 | 显示全部楼层    本楼为最佳答案   
速度还OK,我的配置的话,0.2S左右

  1. Sub juSTTest()
  2.     Dim Arr, D As New Dictionary, At(1 To 2) As New Dictionary, K&, ArrT(1 To 10000, 1 To 5)
  3.     Dim i&, S$, Ar, j&, Akd, Ak, Ai, ASp, a As Byte, AStr(1 To 2) As String, t
  4.     t = Timer
  5.     Arr = Range("a1:e" & Cells(Rows.Count, 1).End(3).Row).Value
  6.     For i = 1 To UBound(Arr)
  7.         S = Arr(i, 1) & vbTab & Arr(i, 4) & vbTab & Arr(i, 5)
  8.         If D.Exists(S) Then
  9.             Ar = D(S)
  10.             If Ar(1).Exists(Arr(i, 2)) Then
  11.                 Ar(1)(Arr(i, 2)) = Ar(1)(Arr(i, 2)) + 1
  12.             Else
  13.                 Ar(1).Add Arr(i, 2), 1
  14.             End If
  15.             If At(2).Exists(Arr(i, 3)) Then
  16.                 Ar(2)(Arr(i, 3)) = Ar(2)(Arr(i, 3)) + 1
  17.             Else
  18.                 Ar(2).Add Arr(i, 3), 1
  19.             End If
  20.             D(S) = Ar
  21.         Else
  22.             Erase At
  23.             At(1).Add Arr(i, 2), 1
  24.             At(2).Add Arr(i, 3), 1
  25.             D.Add S, At
  26.         End If
  27.     Next
  28.     Akd = D.Keys
  29.     For i = 0 To UBound(Akd)
  30.         Ar = D(Akd(i))
  31.         For a = 1 To 2
  32.             Ak = Ar(a).Keys: Ai = Ar(a).Items
  33.             For j = 0 To UBound(Ak)
  34.                 AStr(a) = AStr(a) & ";" & Ak(j) & "(" & Ai(j) & ")"
  35.             Next j
  36.         Next a
  37.         K = K + 1: ASp = Split(Akd(i), vbTab)
  38.         ArrT(K, 1) = ASp(0): ArrT(K, 4) = ASp(1): ArrT(K, 5) = ASp(2)
  39.         ArrT(K, 2) = Mid(AStr(1), 2)
  40.         ArrT(K, 3) = Replace(Mid(AStr(2), 2), ";", "_")
  41.     Next i
  42.     With Sheet2
  43.         .Range("a2:e" & .Rows.Count).ClearContents
  44.         .Range("A2").Resize(K, 5) = ArrT
  45.         .Activate
  46.     End With
  47.     MsgBox "处理完毕,用时" & Timer - t
  48.     Set D = Nothing
  49. End Sub
复制代码

book2.rar (19.15 KB, 下载次数: 87)

评分

参与人数 1 +1 收起 理由
cashiba + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2012-1-4 16:32 | 显示全部楼层
A列和B列数据双击时,数据前面有个单引号
先解决一个小问题:这个引号没有问题,不会影响的,只是文本的标志
第一个大问题,等我想想吧
用vba肯定是可以解决,但要先想好算法才能少走弯路
回复

使用道具 举报

 楼主| 发表于 2012-1-5 00:25 | 显示全部楼层
liuguansky 发表于 2012-1-4 16:14
速度还OK,我的配置的话,0.2S左右

liuguansky老师,好像不行噢,合并后得到的结果,每行的B列、C列几乎都变成一样的了.....

还有   运行时错误“1004”

2012-01-05_002451.jpg

错误在
With Sheet2
        .Range("a2:e" & .Rows.Count).ClearContents
        .Range("A2").Resize(K, 5) = ArrT
        .Activate
End With

点评

你确定是运行的我的附件?或者请上传你运行错误的附件。  发表于 2012-1-5 08:56
回复

使用道具 举报

 楼主| 发表于 2012-1-5 00:28 | 显示全部楼层
bjjgq 发表于 2012-1-4 16:32
A列和B列数据双击时,数据前面有个单引号
先解决一个小问题:这个引号没有问题,不会影响的,只是文本的标 ...

谢谢bjjgq 老师,多费心了~
回复

使用道具 举报

发表于 2012-1-5 09:00 | 显示全部楼层
cashiba 发表于 2012-1-5 00:25
liuguansky老师,好像不行噢,合并后得到的结果,每行的B列、C列几乎都变成一样的了.....

还有   运行 ...

31行代码前添加一句

  1. AStr(1) = "": AStr(2) = ""
复制代码

至于你说的错误,倒没有发现。
回复

使用道具 举报

 楼主| 发表于 2012-1-5 13:02 | 显示全部楼层
谢谢版主liuguansky老师,速度很快,很好用。这么多代码你一蹴而就,佩服佩服!
回复

使用道具 举报

发表于 2012-1-5 15:30 | 显示全部楼层
cashiba 发表于 2012-1-5 13:02
谢谢版主liuguansky老师,速度很快,很好用。这么多代码你一蹴而就,佩服佩服!

如果楼主问题解决了,最好给评下最佳
回复

使用道具 举报

发表于 2012-1-5 17:02 | 显示全部楼层
liuguansky老师厉害,使用了字典,认真学习啦
回复

使用道具 举报

 楼主| 发表于 2012-1-5 22:32 | 显示全部楼层
bjjgq 发表于 2012-1-5 17:02
liuguansky老师厉害,使用了字典,认真学习啦

好多变量,多字典组合,不过速度确实狠快,可惜对字典、数组似懂非懂的,看不大明白{:181:},如果有谁能注解一下就好了.....
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 11:01 , Processed in 0.340719 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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