ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] BOM成本(分享与求助,难度超级大 )

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-4-29 20:59 | 显示全部楼层
本帖最后由 cbtaja 于 2016-4-30 15:04 编辑

更合理的BOM表格样式,则可以让程序自动适应工序增减变化的情况!见附件: BOM计算(自动适应工序增减).rar (36.64 KB, 下载次数: 475)

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-29 21:23 | 显示全部楼层
cbtaja 发表于 2016-4-29 20:59
更合理的BOM表格样式,则可以让程序自动适应工序增减变化的情况!见附件:

老师,有办法让层级为可以延伸到N级么,如果层级用单纯数字来表示话?

TA的精华主题

TA的得分主题

发表于 2016-4-29 23:29 | 显示全部楼层
本帖最后由 cbtaja 于 2016-4-30 15:33 编辑
chengshanming 发表于 2016-4-29 21:23
老师,有办法让层级为可以延伸到N级么,如果层级用单纯数字来表示话?

已经改到可以适应0~20层级以内。如果层级更多,可以把附件中表格VBA代码中的  "0 to 20" 全部替换为"0 to 99",就可适应0~99层级以内。 请测试: BOM计算.rar (37.79 KB, 下载次数: 341)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-29 23:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cbtaja 发表于 2016-4-29 23:29
已经改到可以适应0~20层级以内。如果层级更多,可以把附件中表格VBA代码中的  "0 to 20" 全部替换为"0 to ...

老师好!你做的那个自动适应工序增减表格中,如果层级用数值表示,可以通用N级,那个要怎么弄呢?你写的附件代码通用型将更强更灵活。

TA的精华主题

TA的得分主题

发表于 2016-4-29 23:54 | 显示全部楼层
chengshanming 发表于 2016-4-29 23:48
老师好!你做的那个自动适应工序增减表格中,如果层级用数值表示,可以通用N级,那个要怎么弄呢?你写的 ...

那个自动适应工序增加的附件已经更新,请测试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-30 09:02 | 显示全部楼层
cbtaja 发表于 2016-4-29 20:59
更合理的BOM表格样式,则可以让程序自动适应工序增减变化的情况!见附件:

cbtaja老师,测试还是发现适应工序增减变化的附件有个问题,如图,还得需老师改过来。
2016-04-30_085949.jpg

BOM计算(自动适应工序增减).rar

35.74 KB, 下载次数: 90

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-30 10:22 | 显示全部楼层
chengshanming 发表于 2016-4-30 09:02
cbtaja老师,测试还是发现适应工序增减变化的附件有个问题,如图,还得需老师改过来。

老师好!发现问题了,原来少了一句  tmp1(c, 7 + total) = 0,加上就好了,谢了

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-4-30 11:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
chengshanming 发表于 2016-4-30 10:22
老师好!发现问题了,原来少了一句  tmp1(c, 7 + total) = 0,加上就好了,谢了

老兄:  
     少的这句  tmp1(c, 7 + total) = 0   代码加在啊? 能将成品贴上来分享一下吗?
谢谢!  

TA的精华主题

TA的得分主题

发表于 2016-4-30 11:16 | 显示全部楼层
本帖最后由 cbtaja 于 2016-4-30 15:46 编辑
chengshanming 发表于 2016-4-30 10:22
老师好!发现问题了,原来少了一句  tmp1(c, 7 + total) = 0,加上就好了,谢了

这样改更好:增加如下所示第50行,而把其后面原有的IF……Else……Then语句删除。

