ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: suifeng4675

[求助] 在好多共用件下依据成品BOM和库存算出最多配套量

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-7-23 23:03 | 显示全部楼层
三坛老窖 发表于 2016-7-23 10:22
请测试!
--------------------------

学习了,就是
    Do Until Proj(i, 1) <> BOM(j, 1)
      ……
      Loop
中的i, j与后面的
        '扣减库存
        For k = p To j - 1
            dicInv(BOM(k, 2)) = dicInv(BOM(k, 2)) - temp * BOM(k, 5)
        Next k
里面的k, p, j 有点理不清,习惯用for next 双循环直观些

TA的精华主题

TA的得分主题

发表于 2016-7-23 23:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 aman1516 于 2016-7-23 23:13 编辑

按金蝶导出的标准BOM格式,及按 三坛老窖 老师的代码改了一下,结果是出来了,但我是多转换一次数组格式实现的,请教下 三坛老窖 老师,能否直接按金蝶导出的BOM格式优化代码,详见附件:

  1. <P>Option Explicit</P>
  2. <P>Sub pt()
  3. Dim Inv, bom1, Proj, dicInv, BOM
  4. Dim i, j, d, k1, k2, temp, r, r1, r2, z, m, n, p
  5. '读取数据
  6. bom1 = Sheet1.Range("A1:H" & Sheet1.Range("A" & Rows.Count).End(xlUp).Row + 1)  'BOM
  7. ReDim BOM(1 To UBound(bom1), 1 To UBound(bom1, 2) + 1)
  8. z = 0
  9. For m = 2 To UBound(bom1)
  10.     If bom1(m, 2) = "代码" Then
  11.        r1 = m + 4
  12.        For n = r1 To UBound(bom1)
  13.            If bom1(n, 1) = "" Then
  14.               r2 = n - 1
  15.               Exit For
  16.            End If
  17.        Next
  18.        For k1 = r1 To r2
  19.            z = z + 1
  20.            BOM(z, 1) = bom1(m + 1, 2)
  21.            For k2 = 2 To UBound(bom1, 2) + 1
  22.                BOM(z, k2) = bom1(k1, k2 - 1)
  23.            Next
  24.         Next
  25.     End If
  26. Next
  27. 'Sheet1.Range("N2:Z" & Rows.Count).ClearContents
  28. 'Sheet1.Range("N2").Resize(z, UBound(BOM, 2)) = BOM
  29. Sheet2.Range("F2:F" & Rows.Count).ClearContents
  30. Inv = Sheet2.Range("A2:E" & Sheet2.Range("A" & Rows.Count).End(xlUp).Row)    '物料即时库存
  31. Proj = Sheet3.Range("A2:C" & Sheet3.Range("A" & Rows.Count).End(xlUp).Row)    '生产计划产品
  32.    
  33. '创建库存字典
  34. Set dicInv = CreateObject("Scripting.Dictionary")
  35. For d = 1 To UBound(Inv)
  36.     dicInv(Inv(d, 1)) = Inv(d, 5)
  37. Next</P>
  38. <P>'计算各产品的最多可生产数量
  39. For i = 1 To UBound(Proj)
  40. '求取该产品的最多可生产数量
  41.     temp = 9999999#
  42.     For j = 1 To UBound(BOM)
  43.         If Proj(i, 1) = BOM(j, 1) Then
  44.            If dicInv.exists(BOM(j, 2)) And temp > dicInv(BOM(j, 2)) / BOM(j, 6) Then
  45.               temp = dicInv(BOM(j, 2)) / BOM(j, 6)
  46.            End If
  47.         End If
  48.     Next
  49.     Proj(i, 3) = temp
  50.     For p = 1 To UBound(BOM)
  51.         If Proj(i, 1) = BOM(p, 1) Then
  52.            dicInv(BOM(p, 2)) = dicInv(BOM(p, 2)) - temp * BOM(p, 6)
  53.         End If
  54.     Next
  55. Next
  56.    
  57. '输出所有产品的最多可生产数量和剩余库存
  58. Sheet2.Range("F2:F" & Rows.Count).ClearContents
  59. Sheet2.Range("F2:F" & UBound(Inv) + 1) = Application.WorksheetFunction.Transpose(dicInv.items)
  60. Sheet3.Range("A2").Resize(UBound(Proj), 3) = Proj</P>
  61. <P>End Sub</P>
  62. <P> </P>
