ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 汇总数据求提速

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-14 13:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 张雄友 于 2015-3-14 13:16 编辑
_枫_ 发表于 2015-3-13 22:47
++++++++()

直接死机了。1000行已经慢得不成样子了。

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

1014.38 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2015-3-17 21:57 | 显示全部楼层
张雄友 发表于 2015-3-14 13:11
直接死机了。1000行已经慢得不成样子了。

我的古董机  50s,你的?s

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

1009.26 KB, 下载次数: 8

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-17 22:11 | 显示全部楼层
yjh_27 发表于 2015-3-17 21:57
我的古董机  50s,你的?s

当员工生产二个以上工序时,能不能用个括号括上,如:SU7890/SU7891/SU7892 埋夹 33510件  ?

brr = YjhSort(arr, "a,a,a", "2,11,8", "C,8;2;3;0,14;2;3;1")  这个太复杂了,各个参数具体指什么?谢谢!

我测试速度很快。

TA的精华主题

TA的得分主题

发表于 2015-3-17 22:14 | 显示全部楼层
张雄友 发表于 2015-3-17 22:11
当员工生产二个以上工序时,能不能用个括号括上,如:(SU7890/SU7891/SU7892) 埋夹 33510件  ?

brr ...

Function qch(s)
fl = Split(s, "|")
j0 = 0
For j = 1 To UBound(fl)
    If fl(j0) <> fl(j) Then
        j0 = j0 + 1
        fl(j0) = fl(j)
    End If
Next

qch = fl(0)
For j = 1 To j0
    qch = qch & "/" & fl(j)
Next
If j0 > 0 Then qch = "(" & qch & ")"
End Function

TA的精华主题

TA的得分主题

发表于 2015-3-17 22:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
张雄友 发表于 2015-3-17 22:11
当员工生产二个以上工序时,能不能用个括号括上,如:(SU7890/SU7891/SU7892) 埋夹 33510件  ?

brr ...

arr  待统计数组
"a,a,a", "2,11,8"    按 制单号 、 工序名称、制单号  分组
"C,     统计
8;2;3;0,     统计8列,按 制单号 、 工序名称  分组 字符

14;2;3;1"    统计14列,按 制单号 、 工序名称  分组  数字和

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-18 16:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
将去重复统计项的功能整合进统计自定义函数
提速5s

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

1 MB, 下载次数: 13

TA的精华主题

TA的得分主题

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

黄色单元格这列怎么不对?

1.rar

18.07 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2015-5-8 22:20 | 显示全部楼层
本帖最后由 cbtaja 于 2015-5-8 22:25 编辑
张雄友 发表于 2015-5-7 22:06
黄色单元格这列怎么不对?


第1笔的数量,直接取值;
后续各笔的数量,需要累计。
  1. Sub cbtaja()
  2. '第2列工号,第3列姓名,第8列制单号,第11列工序名称,第14列产量!
  3. Dim arr, brr, d, d2, i&, j&, k&, zl&, r&, h&, l&, p&, t#, ghgx$, tmp
  4. t = Timer
  5. Set d = CreateObject("scripting.dictionary")
  6. arr = Sheets("交飞明细").Range("A1").CurrentRegion
  7. r = UBound(arr)
  8. If r > 1 Then zl = 4 Else Exit Sub'如果有数据,则结果至少有4列。
  9. ReDim brr(1 To 65535) '假设工人人数65535以内
  10. ReDim crr(1 To 65535, 1 To 99) '假设工序99以内
  11. For i = 2 To r
  12.     arr(i, 2) = Format(arr(i, 2), String(8, "0")) '本厂工号不会超过8位数!
  13.     ghgx = arr(i, 2) & arr(i, 11)
  14.     If Not d.Exists(arr(i, 2)) Then
  15.         h = h + 1
  16.         d(arr(i, 2)) = h
  17.         brr(h) = 4
  18.         d(ghgx) = 4
  19.         crr(h, 1) = arr(i, 2) '工号
  20.         crr(h, 2) = arr(i, 3) '姓名
  21.         crr(h, 3) = arr(i, 14) '第1笔的数量,直接取值
  22.         crr(h, 4) = Array(arr(i, 8), arr(i, 11), arr(i, 14)) '单号、工序、数量
  23.     Else
  24.         p = d(arr(i, 2))
  25.         '----------------------------------------------------------
  26.         crr(p, 3) = crr(p, 3) + arr(i, 14) '后续各笔的数量,需要累计。
  27.         '-----------------------------------------------------------
  28.         If d.Exists(ghgx) Then
  29.             l = d(ghgx) '从字典中查取已知工序的列号
  30.             tmp = crr(p, l)
  31.             tmp(2) = tmp(2) + arr(i, 14) '按工序累计
  32.             If InStr(tmp(0), arr(i, 8)) = 0 Then tmp(0) = tmp(0) & "/" & arr(i, 8)
  33.             crr(p, l) = tmp
  34.         Else
  35.             l = brr(p) + 1 '定位新工序的列,为该工号原有工序最大列号+1
  36.             d(ghgx) = l '把工号工序对应的列号存入字典,以便后续累加时定位列号所需
  37.             If zl < l Then zl = l '比较所有工号的最大列数
  38.             brr(p) = l
  39.             crr(p, l) = Array(arr(i, 8), arr(i, 11), arr(i, 14)) '新工号工序的单号、工序、数量
  40.         End If
  41.     End If
  42. Next
  43. For i = 1 To h
  44.     For j = 2 To brr(i)
  45.         If IsArray(crr(i, j)) Then
  46.             If InStr(crr(i, j)(0), "/") > 0 Then crr(i, j)(0) = "(" & crr(i, j)(0) & ")"
  47.             crr(i, j) = Join(crr(i, j), " ") & "件"
  48.         End If
  49.     Next
  50. Next
  51. With Sheets("get")
  52. .Rows("2:65535").Delete '减轻负担!针对 clear 后遗证!
  53. .Range("A2").Resize(h, zl) = crr
  54. '.Range("A2").Resize(h, zl).EntireColumn.AutoFit
  55. End With
  56. MsgBox "用时" & Format(Timer - t, "0.00") & "秒"
  57. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-8 22:27 | 显示全部楼层
