ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3576|回复: 22

[求助] 请问如何用程序代替公式以便提高速度?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-6-23 12:16 | 显示全部楼层 |阅读模式
大家好,
我的这个表有很多公式,数据量大时运行非常慢,不知能不能用程序来代代替公式? 物料表.rar (22.01 KB, 下载次数: 49)

非常感谢大家

TA的精华主题

TA的得分主题

发表于 2012-6-23 14:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
建议使用数据库。

不应该使用Excel

TA的精华主题

TA的得分主题

发表于 2012-6-23 16:57 | 显示全部楼层
本帖最后由 doitbest 于 2012-6-23 16:58 编辑
  1. Public Sub sumif1()
  2. Dim ar, br(), i, cr, dr, er
  3. Dim d1 As Object, d2 As Object, d3 As Object, d4 As Object, d5 As Object
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. Set d2 = CreateObject("Scripting.Dictionary")
  6. Set d3 = CreateObject("Scripting.Dictionary")
  7. Set d4 = CreateObject("Scripting.Dictionary")
  8. Set d5 = CreateObject("Scripting.Dictionary")
  9. ar = Range([b6], [b6].End(4))
  10. ReDim br(1 To UBound(ar), 1 To 5)
  11. cr = Sheets("数据库.在途量").Range("e4:j" & Sheets("数据库.在途量").[j65536].End(3).Row)
  12. dr = Sheets("数据库.IQC在检").Range("a4:c" & Sheets("数据库.IQC在检").[c65536].End(3).Row)
  13. er = Sheets("数据库.森田总表").Range("c4:s" & Sheets("数据库.森田总表").[s65536].End(3).Row)
  14. For i = 1 To UBound(cr)
  15.     If Not d1.exists(cr(i, 1)) Then
  16.         d1(cr(i, 1)) = cr(i, 6)
  17.     Else
  18.         d1(cr(i, 1)) = d1(cr(i, 1)) + cr(i, 6)
  19.     End If
  20. Next
  21. For i = 1 To UBound(dr)
  22.     d2(dr(i, 1)) = dr(i, 3)
  23. Next
  24. For i = 1 To UBound(er)
  25.     If Not d3.exists(er(i, 1)) Then d3(er(i, 1)) = er(i, 12)
  26.     If Not d4.exists(er(i, 1)) Then d4(er(i, 1)) = er(i, 17)
  27.     If Not d5.exists(er(i, 1)) Then d5(er(i, 1)) = er(i, 14)
  28. Next
  29. For i = 1 To UBound(ar)
  30.     If Not d1.exists(ar(i, 1)) Then
  31.         br(i, 1) = 0
  32.     Else
  33.         br(i, 1) = d1(ar(i, 1))
  34.     End If
  35.     If d2.exists(ar(i, 1)) Then br(i, 2) = d2(ar(i, 1)) Else br(i, 2) = 0
  36.     If d3.exists(ar(i, 1)) Then br(i, 3) = d3(ar(i, 1)) Else br(i, 3) = 0
  37.     If d4.exists(ar(i, 1)) Then br(i, 4) = d4(ar(i, 1))
  38.     If d5.exists(ar(i, 1)) Then br(i, 5) = d5(ar(i, 1))
  39. Next
  40. [j6].Resize(UBound(ar), 5) = br
  41. Set d1 = Nothing
  42. Set d2 = Nothing
  43. Set d3 = Nothing
  44. Set d4 = Nothing
  45. Set d5 = Nothing
  46. End Sub
复制代码



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-6-23 16:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请参考附件

物料表.rar

24.39 KB, 下载次数: 45

TA的精华主题

TA的得分主题

发表于 2012-6-23 18:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
doitbest 发表于 2012-6-23 16:59
请参考附件

