ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 汇总数据求提速

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-12 21:59 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
汇总数据求提速,几万行模拟数据用了7分钟,耗用97% 的内存。以前厂人多每月有13万行数据,现在人少了也有9万多行每月。

以工序为参照系制单号为辅助统计产量办法.rar

875.43 KB, 下载次数: 47

TA的精华主题

TA的得分主题

发表于 2015-3-12 22:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
可以考虑做个透视表,虽然汇总结构有所变化,但是依然很直观,尤其是效率很高
1.jpg

点评

要的不是这样的,同一个员工要汇总在一行,实现终端取数。  发表于 2015-3-12 22:22

TA的精华主题

TA的得分主题

发表于 2015-3-12 23:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
干嘛不做个系统什么的了?

点评

数据是从系统导出来加工的。  发表于 2015-3-13 07:28

TA的精华主题

TA的得分主题

发表于 2015-3-13 00:41 | 显示全部楼层
试试看,处理本例6万行数据在我的机器上用时约0.7秒:
  1. Sub cbtaja()
  2. Dim arr, brr, d, d2, i&, j&, k&, zl&, r&, h&, l&, p&, t#, ghgx$, tmp
  3. t = Timer
  4. Set d = CreateObject("scripting.dictionary")
  5. arr = Sheet2.Range("A1").CurrentRegion
  6. r = UBound(arr)
  7. ReDim brr(1 To 5000) '假设工人人数5000以内
  8. ReDim crr(1 To 5000, 1 To 256) '假设工序256以内
  9. For i = 2 To r
  10.     arr(i, 2) = Format(arr(i, 2), String(8, "0"))
  11.     ghgx = arr(i, 2) & arr(i, 11)
  12.     If Not d.Exists(arr(i, 2)) Then
  13.         h = h + 1
  14.         d(arr(i, 2)) = h
  15.         brr(h) = 2
  16.         d(ghgx) = 2
  17.         crr(h, 1) = arr(i, 2)
  18.         crr(h, 2) = Array(arr(i, 8), arr(i, 11), arr(i, 14))
  19.     Else
  20.         p = d(arr(i, 2))
  21.         If d.Exists(ghgx) Then
  22.             l = d(ghgx)
  23.             tmp = crr(p, l)
  24.             tmp(2) = tmp(2) + arr(i, 14)
  25.             If InStr(tmp(0), arr(i, 8)) = 0 Then tmp(0) = tmp(0) & "/" & arr(i, 8)
  26.             crr(p, l) = tmp
  27.         Else
  28.             l = brr(p) + 1
  29.             d(ghgx) = l
  30.             If zl < l Then zl = l
  31.             brr(p) = l
  32.             crr(p, l) = Array(arr(i, 8), arr(i, 11), arr(i, 14))
  33.         End If
  34.     End If
  35. Next
  36. For i = 1 To h
  37.     For j = 2 To brr(i)
  38.         If IsArray(crr(i, j)) Then
  39.             If InStr(crr(i, j)(0), "/") > 0 Then crr(i, j)(0) = "(" & crr(i, j)(0) & ")"
  40.             crr(i, j) = Join(crr(i, j), " ") & "件"
  41.         End If
  42.     Next
  43. Next
  44. Sheet1.Range("A2").Resize(h, zl) = crr
  45. MsgBox Timer - t
  46. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 07:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cbtaja 发表于 2015-3-13 00:41
试试看,处理本例6万行数据在我的机器上用时约0.7秒:

数据少时,反而运行时错误1004。

以工序为参照系制单号为辅助统计产量办法1.rar

14.85 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2015-3-13 08:25 | 显示全部楼层
张雄友 发表于 2015-3-13 07:29
数据少时,反而运行时错误1004。

为什么不在系统里做处理了?

TA的精华主题

TA的得分主题

