ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 食材采购分类登记汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-25 10:01 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
求助:厨房每天要采购很多食材,每月汇总的时候很头痛,要分类分量分金额汇总,(见附件),来此求助大神老师帮慢看看,如何用VBA实现,谢谢,小花静候。

食材采购分类登记汇总.zip

16.59 KB, 下载次数: 35

分类汇总

TA的精华主题

TA的得分主题

发表于 2024-7-25 10:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
详见附件。

食材采购分类登记汇总.rar

25.48 KB, 下载次数: 37

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-25 11:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-7-25 11:20 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-7-25 11:21 编辑

交个作业吧,代码总感觉可读性不太好。

食材采购分类登记汇总.zip

28.27 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2024-7-25 11:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
参与一下。。。

  1. Sub ykcbf()   '//2024.7.25
  2.     Set d = CreateObject("Scripting.Dictionary")
  3.     Set d1 = CreateObject("Scripting.Dictionary")
  4.     Set d3 = CreateObject("Scripting.Dictionary")
  5.     Application.ScreenUpdating = False
  6.     With Sheets("分类")
  7.         r = .Cells(Rows.Count, 2).End(3).Row
  8.         arr = .[a1].Resize(r, 22)
  9.     End With
  10.     For j = 3 To UBound(arr, 2)
  11.         For i = 5 To UBound(arr)
  12.             s = arr(i, j)
  13.             If s <> Empty Then d1(s) = arr(4, j)  '//确定类别与素材的关系
  14.         Next
  15.     Next
  16.     For j = 3 To UBound(arr, 2)
  17.         s = arr(4, j)         '//固定类别列号
  18.         d3(s) = j
  19.     Next
  20.     With Sheets("录入")
  21.         r = .Cells(Rows.Count, 2).End(3).Row
  22.         arr = .[a1].Resize(r, 5).Value
  23.         Sum = .[e3].Value   '//总金额
  24.     End With
  25.     rq = CDate(Split(arr(3, 3))(0))
  26.     For i = 5 To UBound(arr)
  27.         st = arr(i, 3)
  28.         If Val(arr(i, 2)) Then
  29.             If d1.exists(st) Then s = d1(st) & "|" & rq
  30.             je = Val(arr(i, 4)) * Val(arr(i, 5))
  31.             If Not d.exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
  32.             If Not d(s).exists(st) Then
  33.                 d(s)(st) = Array(arr(i, 4), je, arr(i, 3))
  34.             Else
  35.                 t = d(s)(st)
  36.                 t(0) = t(0) + arr(i, 4)
  37.                 t(1) = t(1) + je
  38.                 d(s)(st) = t
  39.             End If
  40.         End If
  41.     Next
  42.     ReDim brr(1 To 1, 1 To 100)
  43.     For Each k In d.keys
  44.         b = Split(k, "|")
  45.         j = d3(b(0))
  46.         brr(1, 1) = b(1)
  47.         brr(1, 2) = Sum
  48.         For Each kk In d(k).keys
  49.             brr(1, j) = kk & "(" & d(k)(kk)(0) & "-" & d(k)(kk)(1) & ")"
  50.         Next
  51.     Next
  52.     With Sheets("汇总")
  53.         r = .Cells(Rows.Count, 3).End(3).Row
  54.         .Cells(r + 1, 3).Resize(1, 22) = brr
  55.     End With
  56.     Set d = Nothing
  57.     Application.ScreenUpdating = True
  58.     MsgBox "OK!"
  59. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-25 11:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-7-25 11:25 | 显示全部楼层
。。。。。。。。。。。。。。
360截图20240725112442963.jpg

食材采购分类登记汇总.zip

25.15 KB, 下载次数: 34

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-25 13:43 | 显示全部楼层
谢谢各位老师的帮助,我试了下,7楼老师的最完美,2楼老师的也非常好,5楼老师的代码没有把所有的食材导出。6楼老师的代码也不错,只是图片不方便复制提取。再次感谢大神们顶力帮助。谢谢

TA的精华主题

TA的得分主题