探讨一下:使用一个字典速度是否会快些?

  1. Sub Macro1()
  2.     Dim ar, br(), i&, j&, cr, dr, er
  3.     Dim d As Object
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     ar = Range([b6], [b6].End(4))
  6.     ReDim br(1 To UBound(ar), 1 To 5)
  7.     cr = Sheets("数据库.在途量").Range("e4:j" & Sheets("数据库.在途量").[j65536].End(3).Row)
  8.     dr = Sheets("数据库.IQC在检").Range("a4:c" & Sheets("数据库.IQC在检").[c65536].End(3).Row)
  9.     er = Sheets("数据库.森田总表").Range("c4:s" & Sheets("数据库.森田总表").[s65536].End(3).Row)
  10.     For i = 1 To UBound(cr)
  11.         d(1 & Chr(9) & cr(i, 1)) = d(1 & Chr(9) & cr(i, 1)) + cr(i, 6)
  12.     Next
  13.     For i = 1 To UBound(dr)
  14.         d(2 & Chr(9) & dr(i, 1)) = dr(i, 3)
  15.     Next
  16.     For i = 1 To UBound(er)
  17.         If Not d.exists(3 & Chr(9) & er(i, 1)) Then d(3 & Chr(9) & er(i, 1)) = er(i, 12)
  18.         If Not d.exists(4 & Chr(9) & er(i, 1)) Then d(4 & Chr(9) & er(i, 1)) = er(i, 17)
  19.         If Not d.exists(5 & Chr(9) & er(i, 1)) Then d(5 & Chr(9) & er(i, 1)) = er(i, 14)
  20.     Next
  21.     For i = 1 To UBound(ar)
  22.         For j = 1 To 3
  23.             If d.exists(j & Chr(9) & ar(i, 1)) Then br(i, j) = d(j & Chr(9) & ar(i, 1)) Else br(i, j) = 0
  24.         Next
  25.         For j = 4 To 5
  26.             br(i, j) = d(j & Chr(9) & ar(i, 1))
  27.         Next
  28.     Next
  29.     [j6].Resize(UBound(ar), 5) = br
  30. End Sub
复制代码


物料表.rar (25.18 KB, 下载次数: 49)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-23 20:52 | 显示全部楼层
本帖最后由 huagnzhailing 于 2012-6-23 22:27 编辑
香川群子 发表于 2012-6-23 14:35
建议使用数据库。

不应该使用Excel


香川群子老师,是这样的,我们公司有上ERP系统,只是这个EPR系统总有这样或那样不尽人意的地方.
所以,很多同事都会从EPR导出库存总表等资料,然后用EXCEL进行编辑管理.我的所谓数据库,其实就是从ERP导出的资料而已.而ERP导出的数据动则好几万行,想用公式进行一些编辑,速度就相当慢了.

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-23 21:56 | 显示全部楼层
本帖最后由 huagnzhailing 于 2012-6-23 22:12 编辑
zhaogang1960 发表于 2012-6-23 18:59
探讨一下:使用一个字典速度是否会快些?


赵老师您好,我对您的印象太深了,两年前您帮我写的一些程序对我工作上的帮忙影响非常深远.只是我现在重新注册了用户.再次对您说声感谢.

如果用一个字典能更快一些就太好了.只是我现在不在办公室,没法导出EPR数据,我想只有在数据量超大的情况下才好看出一个字典和多个字典的速度差别.还有我刚才运行了一下,怎么E列的"单位"数据提取不出来?

另,附件的 F列数据的提取,其程序也是"doitbest" 在我的一篇名为"请问如何从数据库中提取指定仓库的库存?"中写的,给我的帮助也相当大.G列,H列,I列的数据提取,是我复制 doitbest老师的程序而得.总感觉这样复制就很累赘了,数据量大时感觉还是有点慢.不知还能不能优化? 物料1.rar (21.9 KB, 下载次数: 15)

最后,如何把刚才的"一个字典"程序,和上述程序连在一起?

非常感谢

点评

一个字典能否更快一些还不好说,因为我用了很多&连接,请认真测试,如果不够快可以减少一个&  发表于 2012-6-23 22:49

TA的精华主题

TA的得分主题

发表于 2012-6-23 22:24 | 显示全部楼层
huagnzhailing 发表于 2012-6-23 21:56
赵老师您好,我对您的印象太深了,两年前您帮我写的一些程序对我工作上的帮忙影响非常深远.只是我现在 ...

