Excel精英培训网

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

[已解决]求助:将sheet1到sheet7的数据,统计到sheet8中

[复制链接]
发表于 2012-10-10 20:23 | 显示全部楼层
maysh2009 发表于 2012-10-10 20:22
谢谢,我想问 这个如果使用字典实现的话,如果有多少列数据就要采用多少个字典?

这要视现场情况而定。
因为你现在的案例是把多合一,用一个就行了。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2012-10-10 21:10 | 显示全部楼层
hwc2ycy 发表于 2012-10-10 20:23
这要视现场情况而定。
因为你现在的案例是把多合一,用一个就行了。

工作表数据和.rar (16.07 KB, 下载次数: 9)
回复

使用道具 举报

发表于 2012-10-10 21:38 | 显示全部楼层
maysh2009 发表于 2012-10-10 20:22
谢谢,我想问 这个如果使用字典实现的话,如果有多少列数据就要采用多少个字典?

视情况,一个关键字对一个值。如果你要一字关键字对多个值,就考虑用多个吧。
回复

使用道具 举报

 楼主| 发表于 2012-10-10 21:55 | 显示全部楼层
hwc2ycy 发表于 2012-10-10 21:38
视情况,一个关键字对一个值。如果你要一字关键字对多个值,就考虑用多个吧。

哦,看来像12楼这样附件的话 要多个字典了
回复

使用道具 举报

发表于 2012-10-10 22:13 | 显示全部楼层
maysh2009 发表于 2012-10-10 21:55
哦,看来像12楼这样附件的话 要多个字典了

我暂时会两个,用一个的话就要采取其他办法来弥补了。比如字典+数组。我可以用数组来保存累加值,用字典指示数组的维数。
回复

使用道具 举报

发表于 2012-10-10 22:15 | 显示全部楼层
有空再来改个用字典加数组的,看看哪个效率高。
回复

使用道具 举报

 楼主| 发表于 2012-10-10 22:15 | 显示全部楼层
hwc2ycy 发表于 2012-10-10 22:13
我暂时会两个,用一个的话就要采取其他办法来弥补了。比如字典+数组。我可以用数组来保存累加值,用字典指 ...

谢谢亲, 我会好好领悟的
回复

使用道具 举报

 楼主| 发表于 2012-10-10 22:17 | 显示全部楼层
hwc2ycy 发表于 2012-10-10 22:15
有空再来改个用字典加数组的,看看哪个效率高。

嗯嗯,我这边也写,写好看看效率怎样,谢谢您的指导
回复

使用道具 举报

发表于 2012-10-11 00:00 | 显示全部楼层
字典+静态数组,使用时记得根据实际情况修改数组大小,否则会有报错
  1. Sub 合并数据3()
  2. '数组+字典
  3. '使用静态数组,一维大小需预先估算
  4.     Dim arr, arr2
  5.     Dim arrRst(1000, 1 To 3) '假设统计数据数量在1000行以内,如果数量不止,则改大
  6.     Dim i&, t!, k&, j&
  7.     Dim wsh As Worksheet
  8.     Dim dic As Object
  9.     t = Timer
  10.     Application.ScreenUpdating = False
  11.     Set dic = CreateObject("scripting.dictionary")
  12.     For Each wsh In Worksheets
  13.         If wsh.Name Like "*[1-9]" Then
  14.             With wsh
  15.                 If .[a1] = "" Then GoTo goout
  16.                 arr = .Range("a1").Resize(.[a1].End(xlDown).Row, 4)
  17.             End With
  18.             For i = 2 To UBound(arr)
  19.                 If Not dic.exists(arr(i, 1) & "|" & arr(i, 3)) Then
  20.                     k = k + 1
  21.                     dic.Add arr(i, 1) & "|" & arr(i, 3), k
  22.                     arrRst(k, 1) = arr(i, 1)
  23.                     arrRst(k, 1) = arr(i, 3)
  24.                     arrRst(k, 3) = arr(i, 4)
  25.                 Else
  26.                     j = dic(arr(i, 1) & "|" & arr(i, 3))
  27.                     arrRst(j, 3) = arrRst(j, 3) + arr(i, 4)
  28.                 End If
  29.             Next
  30.         End If
  31. goout:    Next
  32.     arr2 = Array("Elem", "DIP", "SF")
  33.     For i = 0 To UBound(arr2)
  34.         arrRst(0, i + 1) = arr2(i)
  35.     Next
  36.     'Debug.Print "字典+静态数组统计共花费时间为: " & Timer - t & "秒"
  37.     't = Timer
  38.     Worksheets("统计").Range("a1").Resize(UBound(arrRst), 3) = arrRst
  39.     Application.CutCopyMode = False
  40.     Debug.Print "字典+静态数组写回单元格所花费时间为: " & Timer - t & "秒"
  41. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-11 00:02 | 显示全部楼层
字典+动态数组
  1. Sub 合并数据4()
  2. '字典+动态数组
  3. '使用动态数组
  4.     Dim arr, arr2
  5.     Dim arrRst '动态数组
  6.     Dim i&, t!, k&, j&
  7.     Dim wsh As Worksheet
  8.     Dim dic As Object
  9.     t = Timer
  10.     Application.ScreenUpdating = False
  11.     Set dic = CreateObject("scripting.dictionary")
  12.     ReDim arrRst(1 To 3, 0)
  13.     For Each wsh In Worksheets
  14.         If wsh.Name Like "*[1-9]" Then
  15.             With wsh
  16.                 If .[a1] = "" Then GoTo goout
  17.                 arr = .Range("a1").Resize(.[a1].End(xlDown).Row, 4)
  18.             End With
  19.             For i = 2 To UBound(arr)
  20.                 If Not dic.exists(arr(i, 1) & "|" & arr(i, 3)) Then
  21.                     k = k + 1
  22.                     dic.Add arr(i, 1) & "|" & arr(i, 3), k
  23.                     ReDim Preserve arrRst(1 To 3, k)
  24.                     arrRst(1, k) = arr(i, 1)
  25.                     arrRst(2, k) = arr(i, 3)
  26.                     arrRst(3, k) = arr(i, 4)
  27.                 Else
  28.                     j = dic(arr(i, 1) & "|" & arr(i, 3))
  29.                     arrRst(3, j) = arrRst(3, j) + arr(i, 4)
  30.                 End If
  31.             Next
  32.         End If
  33. goout:    Next
  34.     arr2 = Array("Elem", "DIP", "SF")
  35.     For i = 0 To UBound(arr2)
  36.         arrRst(i + 1, 0) = arr2(i)
  37.     Next
  38.     'Debug.Print "字典+动态数组花费时间为: " & Timer - t & "秒"
  39.     't = Timer
  40.     Worksheets("统计").Range("a1").Resize(UBound(arrRst), 3) = Application.Transpose(arrRst)
  41.     Application.CutCopyMode = False
  42.     Debug.Print "字典+动态数组写回单元格花费时间为: " & Timer - t & "秒"
  43. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:43 , Processed in 0.544894 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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