|
本帖最后由 cbtaja 于 2016-4-30 14:34 编辑
BOM计算.rar
(37.13 KB, 下载次数: 291)
- Sub 计算()
- Dim r&, Arr, FL, i&, c&, j&, t#, total&, ttitle, TopId$, tmp1()
- Dim tmp0(0 To 9, 8 To 9) 'bom10级,每级求2个数据:上层母件、本层用量系数
- t = Timer
- With Sheet1
- total = .Cells(Rows.Count, 7).End(xlUp).Row - 1
- FL = .Range("G2").Resize(total, 3) '工序费率
- ReDim tmp1(0 To 9, 11 + total To 14 + total * 2) 'bom10级,每级求total+4个数据:total道工序的工时汇总,以及:材料、人工、制费、总成本。
- End With
- r = Cells(Rows.Count, 1).End(xlUp).Row '取得Bom表的总行数
- Arr = [A2].Resize(r, 15 + total * 2) '获取BOM资料(无标题,多加一空行作结束依据)
- '先自上向下计算物料用量、上层母件
- For i = 1 To r - 1
- c = Len(Arr(i, 1)) - 1 '物料层级
- If c < 0 Then Exit For
- If c = 0 Then Erase tmp0: TopId = Arr(i, 2) '临时表重新清零,备用,并取得当前Bom树的树根
- tmp0(c, 9) = Arr(i, 6) * (1 + Arr(i, 7)) '当前第c层的用量(含损耗)
- If c > 0 Then tmp0(c, 8) = tmp0(c - 1, 8) * tmp0(c, 9) Else tmp0(c, 8) = tmp0(c, 9) 'c层bom总用量=上层总用量*本层用量
- Arr(i, 8) = tmp0(c, 8)
- Arr(i, 9) = tmp0(c, 9)
- Arr(i, 15 + total * 2) = TopId '顶层母件
- Next
- '再自下向上汇总工时、工费、成本
- For i = r - 1 To 1 Step -1
- c = Len(Arr(i, 1)) - 1 'bom层级
- If c >= Len(Arr(i + 1, 1)) - 1 Then tmp1(c, 14 + total * 2) = Empty
- If Len(Arr(i, 1)) < Len(Arr(i + 1, 1)) Then '非采购件
- Arr(i, 3) = Empty
- For j = 1 To total '共total=6道工序,工时的源数据从第11列开始
- '本级总工时 = 本级工序用时+其所有子工序用时
- tmp1(c, j + 10 + total) = Arr(i, 8) * Arr(i, j + 10) + tmp1(c, j + 10 + total) '工时汇总
- tmp1(c, 12 + total * 2) = tmp1(c, 12 + total * 2) + tmp1(c, j + 10 + total) * FL(j, 2) '人工费汇总
- tmp1(c, 13 + total * 2) = tmp1(c, 13 + total * 2) + tmp1(c, j + 10 + total) * FL(j, 3) '制费汇总
- Next
- Else '是采购件
- Arr(i, 3) = "是"
- End If
- tmp1(c, 11 + total * 2) = tmp1(c, 11 + total * 2) + Arr(i, 10) * Arr(i, 8) '材料成本=子项材料累计成本+本项的材料单价*数量
- tmp1(c, 14 + total * 2) = tmp1(c, 11 + total * 2) + tmp1(c, 12 + total * 2) + tmp1(c, 13 + total * 2) '总成本=材料+人工+制费(该3项均已经包含子项的数量)
- For j = 17 To 26
- If c > 0 Then tmp1(c - 1, j) = tmp1(c - 1, j) + tmp1(c, j) '各项累计到其上一层中(总成本项不要重复累计)
- Arr(i, j) = tmp1(c, j) '从临时表中获取结果
- tmp1(c, j) = Empty '临时表清空备用(避免带入下一个同一层的项中)
- Next
- If Arr(i, 3) = "是" Then Arr(i, 11 + 2 * total) = Empty '按楼主的要求,采购件只显示总成本,其材料成本留空’
- Next
- [a1:e1].Offset(0, 10 + 2 * total).Value = Split("材料成本,单位人工,单位制费,总成本,顶层母件", ",")
- [A2].Resize(r - 1, 15 + total * 2) = Arr
- MsgBox "用时 " & Format(Timer - t, "0.0000") & " 秒!"
- End Sub
复制代码
|
|