和原来程序衔接请doitbest老师完成吧,我看不懂别人写的代码
关于E列的"单位":
  1. Sub Macro1()
  2.     Dim ar, br(), i&, j&, cr, dr, er
  3.     Dim d As Object
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     ar = Range([b6], [b6].End(4))
  6.     ReDim br(1 To UBound(ar), 1 To 5)
  7.     cr = Sheets("数据库.在途量").Range("e4:j" & Sheets("数据库.在途量").[j65536].End(3).Row)
  8.     dr = Sheets("数据库.IQC在检").Range("a4:c" & Sheets("数据库.IQC在检").[c65536].End(3).Row)
  9.     er = Sheets("数据库.森田总表").Range("c4:s" & Sheets("数据库.森田总表").[s65536].End(3).Row)
  10.     For i = 1 To UBound(cr)
  11.         d(1 & Chr(9) & cr(i, 1)) = d(1 & Chr(9) & cr(i, 1)) + cr(i, 6)
  12.     Next
  13.     For i = 1 To UBound(dr)
  14.         d(2 & Chr(9) & dr(i, 1)) = dr(i, 3)
  15.     Next
  16.     For i = 1 To UBound(er)
  17.         If Not d.exists(3 & Chr(9) & er(i, 1)) Then d(3 & Chr(9) & er(i, 1)) = er(i, 12)
  18.         If Not d.exists(4 & Chr(9) & er(i, 1)) Then d(4 & Chr(9) & er(i, 1)) = er(i, 17)
  19.         If Not d.exists(5 & Chr(9) & er(i, 1)) Then d(5 & Chr(9) & er(i, 1)) = er(i, 14)
  20.         d(6 & Chr(9) & er(i, 1)) = er(i, 5)
  21.     Next
  22.     For i = 1 To UBound(ar)
  23.         For j = 1 To 3
  24.             If d.exists(j & Chr(9) & ar(i, 1)) Then br(i, j) = d(j & Chr(9) & ar(i, 1)) Else br(i, j) = 0
  25.         Next
  26.         For j = 4 To 5
  27.             br(i, j) = d(j & Chr(9) & ar(i, 1))
  28.         Next
  29.         ar(i, 1) = d(6 & Chr(9) & ar(i, 1))
  30.     Next
  31.     [j6].Resize(i - 1, 5) = br
  32.     [e6].Resize(i - 1) = ar
  33. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2012-6-24 08:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢老师鼓励!!对两个代码进行了测试,结果相差无几。用6万条数据测试,3楼用时3.141秒,5楼用时3.156秒,二者速度差别基本忽略不计,但5楼代码在思路和简洁性上更有优势

TA的精华主题

TA的得分主题

发表于 2012-6-24 11:15 | 显示全部楼层
doitbest 发表于 2012-6-24 08:21
谢谢老师鼓励!!对两个代码进行了测试,结果相差无几。用6万条数据测试,3楼用时3.141秒,5楼用时3.156秒, ...