cbtaja 发表于 2015-5-8 22:20
第1笔的数量,直接取值;
后续各笔的数量,需要累计。

能不能排序的?谢谢了。

1-1.rar

19.71 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2015-5-8 23:38 | 显示全部楼层
张雄友 发表于 2015-5-8 22:27
能不能排序的?谢谢了。

加一个排序代码,各个工号所做的工序种类不多,所以用最原始的冒泡法进行排序就行了。
  1. Sub cbtaja()
  2. '第2列工号,第3列姓名,第8列制单号,第11列工序名称,第14列产量!
  3. Dim arr, brr, d, d2, i&, j&, k&, zl&, r&, h&, l&, p&, t#, ghgx$, tmp
  4. t = Timer
  5. Set d = CreateObject("scripting.dictionary")
  6. arr = Sheets("交飞明细").Range("A1").CurrentRegion
  7. r = UBound(arr)
  8. If r > 1 Then zl = 4 Else Exit Sub '有明细中包含有效数据,则结果至少有4列
  9. ReDim brr(1 To 65535) '假设工人人数65535以内
  10. ReDim crr(1 To 65535, 1 To 99) '假设工序99以内
  11. For i = 2 To r
  12.     arr(i, 2) = Format(arr(i, 2), String(8, "0")) '本厂工号不会超过8位数!
  13.     ghgx = arr(i, 2) & arr(i, 11)
  14.     If Not d.Exists(arr(i, 2)) Then
  15.         h = h + 1
  16.         d(arr(i, 2)) = h
  17.         brr(h) = 4
  18.         d(ghgx) = 4
  19.         crr(h, 1) = arr(i, 2) '工号
  20.         crr(h, 2) = arr(i, 3) '姓名
  21.         crr(h, 3) = arr(i, 14) '第1笔的数量,直接取值
  22.         crr(h, 4) = Array(arr(i, 8), arr(i, 11), arr(i, 14)) '单号、工序、数量
  23.     Else
  24.         p = d(arr(i, 2))
  25.         '----------------------------------------------------------
  26.         crr(p, 3) = crr(p, 3) + arr(i, 14) '后续各笔的数量,需要累计。
  27.         '-----------------------------------------------------------
  28.         If d.Exists(ghgx) Then
  29.             l = d(ghgx) '从字典中查取已知工序的列号
  30.             tmp = crr(p, l)
  31.             tmp(2) = tmp(2) + arr(i, 14) '按工序累计
  32.             If InStr(tmp(0), arr(i, 8)) = 0 Then tmp(0) = tmp(0) & "/" & arr(i, 8)
  33.             crr(p, l) = tmp
  34.         Else
  35.             l = brr(p) + 1 '定位新工序的列,为该工号原有工序最大列号+1
  36.             d(ghgx) = l '把工号工序对应的列号存入字典,以便后续累加时定位列号所需
  37.             If zl < l Then zl = l '比较所有工号的最大列数
  38.             brr(p) = l
  39.             crr(p, l) = Array(arr(i, 8), arr(i, 11), arr(i, 14)) '新工号工序的单号、工序、数量
  40.         End If
  41.     End If
  42. Next
  43. For i = 1 To h
  44. '----------最原始的冒泡法排序------------------
  45.     For j = 4 To brr(i)
  46.         For k = j + 1 To brr(i)
  47.             If crr(i, j)(2) < crr(i, k)(2) Then temp = crr(i, j): crr(i, j) = crr(i, k): crr(i, k) = temp
  48.         Next
  49.     Next
  50. '----------------------------------------------
  51.     For j = 4 To brr(i)
  52.         If InStr(crr(i, j)(0), "/") > 0 Then crr(i, j)(0) = "(" & crr(i, j)(0) & ")"
  53.         crr(i, j) = Join(crr(i, j), " ") & "件"
  54.     Next
  55. Next
  56. With Sheets("get")
  57. .Rows("2:65535").Delete '减轻负担!针对 clear 后遗证!
  58. .Range("A2").Resize(h, zl) = crr
  59. '.Range("A2").Resize(h, zl).EntireColumn.AutoFit
  60. End With
  61. MsgBox "用时" & Format(Timer - t, "0.00") & "秒"
  62. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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