ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 汇总数据求提速

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-13 19:09 | 显示全部楼层
张雄友 发表于 2015-3-13 18:48
刚下班,测试一下,下标出错了。

不用数组,直接写到表格里吧。
  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.     For i = 1 To UBound(a)

  68.         Sheets("get").Cells(i, 1) = a(i).workNo
  69.         For j = 1 To a(i).count

  70.             Sheets("get").Cells(i, j + 1) = a(i).list(j).no & " " & a(i).list(j).name & " " & a(i).list(j).capacity & "件"

  71.         Next

  72.     Next

  73.     MsgBox Timer - mytime
  74. End Sub












复制代码

TA的精华主题

TA的得分主题

发表于 2015-3-13 19:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这是附件。。。

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

20.14 KB, 下载次数: 11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-13 19:32 | 显示全部楼层
如果怕就话,就定义一下变量,给个初始值
max =1
  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, max
  16.     max = 1
  17.     mytime = Timer
  18.     Set d = CreateObject("scripting.dictionary")
  19.     Set ds = CreateObject("scripting.dictionary")

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

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

  68.     ReDim brr(1 To UBound(a), 1 To max + 1)
  69.     For i = 1 To UBound(a)

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

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

  73.         Next

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

TA的精华主题

TA的得分主题

发表于 2015-3-13 19:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
附件。、、、、、

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

20.13 KB, 下载次数: 11

点评

以字段名称代替数组维度这种写法比较直观。如d("工号") 代替 d(arr(i,2)).  发表于 2015-3-13 19:45

TA的精华主题

TA的得分主题

发表于 2015-3-13 19:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
自定义数据结构 和 字典代替维度我是学leel892大侠的。用得不是很好。就是变量。。。(小学英语的水平,只能是这样的了。)
  1. http://club.excelhome.net/thread-722501-1-1.html
复制代码
  1. http://club.excelhome.net/thread-958920-1-1.html
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 19:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 21:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
suwenkai 发表于 2015-3-13 19:34
附件。、、、、、

制单号不能去重复。

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

17.56 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2015-3-13 21:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用sql写了个

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

874.38 KB, 下载次数: 18

点评

SU7892/SU7891/SU7890 埋夹 33510件 怎么加个括号?变成:(SU7892/SU7891/SU7890) 埋夹 33510件  发表于 2015-3-13 22:18
太强大了。  发表于 2015-3-13 22:11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-13 22:47 | 显示全部楼层
++++++++()

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

873.2 KB, 下载次数: 11

点评

当数据去到6万行时,死机了。就是当有很多人(不重复工号时)  发表于 2015-3-13 23:17

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-14 09:33 | 显示全部楼层
修正了去重的问题
  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, max
  16.     max = 1
  17.     mytime = Timer
  18.     Set d = CreateObject("scripting.dictionary")
  19.     Set ds = CreateObject("scripting.dictionary")

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

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

  70.     ReDim brr(1 To UBound(a), 1 To max + 1)
  71.     For i = 1 To UBound(a)

  72.         brr(i, 1) = a(i).workNo
  73.         For j = 1 To a(i).count
  74.             If a(i).list(j).d.count > 1 Then
  75.                 a(i).list(j).no = "(" & a(i).list(j).no & ")"
  76.             End If
  77.             brr(i, j + 1) = a(i).list(j).no & " " & a(i).list(j).name & " " & a(i).list(j).capacity & "件"

  78.         Next

  79.     Next
  80.     Sheets("get").Range("a2").Resize(n, max + 1) = brr
  81.     MsgBox Timer - mytime
  82. End Sub
复制代码

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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