谢谢测试,如果速度没有提高就没有实际意义
请楼主用大数据测试下面两个程序:


  1. Public Sub sumif1() '6个字典
  2.     Dim ar, br(), i, cr, dr, er, tt
  3.     tt = Timer
  4.     Dim d1 As Object, d2 As Object, d3 As Object, d4 As Object, d5 As Object, d6 As Object
  5.     Set d1 = CreateObject("Scripting.Dictionary")
  6.     Set d2 = CreateObject("Scripting.Dictionary")
  7.     Set d3 = CreateObject("Scripting.Dictionary")
  8.     Set d4 = CreateObject("Scripting.Dictionary")
  9.     Set d5 = CreateObject("Scripting.Dictionary")
  10.     Set d6 = CreateObject("Scripting.Dictionary")
  11.     ar = Range([b6], [b6].End(4))
  12.     ReDim br(1 To UBound(ar), 1 To 5)
  13.     cr = Sheets("数据库.在途量").Range("e4:j" & Sheets("数据库.在途量").[j65536].End(3).Row)
  14.     dr = Sheets("数据库.IQC在检").Range("a4:c" & Sheets("数据库.IQC在检").[c65536].End(3).Row)
  15.     er = Sheets("数据库.森田总表").Range("c4:s" & Sheets("数据库.森田总表").[s65536].End(3).Row)
  16.     For i = 1 To UBound(cr)
  17.         If Not d1.exists(cr(i, 1)) Then
  18.             d1(cr(i, 1)) = cr(i, 6)
  19.         Else
  20.             d1(cr(i, 1)) = d1(cr(i, 1)) + cr(i, 6)
  21.         End If
  22.     Next
  23.     For i = 1 To UBound(dr)
  24.         d2(dr(i, 1)) = dr(i, 3)
  25.     Next
  26.     For i = 1 To UBound(er)
  27.         If Not d3.exists(er(i, 1)) Then d3(er(i, 1)) = er(i, 12)
  28.         If Not d4.exists(er(i, 1)) Then d4(er(i, 1)) = er(i, 17)
  29.         If Not d5.exists(er(i, 1)) Then d5(er(i, 1)) = er(i, 14)
  30.         d6(er(i, 1)) = er(i, 5)
  31.     Next
  32.     For i = 1 To UBound(ar)
  33.         If Not d1.exists(ar(i, 1)) Then
  34.             br(i, 1) = 0
  35.         Else
  36.             br(i, 1) = d1(ar(i, 1))
  37.         End If
  38.         If d2.exists(ar(i, 1)) Then br(i, 2) = d2(ar(i, 1)) Else br(i, 2) = 0
  39.         If d3.exists(ar(i, 1)) Then br(i, 3) = d3(ar(i, 1)) Else br(i, 3) = 0
  40.         If d4.exists(ar(i, 1)) Then br(i, 4) = d4(ar(i, 1))
  41.         If d5.exists(ar(i, 1)) Then br(i, 5) = d5(ar(i, 1))
  42.         ar(i, 1) = d6(ar(i, 1))
  43.     Next
  44.     [j6].Resize(UBound(ar), 5) = br
  45.     [e6].Resize(i - 1) = ar
  46.     Set d1 = Nothing
  47.     Set d2 = Nothing
  48.     Set d3 = Nothing
  49.     Set d4 = Nothing
  50.     Set d5 = Nothing
  51.     MsgBox Timer - tt
  52. End Sub
复制代码

  1. Sub Macro1() '1个字典
  2.     Dim ar, br(), i&, j&, cr, dr, er, tt
  3.     tt = Timer
  4.     Dim d As Object
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     ar = Range([b6], [b6].End(4))
  7.     ReDim br(1 To UBound(ar), 1 To 5)
  8.     cr = Sheets("数据库.在途量").Range("e4:j" & Sheets("数据库.在途量").[j65536].End(3).Row)
  9.     dr = Sheets("数据库.IQC在检").Range("a4:c" & Sheets("数据库.IQC在检").[c65536].End(3).Row)
  10.     er = Sheets("数据库.森田总表").Range("c4:s" & Sheets("数据库.森田总表").[s65536].End(3).Row)
  11.     For i = 1 To UBound(cr)
  12.         d(cr(i, 1)) = d(cr(i, 1)) + cr(i, 6)
  13.     Next
  14.     For i = 1 To UBound(dr)
  15.         d("A" & dr(i, 1)) = dr(i, 3)
  16.     Next
  17.     For i = 1 To UBound(er)
  18.         If Not d.exists("B" & er(i, 1)) Then d("B" & er(i, 1)) = er(i, 12)
  19.         If Not d.exists("C" & er(i, 1)) Then d("C" & er(i, 1)) = er(i, 17)
  20.         If Not d.exists("D" & er(i, 1)) Then d("D" & er(i, 1)) = er(i, 14)
  21.         d("E" & er(i, 1)) = er(i, 5)
  22.     Next
  23.     For i = 1 To UBound(ar)
  24.         If d.exists(ar(i, 1)) Then br(i, 1) = d(ar(i, 1)) Else br(i, 1) = 0
  25.         If d.exists("A" & ar(i, 1)) Then br(i, 2) = d("A" & ar(i, 1)) Else br(i, 2) = 0
  26.         If d.exists("B" & ar(i, 1)) Then br(i, 3) = d("B" & ar(i, 1)) Else br(i, 3) = 0
  27.         br(i, 4) = d("C" & ar(i, 1))
  28.         br(i, 5) = d("D" & ar(i, 1))
  29.         ar(i, 1) = d("E" & ar(i, 1))
  30.     Next
  31.     [j6].Resize(i - 1, 5) = br
  32.     [e6].Resize(i - 1) = ar
  33.     MsgBox Timer - tt
  34. End Sub
复制代码


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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 03:03 , Processed in 0.046968 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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