如果要适应10层级及以上的BOM表,请下载前面已经更新的附件。
这一个代码是适合层级以纯数值表示、自动适应工序增减的情况。
  1. Option Explicit
  2. Sub 计算()
  3. Dim r&, Arr, FL, i&, c&, j&, t#, total&, ttitle, TopId$, tmp1()
  4. Dim tmp0(0 To 20, 8 To 9) 'bom10级,每级求2个数据:本层相对上一层的用量系数、本层相对0层的用量系数
  5. t = Timer
  6. With Sheet1
  7.     total = .Cells(Rows.Count, 7).End(xlUp).Row - 1
  8.     FL = .Range("G2").Resize(total, 3) '工序费率
  9.     ReDim tmp1(0 To 20, 11 + total To 14 + total * 2) 'bom10级,每级求total+4个数据:total道工序的工时汇总,以及:材料、人工、制费、总成本。
  10. End With
  11. r = Cells(Rows.Count, 1).End(xlUp).Row '取得Bom表的总行数
  12. Arr = [A2].Resize(r, 15 + total * 2) '获取BOM资料(无标题,多加一空行作结束依据)
  13. '先自上向下计算物料用量、上层母件
  14. For i = 1 To r - 1
  15.     c = Arr(i, 1) '物料层级
  16.     If c = 0 Then Erase tmp0: TopId = Arr(i, 2) '临时表重新清零,备用,并取得当前Bom树的树根
  17.     tmp0(c, 9) = Arr(i, 6) * (1 + Arr(i, 7)) '当前第c层的用量(含损耗)
  18.     If c > 0 Then tmp0(c, 8) = tmp0(c - 1, 8) * tmp0(c, 9) Else tmp0(c, 8) = tmp0(c, 9) 'c层bom总用量=上层总用量*本层用量
  19.     Arr(i, 8) = tmp0(c, 8)
  20.     Arr(i, 9) = tmp0(c, 9)
  21.     Arr(i, 15 + total * 2) = TopId '顶层母件
  22. Next
  23. '再自下向上汇总工时、工费、成本
  24. For i = r - 1 To 1 Step -1
  25.     c = Arr(i, 1) 'bom层级
  26.     If c < Arr(i + 1, 1) Then '非采购件
  27.         Arr(i, 3) = Empty
  28.         For j = 1 To total  '共total=6道工序,工时的源数据从第11列开始
  29.             '本级总工时 = 本级工序用时+其所有子工序用时
  30.             tmp1(c, j + 10 + total) = Arr(i, 8) * Arr(i, j + 10) + tmp1(c + 1, j + 10 + total) '工时汇总
  31.             tmp1(c, 12 + total * 2) = tmp1(c, 12 + total * 2) + tmp1(c, j + 10 + total) * FL(j, 2) '人工费汇总
  32.             tmp1(c, 13 + total * 2) = tmp1(c, 13 + total * 2) + tmp1(c, j + 10 + total) * FL(j, 3)  '制费汇总
  33.         Next
  34.     Else '是采购件
  35.         Arr(i, 3) = "是"
  36.     End If
  37.     tmp1(c, 11 + total * 2) = tmp1(c, 11 + total * 2) + Arr(i, 10) * Arr(i, 8) '材料成本=单价*采购数量+子件材料成本累计
  38.     tmp1(c, 14 + total * 2) = tmp1(c, 11 + total * 2) + tmp1(c, 12 + total * 2) + tmp1(c, 13 + total * 2) '总成本=材料成本+人工费+制费
  39.     For j = 11 + total To 14 + total * 2
  40.         If c > 0 Then tmp1(c - 1, j) = tmp1(c - 1, j) + tmp1(c, j) '本层各项数量累计到其上一层
  41.         Arr(i, j) = tmp1(c, j) '从临时表中获取结果
  42.         tmp1(c, j) = Empty '临时的数据清空备用(避免本项数量被带入到下一个同层的项中)
  43.     Next
  44.     If Arr(i, 3) = "是" Then Arr(i, 11 + total * 2) = Empty '采购件的材料成本是存在的,但按楼主要求不显示(直接改为留空)
  45. Next
  46. [a1:e1].Offset(0, 10 + 2 * total).Value = Split("材料成本,单位人工,单位制费,总成本,顶层母件", ",")
  47. [A2].Resize(r - 1, 15 + total * 2) = Arr
  48. MsgBox "用时 " & Format(Timer - t, "0.0000") & " 秒!"
  49. End Sub
