Excel精英培训网

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

[已解决]数组字典多条件汇总

[复制链接]
发表于 2013-4-17 10:01 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2013-4-19 15:40 编辑

如何统计平均值与一个表,见附件,谢谢
最佳答案
2013-4-17 18:23
(, 下载次数: 88)

如何汇总.rar

305.16 KB, 下载次数: 49

发表于 2013-4-17 10:27 | 显示全部楼层
不理解题意

建议
1、数据源保留最少量数据,但够理解题意
2、汇总表只留结果。(在帖子中说明,方便对比理解)
3、如果帖子中发截图,会更有利于快速解答
回复

使用道具 举报

 楼主| 发表于 2013-4-17 10:45 | 显示全部楼层
爱疯 发表于 2013-4-17 10:27
不理解题意

建议

更新一下说明,见附件

如何汇总.rar

305.16 KB, 下载次数: 57

回复

使用道具 举报

发表于 2013-4-17 10:51 | 显示全部楼层
TOP10%平均值= 原始表E列为10%和B列同一分类的A列均值



原始表E列为10%,是什么含义?
B列同一分类的A列,是什么含义?



{:041:}
回复

使用道具 举报

 楼主| 发表于 2013-4-17 10:54 | 显示全部楼层
爱疯 发表于 2013-4-17 10:51
TOP10%平均值= 原始表E列为10%和B列同一分类的A列均值

字段标示,统计时,汇总表的B列只统计原始数据表E列标示为
TOP10%
的平均值

点评

明白了,真不容易,呵呵  发表于 2013-4-17 10:56
回复

使用道具 举报

发表于 2013-4-17 11:29 | 显示全部楼层
原始数据都是以B列排序了的?(没排序也没关系,加点东东排个序就可以了
把以B列排序了的数据读入数组,循环进行:B列相同,则以top10等对A列累加并计数,直到B列不同时,进行将先前累加的除以相应计数得平均值,写入数组,累加和计数清空,进入下一个
回复

使用道具 举报

发表于 2013-4-17 11:52 | 显示全部楼层
  1. Sub test()
  2.     Dim A, B, C, D, dic
  3.     Dim i%, j%, s%, t$

  4.     A = Sheet1.Range("A1").CurrentRegion
  5.     Set dic = CreateObject("scripting.dictionary")
  6.     ReDim B(1 To UBound(A), 1 To 4)   '次数
  7.     ReDim C(1 To UBound(A), 1 To 4)    '累加
  8.     ReDim D(1 To UBound(A), 1 To 4)    '均值

  9.     For i = 2 To UBound(A)
  10.         t = A(i, 2)
  11.         If dic.exists(t) = False Then s = s + 1: dic(t) = s

  12.         '分类统计
  13.         For j = 5 To UBound(A, 2)
  14.             If A(i, j) <> "" Then    '结果的第1,2,3列
  15.                 B(dic(t), j - 4) = B(dic(t), j - 4) + 1
  16.                 C(dic(t), j - 4) = C(dic(t), j - 4) + A(i, 1)
  17.                 D(dic(t), j - 4) = C(dic(t), j - 4) / B(dic(t), j - 4)
  18.             End If

  19.             If j = UBound(A, 2) Then   '           '结果的第4列
  20.                 B(dic(t), 4) = B(dic(t), 4) + 1
  21.                 C(dic(t), 4) = C(dic(t), 4) + A(i, 1)
  22.                 D(dic(t), 4) = C(dic(t), 4) / B(dic(t), 4)
  23.             End If
  24.         Next j
  25.     Next i

  26.     With Sheet2
  27.         .Range("a2:e65536").ClearContents
  28.         .[a2].Resize(s) = Application.Transpose(dic.keys)
  29.         .[b2].Resize(s, UBound(D, 2)) = D
  30.     End With
  31. End Sub
复制代码
如何汇总3.rar (480.46 KB, 下载次数: 171)
回复

使用道具 举报

发表于 2013-4-17 12:38 | 显示全部楼层
上清宫主 发表于 2013-4-17 11:29
原始数据都是以B列排序了的?(没排序也没关系,加点东东排个序就可以了)
把以B列排序了的数据读入数 ...

有点小开心。
这仍是多类汇总题。中途为难的是,为求平均值,次数与和往哪儿存?
核心还是s确定 结果数组的行,学29集http://www.excelpx.com/thread-191424-1-1.html
不这么做,我还是想不出其它办法。

缺点:
1、B,C,D数组跟不要钱似的
2、全程依赖字典,读取了很多次。

没理解上官说的,是其它办法么?来学习

回复

使用道具 举报

发表于 2013-4-17 13:29 | 显示全部楼层
我弄了一个,看好用不。

如何汇总.rar

315.67 KB, 下载次数: 130

评分

参与人数 1 +20 金币 +10 收起 理由
爱疯 + 20 + 10 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-4-17 13:54 | 显示全部楼层
也来练练手:

  1. Sub aa()
  2.     Dim i%, j%, arr, arr1(), brr(), d As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("原始数据").Range("A2:G" & Sheets("原始数据").Range("A" & Rows.Count).End(3).Row)
  5.     For i = 1 To UBound(arr)
  6.         If Not d.exists(arr(i, 2)) Then
  7.             d(arr(i, 2)) = Array(IIf(arr(i, 5) <> "", arr(i, 1), 0), IIf(arr(i, 5) <> "", 1, 0), IIf(arr(i, 6) <> "", arr(i, 1), 0), IIf(arr(i, 6) <> "", 1, 0), IIf(arr(i, 7) <> "", arr(i, 1), 0), IIf(arr(i, 7) <> "", 1, 0), arr(i, 1), 1)
  8.         Else
  9.             d(arr(i, 2)) = Array(d(arr(i, 2))(0) + IIf(arr(i, 5) <> "", arr(i, 1), 0), d(arr(i, 2))(1) + IIf(arr(i, 5) <> "", 1, 0), d(arr(i, 2))(2) + IIf(arr(i, 6) <> "", arr(i, 1), 0), d(arr(i, 2))(3) + IIf(arr(i, 6) <> "", 1, 0), d(arr(i, 2))(4) + IIf(arr(i, 7) <> "", arr(i, 1), 0), d(arr(i, 2))(5) + IIf(arr(i, 7) <> "", 1, 0), d(arr(i, 2))(6) + arr(i, 1), d(arr(i, 2))(7) + 1)
  10.         End If
  11.     Next
  12.     Sheets("汇总表").[A2].Resize(d.Count) = Application.Transpose(d.keys)
  13.     arr1 = d.items
  14.     ReDim brr(0 To UBound(arr1), 1 To 4)
  15.     For i = 0 To UBound(arr1)
  16.         For j = 1 To 4
  17.             If arr1(i)(2 * j - 1) <> 0 Then brr(i, j) = arr1(i)(2 * j - 2) / arr1(i)(2 * j - 1)
  18.         Next
  19.     Next
  20.     Sheets("汇总表").[B2].Resize(d.Count, 4) = brr
  21. End Sub
复制代码

评分

参与人数 1 +20 金币 +10 收起 理由
爱疯 + 20 + 10 赞一个!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 11:41 , Processed in 0.387990 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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