复制代码


库存可配套产品数2016 - 副本.rar (55.02 KB, 下载次数: 72)

TA的精华主题

TA的得分主题

发表于 2016-7-25 15:02 | 显示全部楼层
aman1516 发表于 2016-7-23 23:09
按金蝶导出的标准BOM格式,及按 三坛老窖 老师的代码改了一下,结果是出来了,但我是多转换一次数组格式实 ...

在金蝶导出的标准BOM格式基础上,不经转换直接计算最多可生产的数量,优化的代码如下:
  1. Sub pt_1()
  2. Dim Inv, Prod, dicInv, BOM
  3. Dim i&, j&, k&, p&, temp#

  4. '读取数据
  5. BOM = Sheet1.Range("A1:H" & Sheet1.Range("A" & Rows.Count).End(xlUp).Row + 1)  'BOM
  6. Inv = Sheet2.Range("A2:E" & Sheet2.Range("A" & Rows.Count).End(xlUp).Row)    '物料即时库存
  7. Prod = Sheet3.Range("A2:C" & Sheet3.Range("A" & Rows.Count).End(xlUp).Row)    '生产计划产品
  8.    
  9. '创建库存字典
  10. Set dicInv = CreateObject("Scripting.Dictionary")
  11. For i = 1 To UBound(Inv)
  12.     dicInv(Inv(i, 1)) = Inv(i, 5)
  13. Next i

  14. '计算各产品的最多可生产数量
  15. For i = 1 To UBound(Prod)

  16.     '求取该产品的最多可生产数量
  17.     temp = 999999999#
  18.     For j = 1 To UBound(BOM)
  19.         If Prod(i, 1) = BOM(j, 2) Then
  20.             For k = j + 3 To UBound(BOM)
  21.                 If Len(BOM(k, 1)) = 0 Then GoTo tmp
  22.                 'If BOM(k, 1) = "4.01.26.02.001" Then Stop
  23.                 If dicInv.exists(BOM(k, 1)) Then
  24.                     If temp > dicInv(BOM(k, 1)) / BOM(k, 5) Then temp = dicInv(BOM(k, 1)) / BOM(k, 5)
  25.                 Else
  26.                     temp = 0:  GoTo tmp
  27.                 End If
  28.             Next k
  29.         End If
  30.     Next j
  31. tmp:
  32.     Prod(i, 3) = Int(temp)
  33.    
  34.     '扣减库存
  35.     For p = j + 3 To UBound(BOM)
  36.         If Len(BOM(p, 1)) = 0 Then Exit For
  37.         dicInv(BOM(p, 1)) = dicInv(BOM(p, 1)) - Prod(i, 3) * BOM(p, 5)
  38.     Next p
  39. Next i
  40.    
  41. '输出所有产品的最多可生产数量和剩余库存
  42. Sheet2.Range("F2:F" & UBound(Inv) + 1) = Application.WorksheetFunction.Transpose(dicInv.items)
  43. Sheet3.Range("A2").Resize(UBound(Prod), 3) = Prod

  44. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2016-7-25 15:39 | 显示全部楼层
在好多共用件且产品BOM为单层的前提下,依据现有库存计算出多个产品的最多配套量这样的问题,使用BOM矩阵,则更为直观和易于理解,且也容易计算求解。
附件中的sheet1工作表,就是依据BOM矩阵,使用公式和函数求解的。
(sheet1中使用了辅助列,本人不擅长使用函数,若是函数高手,则可省却辅助列)
-----------------------------------------------------
库存可配套产品数20160725.rar (69.29 KB, 下载次数: 235)

TA的精华主题

TA的得分主题

发表于 2016-7-25 16:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 aman1516 于 2016-7-25 16:42 编辑
三坛老窖 发表于 2016-7-25 15:02
在金蝶导出的标准BOM格式基础上,不经转换直接计算最多可生产的数量,优化的代码如下:


忘记退出第2个循环了,难怪...
这是我原来的思路,参考老师的代码现修正如下:


  1. <P>Option Explicit</P>
  2. <P>Sub pt()
  3. Dim Inv, Bom, Proj, dicInv
  4. Dim i, j, d, k, temp, r, r1, r2, m, n, p
  5. '读取数据
  6. Bom = Sheet1.Range("A1:H" & Sheet1.Range("A" & Rows.Count).End(xlUp).Row + 1) 'BOM
  7. Inv = Sheet2.Range("A2:E" & Sheet2.Range("A" & Rows.Count).End(xlUp).Row) '物为即时库存
  8. Proj = Sheet3.Range("A2:C" & Sheet3.Range("A" & Rows.Count).End(xlUp).Row) '生产计划产品</P>
  9. <P>'创建库存字典
  10. Set dicInv = CreateObject("Scripting.Dictionary")
  11. For d = 1 To UBound(Inv)
  12.     dicInv(Inv(d, 1)) = Inv(d, 5)
  13. Next
  14. '计算产品最多可生产数量
  15. For i = 1 To UBound(Proj)
  16. '求取各产品最多可生产数量
  17.     temp = 9999999#
  18.     For j = 1 To UBound(Bom)
  19.         If Proj(i, 1) = Bom(j, 2) Then
  20.            r1 = j + 3
  21.            For m = r1 To UBound(Bom)
  22.                If Bom(m, 1) = "" Then
  23.                   r2 = m - 1
  24.                   Exit For
  25.                End If
  26.            Next
  27.            For n = r1 To r2
  28.                If dicInv.exists(Bom(n, 1)) Then
  29.                   If temp > dicInv(Bom(n, 1)) / Bom(n, 5) Then temp = dicInv(Bom(n, 1)) / Bom(n, 5)
  30.                End If
  31.            Next
  32.            Exit For
  33.         End If
  34.     Next
  35.     Proj(i, 3) = Int(temp)
  36.     '扣减库存
  37.     For p = r1 To r2
  38.         dicInv(Bom(p, 1)) = dicInv(Bom(p, 1)) - Proj(i, 3) * Bom(p, 5)
  39.     Next p
  40. Next</P>
  41. <P>'输出各产品最多可生产数及剩余库存
  42. Sheet2.Range("F2:F" & Rows.Count).ClearContents
  43. Sheet2.Range("F2:F" & UBound(Inv) + 1) = Application.WorksheetFunction.Transpose(dicInv.items)
  44. Sheet3.Range("A2").Resize(UBound(Proj), 3) = Proj
  45. End Sub
  46. </P>
复制代码

非常感谢!!学习了

TA的精华主题

TA的得分主题

发表于 2021-5-12 23:17 | 显示全部楼层
aman1516 发表于 2016-7-23 23:09
按金蝶导出的标准BOM格式,及按 三坛老窖 老师的代码改了一下,结果是出来了,但我是多转换一次数组格式实 ...

这个对使用金蝶用户的有福了,可是我们的BOM清单和这个差别太大啦我们是列显示的,金蝶的是一个配方一段列示的

TA的精华主题

TA的得分主题

发表于 2021-5-13 19:18 | 显示全部楼层
aman1516 发表于 2016-7-23 23:09
按金蝶导出的标准BOM格式,及按 三坛老窖 老师的代码改了一下,结果是出来了,但我是多转换一次数组格式实 ...

QQ图片20210513191338.png
能帮忙做个转换BOM格式VBA代码吗?

可配套模板.rar (41.65 KB, 下载次数: 9)

TA的精华主题

TA的得分主题

发表于 2021-5-26 14:16 | 显示全部楼层
三坛老窖 发表于 2016-7-25 15:39
在好多共用件且产品BOM为单层的前提下,依据现有库存计算出多个产品的最多配套量这样的问题,使用BOM矩阵, ...

三坛老窖 老师,如您所说的,单层BOM的前提下,矩阵BOM比较直观,若是多层BOM,如何根据BOM进行成套率的计算呢?有好的方法吗?

TA的精华主题

TA的得分主题

发表于 2021-8-23 14:47 | 显示全部楼层
lanyf 发表于 2021-5-26 14:16
三坛老窖 老师,如您所说的,单层BOM的前提下,矩阵BOM比较直观,若是多层BOM,如何根据BOM进行成套率的 ...

多阶BOM进行成套率计算由方法了吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 08:17 , Processed in 0.035556 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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