Excel精英培训网

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

[已解决]计算平均值和标准差

[复制链接]
发表于 2017-4-10 11:01 | 显示全部楼层 |阅读模式
如何用VBA字典和数组将表1的数据计算得到表2数据
取不重复值计算相应的平均数量,平均周期,标准差。
请各位老师帮忙看看。谢谢
最佳答案
2017-4-10 13:52
数据透视表效果就能达到了
  1. Sub test()
  2.     Dim arrSrc, arrSplit, arrRst()
  3.     Dim objdic As Object
  4.     Dim irow%, iCnt%, iCol%
  5.     Dim stDveNum1#, stDveNum2#
  6.     arrSrc = Sheet1.Range("a2:c14").Value
  7.     Set objdic = CreateObject("scripting.dictionary")
  8.     For irow = 1 To UBound(arrSrc)
  9.         If Not objdic.exists(arrSrc(irow, 1)) Then
  10.             objdic(arrSrc(irow, 1)) = objdic(arrSrc(irow, 1)) + arrSrc(irow, 2) & "/" & arrSrc(irow, 3) & "/" & 1
  11.         Else
  12.             objdic(arrSrc(irow, 1)) = Split(objdic(arrSrc(irow, 1)), "/")(0) + arrSrc(irow, 2) & "/" & Split(objdic(arrSrc(irow, 1)), "/")(1) + arrSrc(irow, 3) & "/" & Split(objdic(arrSrc(irow, 1)), "/")(2) + 1
  13.         End If
  14.     Next
  15.     arrSplit = Application.Transpose(Array(objdic.keys, objdic.items))
  16.     ReDim arrRst(1 To objdic.Count, 1 To 5)
  17.     '计算平均数
  18.     For iCnt = 1 To UBound(arrRst)
  19.         arrRst(iCnt, 1) = arrSplit(iCnt, 1)
  20.         arrRst(iCnt, 2) = Split(arrSplit(iCnt, 2), "/")(0) / Split(arrSplit(iCnt, 2), "/")(2)
  21.         arrRst(iCnt, 4) = Split(arrSplit(iCnt, 2), "/")(1) / Split(arrSplit(iCnt, 2), "/")(2)
  22.     Next
  23.     '计算标准偏差
  24.     For iCnt = 1 To UBound(arrRst)
  25.         For irow = 1 To UBound(arrSrc)
  26.             If arrRst(iCnt, 1) = arrSrc(irow, 1) Then
  27.                 stDveNum1 = stDveNum1 + (arrSrc(irow, 2) - arrRst(iCnt, 2)) ^ 2
  28.                 stDveNum2 = stDveNum2 + (arrSrc(irow, 3) - arrRst(iCnt, 4)) ^ 2
  29.             End If
  30.         Next
  31.         arrRst(iCnt, 3) = Sqr(stDveNum1 / (Split(arrSplit(iCnt, 2), "/")(2) - 1))
  32.         arrRst(iCnt, 5) = Sqr(stDveNum2 / (Split(arrSplit(iCnt, 2), "/")(2) - 1))
  33.         stDveNum1 = 0: stDveNum2 = 0
  34.     Next
  35.     Sheet2.Range("a2").Resize(UBound(arrRst), 5) = arrRst
  36. End Sub
复制代码

工作簿2.zip

7.61 KB, 下载次数: 23

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-4-10 13:52 | 显示全部楼层    本楼为最佳答案   
数据透视表效果就能达到了
  1. Sub test()
  2.     Dim arrSrc, arrSplit, arrRst()
  3.     Dim objdic As Object
  4.     Dim irow%, iCnt%, iCol%
  5.     Dim stDveNum1#, stDveNum2#
  6.     arrSrc = Sheet1.Range("a2:c14").Value
  7.     Set objdic = CreateObject("scripting.dictionary")
  8.     For irow = 1 To UBound(arrSrc)
  9.         If Not objdic.exists(arrSrc(irow, 1)) Then
  10.             objdic(arrSrc(irow, 1)) = objdic(arrSrc(irow, 1)) + arrSrc(irow, 2) & "/" & arrSrc(irow, 3) & "/" & 1
  11.         Else
  12.             objdic(arrSrc(irow, 1)) = Split(objdic(arrSrc(irow, 1)), "/")(0) + arrSrc(irow, 2) & "/" & Split(objdic(arrSrc(irow, 1)), "/")(1) + arrSrc(irow, 3) & "/" & Split(objdic(arrSrc(irow, 1)), "/")(2) + 1
  13.         End If
  14.     Next
  15.     arrSplit = Application.Transpose(Array(objdic.keys, objdic.items))
  16.     ReDim arrRst(1 To objdic.Count, 1 To 5)
  17.     '计算平均数
  18.     For iCnt = 1 To UBound(arrRst)
  19.         arrRst(iCnt, 1) = arrSplit(iCnt, 1)
  20.         arrRst(iCnt, 2) = Split(arrSplit(iCnt, 2), "/")(0) / Split(arrSplit(iCnt, 2), "/")(2)
  21.         arrRst(iCnt, 4) = Split(arrSplit(iCnt, 2), "/")(1) / Split(arrSplit(iCnt, 2), "/")(2)
  22.     Next
  23.     '计算标准偏差
  24.     For iCnt = 1 To UBound(arrRst)
  25.         For irow = 1 To UBound(arrSrc)
  26.             If arrRst(iCnt, 1) = arrSrc(irow, 1) Then
  27.                 stDveNum1 = stDveNum1 + (arrSrc(irow, 2) - arrRst(iCnt, 2)) ^ 2
  28.                 stDveNum2 = stDveNum2 + (arrSrc(irow, 3) - arrRst(iCnt, 4)) ^ 2
  29.             End If
  30.         Next
  31.         arrRst(iCnt, 3) = Sqr(stDveNum1 / (Split(arrSplit(iCnt, 2), "/")(2) - 1))
  32.         arrRst(iCnt, 5) = Sqr(stDveNum2 / (Split(arrSplit(iCnt, 2), "/")(2) - 1))
  33.         stDveNum1 = 0: stDveNum2 = 0
  34.     Next
  35.     Sheet2.Range("a2").Resize(UBound(arrRst), 5) = arrRst
  36. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-4-10 14:18 | 显示全部楼层
Excel学徒123 发表于 2017-4-10 13:52
数据透视表效果就能达到了

首先感谢你的帮助,如果用透视表就没有必要写代码啦,能否用字典加数组,谢谢
回复

使用道具 举报

发表于 2017-4-10 14:30 | 显示全部楼层
一句话的事儿。。。。。
QQ截图20170410142910.png

工作簿2.rar

17.38 KB, 下载次数: 36

回复

使用道具 举报

发表于 2017-4-10 14:31 | 显示全部楼层
王英wang 发表于 2017-4-10 14:18
首先感谢你的帮助,如果用透视表就没有必要写代码啦,能否用字典加数组,谢谢

上面的代码不就是字典加数组么????
回复

使用道具 举报

 楼主| 发表于 2017-4-14 15:53 | 显示全部楼层
grf1973 发表于 2017-4-10 14:30
一句话的事儿。。。。。

SQL能否获取外部数据
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 21:11 , Processed in 0.459482 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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