复制代码
下面这一个代码是适合层级以文本缩进宽度表示、自动适应工序增减的情况:
  1. Option Explicit
  2. Sub 计算()
  3. Dim r&, Arr, FL, i&, c&, j&, t#, total&, ttitle, TopId$, tmp1(), brr()
  4. Dim tmp0(0 To 9, 1 To 2) 'bom10级,每级求2个数据:上层母件、本层用量系数
  5. t = Timer
  6. With Sheet1
  7.     total = .Cells(Rows.Count, 7).End(xlUp).Row - 1
  8.     FL = .Range("G2").Resize(total, 3) '工序费率
  9.     ReDim tmp1(0 To 9, 4 To 7 + total)   'bom10级,每级求total+4个数据:total道工序的工时汇总,以及:材料、人工、制费、总成本。
  10. End With
  11. r = Cells(Rows.Count, 1).End(xlUp).Row '取得Bom表的总行数
  12. Arr = [A2].Resize(r, 7 + total) '获取BOM资料(无标题,多加一空行作结束依据)
  13. ReDim brr(0 To r, 1 To 8 + total) '预定义存放结果的二维数组
  14. '先自上向下计算物料用量、上层母件
  15. For i = 1 To r - 1
  16.     c = Len(Arr(i, 1)) - 1 '物料层级
  17.     If c < 0 Then Exit For
  18.     If c = 0 Then Erase tmp0: TopId = Arr(i, 2) '临时表重新清零,备用,并取得当前Bom树的树根
  19.     tmp0(c, 1) = Arr(i, 5) * (1 + Arr(i, 6)) '当前第c层的用量(含损耗)
  20.     If c > 0 Then tmp0(c, 2) = tmp0(c - 1, 2) * tmp0(c, 1) Else tmp0(c, 2) = tmp0(c, 1) 'c层bom总用量=上层总用量*本层用量
  21.     brr(i, 1) = tmp0(c, 1)
  22.     brr(i, 2) = tmp0(c, 2)
  23.     brr(i, 8 + total) = TopId  '顶层母件
  24. Next
  25. '再自下向上汇总工时、工费、成本
  26. For i = r - 1 To 1 Step -1
  27.     c = Len(Arr(i, 1)) - 1 'bom层级
  28.     If Len(Arr(i, 1)) < Len(Arr(i + 1, 1)) Then '非采购件
  29.         Arr(i, 3) = Empty
  30.         For j = 1 To total  '共total=6道工序,工时的源数据从第11列开始
  31.             '本级总工时 = 本级工序用时+其所有子工序用时
  32.             tmp1(c, 3 + j) = brr(i, 2) * Arr(i, 7 + j) + tmp1(c + 1, 3 + j) '工时汇总
  33.             tmp1(c, 5 + total) = tmp1(c, 5 + total) + tmp1(c, 3 + j) * FL(j, 2) '人工费汇总
  34.             tmp1(c, 6 + total) = tmp1(c, 6 + total) + tmp1(c, 3 + j) * FL(j, 3) '制费汇总
  35.         Next
  36.     Else '是采购件
  37.         brr(i, 3) = "是"
  38.     End If
  39.     tmp1(c, 4 + total) = tmp1(c, 4 + total) + Arr(i, 7) * brr(i, 2)  '材料成本=单价*采购数量+子件材料成本累计
  40.     tmp1(c, 7 + total) = tmp1(c, 4 + total) + tmp1(c, 5 + total) + tmp1(c, 6 + total) '总成本=材料成本+人工费+制费
  41.     For j = 4 To 7 + total
  42.         If c > 0 Then tmp1(c - 1, j) = tmp1(c - 1, j) + tmp1(c, j) '本层各项数量累计到其上一层
  43.         brr(i, j) = tmp1(c, j) '从临时表中获取结果
  44.         tmp1(c, j) = Empty '临时表中数据清空备用。(避免把本物料的数量带入到同一层级的下一个物料的统计数量中)
  45.     Next
  46.     If brr(i, 3) = "是" Then brr(i, 4 + total) = Empty '采购件的材料成本留空
  47. Next
  48. brr(0, 1) = "用量(含损耗)"
  49. brr(0, 2) = "对应0层成品用量"
  50. brr(0, 3) = "采购件与否"
  51. For j = 1 To total
  52.     Range("A1").Offset(0, 6 + j) = FL(j, 1) & "工时"
  53.     brr(0, 3 + j) = Replace(FL(j, 1), "费率", "") & "工时汇总"
  54. Next
  55. ttitle = Split("材料成本,单位人工,单位制费,总成本,顶层母件", ",")
  56. For j = 0 To UBound(ttitle)
  57.     brr(0, 4 + total + j) = ttitle(j)
  58. Next
  59. UsedRange.Offset(0, 7 + total).ClearContents
  60. [a1].Offset(0, 7 + total).Resize(r, 8 + total) = brr
  61. MsgBox "用时 " & Format(Timer - t, "0.0000") & " 秒!"
  62. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-4-30 15:34 | 显示全部楼层
cbtaja 发表于 2016-4-30 11:16
这样改更好:增加如下所示第50行,而把其后面原有的IF……Else……Then语句删除。
以下代码适合层级以文 ...

老师:
看看我这个表,  也麻烦您给写个代码.
谢谢了!
BOM计算 - 副本.rar (20.89 KB, 下载次数: 40)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 08:42 , Processed in 0.044889 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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