Excel精英培训网

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

[已解决]请问如何加快VBA运算速度?

[复制链接]
发表于 2015-8-17 11:03 | 显示全部楼层 |阅读模式
请问sumif函数在VBA中运算时速度超慢,据说可以用内存什么的加快运算速度,请问怎么写呀?(根据下面的代码)谢谢!

Sub ttt()
    With sheet3
         For i = 2 To 1000
            .Cells(i, 12) = Application.WorksheetFunction.SumIf(Sheet1.[a:a], .Cells(i, 11), Sheet1.[b:b])
         Next
    End With
  End If
End Sub
最佳答案
2015-8-17 14:11
lgfcl 发表于 2015-8-17 13:49
单元格L2 金额取不出来?

可以了。
  1. Sub ttt()
  2. Dim arr, Dic
  3. arr = Sheet1.UsedRange
  4. Set Dic = CreateObject("scripting.dictionary")
  5.          For a = 2 To UBound(arr)
  6.                Dic(arr(a, 1)) = Dic(arr(a, 1)) + Val(arr(a, 2))
  7.          Next
  8. arr = Sheet3.Range(Sheet3.[L2], Sheet3.Cells(Rows.Count, "K").End(3))
  9.          For a = 1 To UBound(arr)
  10.                 arr(a, 2) = Dic(arr(a, 1))
  11.          Next
  12. Sheet3.Range(Sheet3.[L2], Sheet3.Cells(Rows.Count, "K").End(3)) = arr
  13. End Sub
复制代码
发表于 2015-8-17 11:16 | 显示全部楼层
忘掉你的工作表函数,用真正的VBA,速度自然就快了
回复

使用道具 举报

发表于 2015-8-17 11:30 | 显示全部楼层
本帖最后由 gufengaoyue 于 2015-8-17 13:22 编辑

见6楼代码。
回复

使用道具 举报

 楼主| 发表于 2015-8-17 12:20 | 显示全部楼层

dic(arr(a,11)) = dic(arr(a,11)) + val(arr(a,2))
运行时错误代码9 ,下标出界?

1.zip

13.13 KB, 下载次数: 2

回复

使用道具 举报

 楼主| 发表于 2015-8-17 13:09 | 显示全部楼层
gufengaoyue 发表于 2015-8-17 11:30
没有文件可以测,只是根据你的代码意思来理解的。
你自己先试试,如果不行,再把你的文件发个上来看看。

运行时有错误提示框?麻烦帮看一下,谢谢!

1.zip

13.13 KB, 下载次数: 6

回复

使用道具 举报

发表于 2015-8-17 13:22 | 显示全部楼层
本帖最后由 gufengaoyue 于 2015-8-17 14:11 编辑
lgfcl 发表于 2015-8-17 13:09
运行时有错误提示框?麻烦帮看一下,谢谢!

改成这样。试试吧。
  1. Sub ttt()
  2. Dim arr, Dic
  3. arr = Sheet1.UsedRange
  4. Set Dic = CreateObject("scripting.dictionary")
  5.          For a = 2 To UBound(arr)
  6.                Dic(arr(a, 1)) = Dic(arr(a, 1)) + Val(arr(a, 2))
  7.          Next
  8. arr = Sheet3.Range(Sheet3.[L2], Sheet3.Cells(Rows.Count, "K").End(3))
  9.          For a = 1 To UBound(arr)
  10.                 arr(a, 2) = Dic(arr(a, 1))
  11.          Next
  12. Sheet3.Range(Sheet3.[L2], Sheet3.Cells(Rows.Count, "K").End(3)) = arr
  13. End Sub
复制代码
回复

使用道具 举报

发表于 2015-8-17 13:27 | 显示全部楼层
改自你5楼附件:
Sub ttt()
Dim arr, Dic
arr = Sheets("sheet1").Range("a1").CurrentRegion.Value
Set Dic = CreateObject("scripting.dictionary")
For a = 2 To UBound(arr)
        Dic(arr(a, 1)) = Dic(arr(a, 1)) + Val(arr(a, 2))
Next
Sheets("sheet3").Range("k2").Resize(Dic.Count) = Application.Transpose(Dic.keys)
Sheets("sheet3").Range("l2").Resize(Dic.Count) = Application.Transpose(Dic.items)
End Sub
回复

使用道具 举报

 楼主| 发表于 2015-8-17 13:49 | 显示全部楼层
gufengaoyue 发表于 2015-8-17 13:22
改成这样。试试吧。

单元格L2 金额取不出来?
回复

使用道具 举报

发表于 2015-8-17 14:11 | 显示全部楼层    本楼为最佳答案   
lgfcl 发表于 2015-8-17 13:49
单元格L2 金额取不出来?

可以了。
  1. Sub ttt()
  2. Dim arr, Dic
  3. arr = Sheet1.UsedRange
  4. Set Dic = CreateObject("scripting.dictionary")
  5.          For a = 2 To UBound(arr)
  6.                Dic(arr(a, 1)) = Dic(arr(a, 1)) + Val(arr(a, 2))
  7.          Next
  8. arr = Sheet3.Range(Sheet3.[L2], Sheet3.Cells(Rows.Count, "K").End(3))
  9.          For a = 1 To UBound(arr)
  10.                 arr(a, 2) = Dic(arr(a, 1))
  11.          Next
  12. Sheet3.Range(Sheet3.[L2], Sheet3.Cells(Rows.Count, "K").End(3)) = arr
  13. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-4 00:52 , Processed in 0.484539 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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