Excel精英培训网

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

[已解决]VBA的求和结果为什么不对?谢谢老师们!

[复制链接]
发表于 2013-6-1 18:18 | 显示全部楼层 |阅读模式
本帖最后由 ligh1298 于 2013-6-1 18:19 编辑

  1. Sub 按人汇总()
  2. Dim i%, k%, j%, d As Object, arr()
  3. ReDim Preserve arr(1 To 42, 1 To 2)
  4. For i = 1 To 3
  5. a = Cells(65536, 2 * i - 1).End(3).Row
  6. For Each Rng In Range(Cells(2, 2 * i - 1), Cells(a, 2 * i - 1))
  7. If Rng <> "" Then
  8. k = k + 1
  9. arr(k, 1) = Cells(Rng.Row, 2 * i - 1)
  10. arr(k, 2) = Cells(Rng.Row, 2 * i)
  11. End If
  12. Next
  13. Next
  14. Set d = CreateObject("scripting.dictionary")
  15. For j = 1 To UBound(arr)
  16. If Not d.exists(arr(j, 1)) Then
  17. d.Add (arr(j, 1)), arr(j, 2)
  18. d(arr(j, 1)) = d(arr(j, 1)) + arr(j, 2)
  19. End If
  20. Next
  21. Cells(2, "h").Resize(d.Count, 1) = Application.Transpose(d.keys)
  22. Cells(2, "i").Resize(d.Count, 1) = Application.Transpose(d.items)
  23. End Sub
复制代码
最佳答案
2013-6-1 18:44
  1.     For j = 1 To UBound(arr)
  2.         If Not d.exists(arr(j, 1)) Then
  3.             d.Add (arr(j, 1)), arr(j, 2)
  4.         Else
  5.             d(arr(j, 1)) = d(arr(j, 1)) + arr(j, 2)
  6.         End If
  7.     Next
复制代码

VBA的求和结果为什么不对?.rar

9.15 KB, 下载次数: 12

发表于 2013-6-1 18:44 | 显示全部楼层    本楼为最佳答案   
  1.     For j = 1 To UBound(arr)
  2.         If Not d.exists(arr(j, 1)) Then
  3.             d.Add (arr(j, 1)), arr(j, 2)
  4.         Else
  5.             d(arr(j, 1)) = d(arr(j, 1)) + arr(j, 2)
  6.         End If
  7.     Next
复制代码
回复

使用道具 举报

发表于 2013-6-1 18:45 | 显示全部楼层
回复

使用道具 举报

发表于 2013-6-1 18:56 | 显示全部楼层
  1. Sub 按人汇总2()
  2.     Dim arr
  3.     Dim arrResult()
  4.     Dim i As Long, j As Long, lRecord&, k&

  5.    
  6.     arr = Range("a1").CurrentRegion
  7.     k = k + 1
  8.    
  9.     Dim objDic As Object
  10.     Set objDic = CreateObject("scripting.dictionary")

  11.     ReDim arrResult(1 To UBound(arr) * UBound(arr, 2) / 2 + 1, 1 To 2)
  12.     arrResult(1, 1) = "姓名"
  13.     arrResult(1, 2) = "成绩"
  14.    
  15.     For j = LBound(arr) + 1 To UBound(arr)
  16.         For i = LBound(arr, 2) To UBound(arr, 2) Step 2
  17.             If Len(arr(j, i)) > 0 Then
  18.                 If Not objDic.exists(arr(j, i)) Then
  19.                     k = k + 1
  20.                     objDic(arr(j, i)) = k
  21.                     lRecord = k
  22.                     arrResult(lRecord, 1) = arr(j, i)
  23.                 Else
  24.                     lRecord = objDic(arr(j, i))
  25.                 End If
  26.                 arrResult(lRecord, 2) = arrResult(lRecord, 2) + arr(j, i + 1)

  27.             End If
  28.         Next
  29.     Next
  30.     Range("n1").Resize(k, 2).Value = arrResult
  31.     Set objDic = Nothing
  32. End Sub
复制代码

评分

参与人数 1 +6 收起 理由
ligh1298 + 6 赞一个!感谢老师您!!!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-6-1 19:51 | 显示全部楼层
本帖最后由 ligh1298 于 2013-6-1 20:31 编辑

刚仔细看代码,找到原因了。感谢班亲的提醒,俺上附件,与大家分享。
Sub 按人汇总()
Dim i%, k%, j%, a%, b%, d As Object, arr() '申明变量类型
a = Application.CountIf(Range("a2:f" & Sheet1.UsedRange.Rows.Count), "<>") / 2 '区域内3列姓名中,不为空的个数
ReDim Preserve arr(1 To a, 1 To 2) '重新申明变量
For i = 1 To 3 '循环三次:姓名有三列。
b = Cells(65536, 2 * i - 1).End(3).Row '每列姓名有数据的最大行号。
For Each Rng In Range(Cells(2, 2 * i - 1), Cells(b, 2 * i - 1)) '遍历有姓名的列,第1列;第2列;第3列。
If Rng <> "" Then '如果姓名列不等于空
k = k + 1 '计数、累加
arr(k, 1) = Cells(Rng.Row, 2 * i - 1) '将姓名赋值给数组?1维
arr(k, 2) = Cells(Rng.Row, 2 * i) '将相对应姓名的成绩赋值给数组
End If
Next
Next
Set d = CreateObject("scripting.dictionary") '调用字典
For j = 1 To UBound(arr) '按字典的一维数,从1到数组的上限循环
d(arr(j, 1)) = d(arr(j, 1)) + arr(j, 2) '根据字典关键字(不重复姓名),对成绩进行累加。
Next
Range("h2:i" & [h65536].End(3).Row + 1).ClearContents '清空要写入数据区域
[h2].Resize(d.Count) = Application.Transpose(d.keys) '将字典的关键字(即不重复姓名)写入到H列。
[i2].Resize(d.Count) = Application.Transpose(d.items) '按字典里关键字对相应成绩求和写入到I列。
End Sub

VBA的求和结果.rar

9.45 KB, 下载次数: 5

回复

使用道具 举报

发表于 2013-6-1 19:56 | 显示全部楼层
ligh1298 发表于 2013-6-1 19:51
刚仔细看代码,找到原因了。感谢班亲的提醒,俺上附件,与大家分享。
Sub 按人汇总()
Dim i%, k%, j%, d  ...

其实这样的数据源可以不用字典的{:101:}{:101:}


感谢你的分享,这样可以帮助好多人了!!

评分

参与人数 1 +6 收起 理由
ligh1298 + 6 感谢关注!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-6-1 20:29 | 显示全部楼层
无聊的疯子 发表于 2013-6-1 19:56
其实这样的数据源可以不用字典的

近期在学习VBA的数组、字典。为了巩固,才自己整个题目,练练手。非常感谢老师您的关注!

评分

参与人数 1 +24 收起 理由
无聊的疯子 + 24 爱学习的大朋友,祝61节快乐!!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:55 , Processed in 1.167612 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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