发表于 2015-3-13 10:59 | 显示全部楼层
试一下自定义结构做一下了(也是随便做的,基本是没有什么算法的。)。
  1. Type myindex
  2.     name As String
  3.     no As String
  4.     d As Object
  5.     capacity As Long
  6. End Type
  7. Type mylist
  8.     workNo As Long
  9.     d As Object
  10.     list() As myindex
  11.     count As Long
  12. End Type

  13. Sub 按钮7_Click()
  14.     Dim d As Object, ds As Object
  15.     Dim a() As mylist
  16.     mytime = Timer
  17.     Set d = CreateObject("scripting.dictionary")
  18.     Set ds = CreateObject("scripting.dictionary")

  19.     arr = Sheets("交飞明细").Range("a1").CurrentRegion
  20.     For i = 1 To UBound(arr, 2)
  21.         d(arr(1, i)) = i
  22.     Next
  23.     For i = 2 To UBound(arr)
  24.         If Not ds.Exists(arr(i, d("工号"))) Then
  25.             n = n + 1
  26.             ds(arr(i, d("工号"))) = n
  27.             ReDim Preserve a(1 To n)
  28.             With a(n)
  29.                 .workNo = arr(i, d("工号"))
  30.                 .count = 1
  31.                 Set .d = CreateObject("scripting.dictionary")
  32.                 .d(arr(i, d("工序名称"))) = .count
  33.                 ReDim Preserve .list(1 To 1)
  34.                 With .list(1)
  35.                     Set .d = CreateObject("scripting.dictionary")
  36.                     .d(arr(i, d("制单号"))) = ""
  37.                     .name = arr(i, d("工序名称"))
  38.                     .no = arr(i, d("制单号"))
  39.                     .capacity = arr(i, d("产量"))
  40.                 End With
  41.             End With
  42.         Else
  43.             With a(ds(arr(i, d("工号"))))
  44.                 If Not .d.Exists(arr(i, d("工序名称"))) Then
  45.                     .count = .count + 1
  46.                     If .count > Max Then Max = .count
  47.                     .d(arr(i, d("工序名称"))) = .count
  48.                     ReDim Preserve .list(1 To .count)
  49.                     With .list(.count)
  50.                         .name = arr(i, d("工序名称"))
  51.                         Set .d = CreateObject("scripting.dictionary")
  52.                         .d(arr(i, d("制单号"))) = ""
  53.                         .no = arr(i, d("制单号"))
  54.                         .capacity = arr(i, d("产量"))
  55.                     End With
  56.                 Else
  57.                     With .list(.d(arr(i, d("工序名称"))))

  58.                         If Not .d.Exists((arr(i, d("制单号")))) Then
  59.                             .no = .no & "" & arr(i, d("制单号"))
  60.                         End If
  61.                         .capacity = .capacity + arr(i, d("产量"))
  62.                     End With
  63.                 End If
  64.             End With
  65.         End If
  66.     Next

  67.     ReDim brr(1 To UBound(a), 1 To Max + 1)
  68.     For i = 1 To UBound(a)

  69.         brr(i, 1) = a(i).workNo
  70.         For j = 1 To a(i).count

  71.             brr(i, j + 1) = a(i).list(j).no & " " & a(i).list(j).name & " " & a(i).list(j).capacity & "件"

  72.         Next

  73.     Next
  74.     Sheets("get").Range("a2").Resize(n, Max + 1) = brr
  75.     MsgBox Timer - mytime
  76. End Sub
复制代码

以工序为参照系制单号为辅助统计产量办法.zip

1.25 MB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2015-3-13 12:11 | 显示全部楼层
张雄友 发表于 2015-3-13 07:29
数据少时,反而运行时错误1004。

对变量zl需要赋初值。
请把以下这行代码添加到楼上第7行之前:
  1. If r > 1 Then zl = 2 Else Exit Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 18:26 | 显示全部楼层
笑着...两年过去 发表于 2015-3-13 08:25
为什么不在系统里做处理了?

我在公司是一个普通的会计员,不是程序设计师。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 18:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
suwenkai 发表于 2015-3-13 10:59
试一下自定义结构做一下了(也是随便做的,基本是没有什么算法的。)。

刚下班,测试一下,下标出错了。

以工序为参照系制单号为辅助统计产量办法下标了.rar

16.05 KB, 下载次数: 8

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

本版积分规则

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

GMT+8, 2024-12-22 17:18 , Processed in 0.045131 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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