发表于 2024-7-25 15:37 | 显示全部楼层
  1. Sub t()
  2.     Dim m%, arr, brr, crr, num%, p%, dic, d, i%, j, je%, s, r%
  3.     Set dic = CreateObject("scripting.dictionary")
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set d2 = CreateObject("scripting.dictionary")
  6.     ReDim crr(1 To 10, 1 To 23)
  7.     With Sheets("分类")
  8.         brr = .Range("b4:v" & .[b4].End(4).Row)
  9.         For i = 2 To UBound(brr)
  10.             For j = 2 To UBound(brr, 2)
  11.                 If brr(i, j) <> "" Then
  12.                     d(j & "|" & brr(1, j)) = d(j & "|" & brr(1, j)) & brr(i, j) & "|"
  13.                 End If
  14.             Next j
  15.         Next i
  16.     End With
  17.     With Sheets("录入")
  18.         r = 1
  19.         m = .[c5].End(4).Row
  20.         arr = .Range("c5:e" & m)
  21.         For i = 1 To UBound(arr)
  22.             dic(arr(i, 1) & "|" & arr(i, 3)) = dic(arr(i, 1) & "|" & arr(i, 3)) + arr(i, 2)
  23.         Next i
  24.         For Each k In dic.keys
  25.             crr(r, 1) = r
  26.             crr(r, 2) = .[c3]
  27.             crr(r, 3) = .[e3]
  28.             s = Split(k, "|")
  29.             For Each j In d.keys
  30.                 If InStr(d(j), s(0)) > 0 Then
  31.                     d2(j) = d2(j) + 1
  32.                     r = d2(j)
  33.                     crr(r, Int(Split(j, "|")(0)) + 2) = s(0) & "(" & dic(k) & "-" & dic(k) * s(1) & ")"
  34.                     Exit For
  35.                 End If
  36.             Next j
  37.         Next k
  38.         Sheets("汇总").[b8].Resize(UBound(crr), UBound(crr, 2)) = crr
  39.     End With
  40.     Set dic = Nothing
  41.     Set d = Nothing
  42.     Set d2 = Nothing
  43. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-7-25 16:09 | 显示全部楼层
中文版

  1. Sub 汇总()
  2. Dim 分类表, 单价表, 采购表, 汇总表
  3. Dim 分类字典 As Object, 单价字典 As Object, 采购字典 As Object, 列号字典 As Object
  4. Dim i&, j&

  5. Set 分类字典 = VBA.CreateObject("scripting.dictionary")
  6. Set 单价字典 = VBA.CreateObject("scripting.dictionary")

  7. With Sheets("分类")
  8.     分类表 = .Range("b4").CurrentRegion
  9.     单价表 = .Range("x4").CurrentRegion
  10. End With

  11. For i = 2 To UBound(分类表)
  12.     For j = 1 To UBound(分类表, 2)
  13.         If 分类表(i, j) <> "" Then
  14.             分类字典(分类表(i, j)) = 分类表(1, j)
  15.         End If
  16.     Next
  17. Next

  18. For i = 2 To UBound(单价表)
  19.     单价字典(单价表(i, 2)) = 单价表(i, 3)
  20. Next

  21. Dim 最后行&, 行号&
  22. With Sheets("汇总")
  23.     最后行 = .Cells(Rows.Count, 3).End(3).Row + 1
  24.     汇总表 = .Range("a1").Resize(最后行 + 1000, 24)
  25. End With

  26. Set 列号字典 = VBA.CreateObject("scripting.dictionary")
  27. For j = 2 To UBound(汇总表, 2)
  28.     列号字典(汇总表(4, j)) = j
  29. Next

  30. 采购表 = Sheets("录入").Range("b3").CurrentRegion
  31. Set 采购字典 = VBA.CreateObject("scripting.dictionary")
  32. For i = 4 To UBound(采购表)
  33.     If 采购表(i, 2) <> Empty Then
  34.         采购字典(采购表(i, 2)) = 采购字典(采购表(i, 2)) + 采购表(i, 3)
  35.     End If
  36. Next

  37. 行号 = 最后行
  38. Do
  39.     汇总表(行号, 2) = 汇总表(行号 - 1, 2) + 1
  40.     汇总表(行号, 3) = 采购表(2, 2)
  41.     For Each k In 采购字典.keys
  42.         列号 = 列号字典(分类字典(k))
  43.         If 汇总表(行号, 列号) = "" Then
  44.             汇总表(行号, 4) = 汇总表(行号, 4) + 采购字典(k) * 单价字典(k)
  45.             汇总表(行号, 列号) = k & "(" & 采购字典(k) & "-" & 采购字典(k) * 单价字典(k) & ")"
  46.             采购字典.Remove k
  47.         End If
  48.     Next
  49.     行号 = 行号 + 1
  50. Loop While 采购字典.Count > 0

  51. Sheets("汇总").Range("a1").Resize(行号, 24) = 汇总表

  52. Set 分类字典 = Nothing
  53. Set 单价字典 = Nothing
  54. Set 采购字典 = Nothing
  55. Set 列号字典 = Nothing

  56. End Sub
复制代码

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-18 05:53 , Processed in 0.047291 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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