Excel精英培训网

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

[已解决]用字典方法汇总vba代码修改

[复制链接]
发表于 2013-12-5 13:53 | 显示全部楼层 |阅读模式
我的代码运行时错误“1004”,为什么呢? 台账.rar (171.28 KB, 下载次数: 9)
发表于 2013-12-5 14:08 | 显示全部楼层
本帖最后由 兰色幻想 于 2013-12-5 14:10 编辑

i=671 时 arr(i, 13) 和 arr(i, 14) 结果都是空值,你把光标放在上面就能看到值。所以造成d2()也出错
回复

使用道具 举报

发表于 2013-12-5 14:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zjdh 于 2013-12-5 14:20 编辑

台账.rar (165.8 KB, 下载次数: 42)
回复

使用道具 举报

发表于 2013-12-5 14:22 | 显示全部楼层
根源在你这句上
arr = .UsedRange
回复

使用道具 举报

 楼主| 发表于 2013-12-5 15:06 | 显示全部楼层
zjdh 发表于 2013-12-5 14:22
根源在你这句上
arr = .UsedRange

谢谢你的帮助!现在找到了出错的原因了。本代码运行速度较慢,我想把运算结果放在crr这个数组里,以提高运算速度,但没弄成功,你能帮我修改一下代码吗?
回复

使用道具 举报

 楼主| 发表于 2013-12-5 19:10 | 显示全部楼层
是arr = .UsedRange这句代码有问题,谢谢兰版主,我用的是你讲的下棋的方法汇总,我想结合数组提高运算速度,谁有时间帮忙修改一下。
回复

使用道具 举报

 楼主| 发表于 2013-12-6 09:18 | 显示全部楼层
  1. Sub 总指标额度()
  2. Dim d1 As New Dictionary
  3.     Dim d2 As New Dictionary
  4.     Dim i As Long
  5.     Dim m As Long
  6.     Dim x As Long
  7.     Dim arr, brr, crr()
  8.     Dim t
  9.     t = Timer
  10.     Range("a6:aj65536").ClearContents
  11.     brr = Range("b4:aj5")
  12.     For m = 1 To 35
  13.         If brr(1, m) = "" Then
  14.             brr(1, m) = brr(1, m - 1)
  15.         End If
  16.         If d2.Exists(brr(1, m) & brr(2, m)) = False Then
  17.             d2(brr(1, m) & brr(2, m)) = d2.Count + 2
  18.         End If
  19.     Next m
  20.     With Sheets("数据录入")
  21.         arr = .Range("A6:O" & .Range("B65536").End(xlUp).Row).Value
  22.     End With
  23.     For x = 1 To UBound(arr)
  24.       If arr(x, 2) <> "" Then
  25.         If Not d1.Exists(arr(x, 2)) Then
  26.             i = i + 1
  27.             d1(arr(x, 2)) = i
  28.             ReDim Preserve crr(1 To 36, 0 To i)
  29.            crr(1, i) = arr(x, 2)
  30.         End If
  31.            crr(2, d1(arr(x, 2))) = crr(2, d1(arr(x, 2))) + arr(x, 10)
  32.           If arr(x, 13) = "年初预算" Then
  33.            crr(8, d1(arr(x, 2))) = crr(8, d1(arr(x, 2))) + arr(x, 10)
  34.         ElseIf arr(x, 13) = "上年结转" Then
  35.             crr(11, d1(arr(x, 2))) = crr(11, d1(arr(x, 2))) + arr(x, 10)
  36.         ElseIf arr(x, 13) = "中途追加" Then
  37.             crr(36, d1(arr(x, 2))) = crr(36, d1(arr(x, 2))) + arr(x, 10)
  38.         End If
  39.         crr(d2(arr(x, 13) & arr(x, 14)), d1(arr(x, 2))) = crr(d2(arr(x, 13) & arr(x, 14)), d1(arr(x, 2))) + arr(x, 10)
  40.       End If
  41.     Next x
  42.     i = i + 1
  43.     ReDim Preserve crr(1 To 36, 0 To i)
  44.     crr(1, 0) = "合  计"
  45.     For x = 2 To 36
  46.         For y = 1 To i
  47.            crr(x, 0) = crr(x, 0) + crr(x, y)
  48.     Next y, x
  49.     With Sheets("总指标额度")
  50.         .Range("A6:AJ65536").ClearContents
  51.         .Range("A6:AJ65536").Borders.LineStyle = 0
  52.         .Range("A6").Resize(UBound(crr, 2), UBound(crr)) = Application.Transpose(crr)
  53.         .Range("A6").Resize(UBound(crr, 2), UBound(crr)).Borders.LineStyle = 1
  54.     End With
  55.    ' Cells(6, 1) = "合  计"
  56.    ' For x = 2 To 36
  57.       '  For y = 7 To i + 7
  58.            'Cells(6, x) = Cells(6, x) + Cells(y, x)
  59.    ' Next y, x
  60.     MsgBox "苏广余提示,汇总结束,用时" & Timer - t & "秒"
  61.     End Sub
复制代码
自己弄好了
回复

使用道具 举报

发表于 2013-12-6 09:35 | 显示全部楼层
正想动手帮你,你已经自己搞定了,自己动手丰衣足食!
回复

使用道具 举报

 楼主| 发表于 2013-12-7 09:07 | 显示全部楼层
zjdh 发表于 2013-12-6 09:35
正想动手帮你,你已经自己搞定了,自己动手丰衣足食!

谢谢你的帮助!
回复

使用道具 举报

发表于 2013-12-16 12:31 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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