ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 大量数据进行统计时如何提高统计效率

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-2-29 14:31 | 显示全部楼层 |阅读模式
各位大侠:
             附件是我的一份订单表,里面有3张表
总订单是我与服装厂签订的采购衣服的数量,衣服由货号、颜色、尺码三个条件决定;
每次发货记录是我们仓库提供给我的收货数据。
我现在需要同过这两份数据得出最终表的数据,即还有多少货厂家没发给我们。
由于表的格式很复杂,我的做法是,
1、先将总订单转化成总单点转换表
2、再将每次发货记录转换成每次发货转换表
3、将每次发货转换表中的数据提取到总订单转换表中
4、根据总订单的转换表生成最终表。
总订单与最终表的格式是相同的。

上面的过程效率非常的低下,随着发货数量的增加现在生成一次要半小时,我都要疯了。

各位大虾们帮我看看怎么提高效率呢。

帮帮我吧!!


定单.rar (172.96 KB, 下载次数: 57)



TA的精华主题

TA的得分主题

发表于 2012-2-29 15:03 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-29 15:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
可惜的是我不会呀

TA的精华主题

TA的得分主题

发表于 2012-2-29 16:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-29 16:48 | 显示全部楼层
本帖最后由 lxlaner 于 2012-2-29 16:49 编辑
  1. Sub 提取发货量()
  2. Dim i As Integer
  3. Dim x As Integer
  4. Dim Erow As Long
  5. Dim ErowChiMa As Integer
  6. TotalOrderToList.Range("G2:G65536").ClearContents
  7. Sheet5.Range("E2:E65536").ClearContents

  8. For i = 2 To TotalOrderToList.Cells(65536, 1).End(xlUp).Row



  9. For x = 2 To Sheet5.Cells(65536, 1).End(xlUp).Row

  10. ' If Sheet5.Cells(x, 5).Value = "" Then



  11. If TotalOrderToList.Cells(i, 1).Value = Sheet5.Cells(x, 1).Value And Left(TotalOrderToList.Cells(i, 4).Value, 3) = Left(Sheet5.Cells(x, 2).Value, 3) And _
  12. TotalOrderToList.Cells(i, 5).Value = Sheet5.Cells(x, 3).Value Then

  13. TotalOrderToList.Cells(i, 7).Value = TotalOrderToList.Cells(i, 7).Value - Sheet5.Cells(x, 4).Value

  14. Sheet5.Rows(x & ":" & x).Delete Shift:=xlUp

  15. x = x - 1

  16. End If

  17. 'End If

  18. Next x
  19. Next i

  20. End Sub
复制代码
就这段代码执行的速度最慢,就这个地方最需要优化,谢谢大侠了

TA的精华主题

TA的得分主题

发表于 2012-2-29 21:29 | 显示全部楼层
本帖最后由 liucqa 于 2012-2-29 21:49 编辑
lxlaner 发表于 2012-2-29 16:48
就这段代码执行的速度最慢,就这个地方最需要优化,谢谢大侠了

嗯,要改成数组操作才行,即使别的地方不优化,只优化这一个过程,最多几秒~十几秒程序全部都可以结束。

捕获.JPG

TA的精华主题

TA的得分主题

发表于 2012-2-29 21:56 | 显示全部楼层
捕获.JPG

我看了你以前的帖子,一个能写出加载宏和图片处理的老手,不应该不会数组呀?range转数组操作是VBA的基本操作技巧。

你是他本人吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-1 20:40 | 显示全部楼层
说来惭愧,我是没系统性的学过VB/VBA,都是用到什么学什么。现在知道不行了

点评

联系QQ 564955427  发表于 2012-3-1 20:52

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-1 22:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 提取发货量()

  2. Dim zong() As Variant

  3. Dim fen() As Variant

  4. Dim Zong_Row As Long

  5. Dim Fen_Row As Long

  6. TotalOrderToList.Range("G2:G65536").ClearContents
  7. Sheet5.Range("E2:E65536").ClearContents

  8. Zong_Row = TotalOrderToList.Cells(65536, 1).End(xlUp).Row

  9. Fen_Row = Sheet5.Cells(65536, 1).End(xlUp).Row
  10. Dim i As Integer
  11. Dim x As Integer
  12. 'Dim Erow As Long
  13. 'Dim ErowChiMa As Integer
  14. zong() = TotalOrderToList.Range("A2:G" & Zong_Row).Value
  15. fen() = Sheet5.Range("A2:G" & Fen_Row).Value
  16. For i = 1 To Zong_Row - 1
  17. For x = 1 To Fen_Row - 1

  18. If zong(i, 1) = fen(x, 1) And Left(zong(i, 4), 3) = Left(fen(x, 2), 3) And zong(i, 5) = fen(x, 3) Then

  19. zong(i, 7) = Int(zong(i, 7)) - Int(fen(x, 4))
  20. TotalOrderToList.Range("G1").Value = 2
  21. End If

  22. Next x
  23. Next i

  24. TotalOrderToList.Range("A2:G65536").ClearContents
  25. TotalOrderToList.Range("A2:G" & Zong_Row) = zong

  26. End Sub
复制代码

经大侠的提醒,小学了下数组,果然效率提升惊人。谢谢!!

TA的精华主题

TA的得分主题

发表于 2012-3-2 01:10 | 显示全部楼层
lxlaner 发表于 2012-3-1 22:10
经大侠的提醒,小学了下数组,果然效率提升惊人。谢谢!!

SheetTotalOrder.Cells(i, 6 + x).Value <> ""

类似这样的语句用len判断会更快
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-2 07:47 , Processed in 0.043421 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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