Excel精英培训网

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

[VBA] VBA用两种方法 按姓名计数与产量平均值

[复制链接]
发表于 2016-12-14 08:14 | 显示全部楼层 |阅读模式
VBA用两种方法   按姓名计数与产量平均值

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-12-14 17:15 | 显示全部楼层
  1. Sub UsingArray()
  2.     Dim rng As Range, arr(), brr(), i As Integer, j As Integer, k As Integer, n As Integer
  3.     arr = Range([b2], Cells(Rows.Count, 3).End(xlUp))
  4.     n = 1
  5.     For i = 1 To UBound(arr)
  6.             ReDim Preserve brr(1 To 3, 1 To n)  '保留已有值
  7.             For j = 1 To UBound(brr, 2)
  8.                     If brr(1, j) <> arr(i, 1) Then  '判断
  9.                             k = k + 1
  10.                     Else
  11.                             brr(2, j) = brr(2, j) + 1  '夺冠次数
  12.                             brr(3, j) = brr(3, j) + arr(i, 2)  '总产量累加
  13.                     End If
  14.             Next
  15.             If k = n Then   '内层循环brr数组2维上标次,说明是新值
  16.                     brr(1, n) = arr(i, 1)   '初始化
  17.                     brr(2, n) = 1
  18.                     brr(3, n) = arr(i, 2)
  19.                     n = n + 1
  20.             End If
  21.             k = 0   '初始化
  22.     Next
  23.     '--------------------------------------------
  24.     For i = 1 To UBound(brr, 2) - 1
  25.             brr(3, i) = brr(3, i) / brr(2, i)   '求平均值
  26.     Next
  27.     '----------------------------------------------
  28.     Range("e2").Resize(UBound(brr, 2), 3) = Application.Transpose(brr)
  29.    

  30. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

发表于 2016-12-14 18:05 | 显示全部楼层
修改了一下
  1. Option Explicit

  2. Sub UsingArray()
  3.     On Error Resume Next
  4.     Dim rng As Range, arr(), brr(), i As Integer, j As Integer, k As Integer, n As Integer
  5.     arr = Range([b2], Cells(Rows.Count, 3).End(xlUp))
  6.     n = 1
  7.     For i = 1 To UBound(arr)
  8.             ReDim Preserve brr(1 To 3, 1 To n)  '保留已有值
  9.             For j = 1 To UBound(brr, 2)
  10.                     If brr(1, j) <> arr(i, 1) Then  '判断
  11.                             k = k + 1
  12.                     Else
  13.                             brr(2, j) = brr(2, j) + 1  '夺冠次数
  14.                             brr(3, j) = brr(3, j) + arr(i, 2)  '总产量累加
  15.                     End If
  16.             Next
  17.             If k = n Then   '内层循环brr数组2维上标次,说明是新值
  18.                     brr(1, n) = arr(i, 1)   '初始化
  19.                     brr(2, n) = 1
  20.                     brr(3, n) = arr(i, 2)
  21.                     n = n + 1
  22.             End If
  23.             k = 0   '初始化
  24.     Next
  25.     '--------------------------------------------
  26.     For i = 1 To UBound(brr, 2)
  27.             brr(3, i) = brr(3, i) / brr(2, i)   '求平均值
  28.     Next
  29.     '----------------------------------------------
  30.     Range("e2").Resize(UBound(brr, 2), 3) = Application.Transpose(brr)
  31.    

  32. End Sub


  33. Sub UsingDictionary()
  34.     Dim rng As Range, arr(), brr(), i As Integer, j As Integer, k As Integer, n As Integer
  35.     Dim d1 As Object, d2 As Object, arr2, arr3
  36.     arr = Range([b2], Cells(Rows.Count, 3).End(xlUp))
  37.     Set d1 = CreateObject("scripting.dictionary") '定义字典
  38.     Set d2 = CreateObject("scripting.dictionary") '定义字典
  39.     '------------------------------------------
  40.     For i = 1 To UBound(arr)
  41.             d1(arr(i, 1)) = d1(arr(i, 1)) + arr(i, 2)     '修改键的对应的item值
  42.             d2(arr(i, 1)) = d2(arr(i, 1)) + 1     '记录次数
  43.     Next
  44.     '------------------------------------------
  45.     arr2 = d1.items
  46.     arr3 = d2.items
  47.     For i = 0 To d1.Count - 1   '求平均值
  48.             arr2(i) = arr2(i) / arr3(i)     '好像不能直接使用d1.Item(i)
  49.     Next
  50.     '------------------------------------------
  51.     Range("e2").Resize(d1.Count) = Application.Transpose(d1.Keys)
  52.     Range("f2").Resize(d1.Count) = Application.Transpose(d2.items)
  53.     Range("g2").Resize(d1.Count) = Application.Transpose(arr2)
  54.    
  55. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-12-14 20:09 | 显示全部楼层

做得好,谢高手
回复

使用道具 举报

 楼主| 发表于 2016-12-16 12:41 | 显示全部楼层


VBA用数组把单元格用select选择起来


http://www.excelpx.com/thread-426449-1-1.html


回复

使用道具 举报

 楼主| 发表于 2016-12-17 09:17 | 显示全部楼层

VBA查找最小值等于50的所有单元格


http://www.excelpx.com/thread-426472-1-1.html

回复

使用道具 举报

 楼主| 发表于 2017-1-9 19:04 | 显示全部楼层


VBA蓝底单元格输入数字全排列   然后再容错

http://www.excelpx.com/thread-427027-1-1.html


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 17:00 , Processed in 0.272347 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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