ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] BOM递归续 增加对应产品

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-12-16 19:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以前我也写过解决类似问题的代码,也是用递归,抽空再练习一下

TA的精华主题

TA的得分主题

发表于 2017-12-16 21:53 | 显示全部楼层
wbjjzhu 发表于 2017-12-16 18:16
@ 三坛老窖     你好,修改后的表格我代入实际的数据后,测试计算结果:当订单表的行数小于等于6行时,计 ...

代码估计没有什么问题的,应该是你提供的数据(BOM)有问题。

我发现BOM表中存在一行错误数据:母件 10010151,子件 10010151,用量 1
删除该行数据后,运行结果是:20040079 的需求量是791,与正确结果还差1,可能还有其他错误的数据存在。

提供的数据错误,我排查起来比较费劲,你自己再排查排查。

TA的精华主题

TA的得分主题

发表于 2017-12-18 16:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
三坛老窖 发表于 2017-12-16 21:53
代码估计没有什么问题的,应该是你提供的数据(BOM)有问题。

我发现BOM表中存在一行错误数据:母件 1 ...

@ 三坛老窑  非常感谢你的热心回复与帮助!根据你的提示,我重新核对BOM表的数据,发现有三处错误,已经修正。计算结果为791是正确的,因为在库存表里面10010153产品还有1套库存。
      确认计算逻辑没有问题后,再重新整理了计算表,用于实际的生产使用环境。但操作时 .Range("C2").Resize(i) = Application.Transpose(dicP.items)这个语句会提示类型不匹配的错误,无法输出相应的数据。 因为我的物料编码都是数字形式的,查看BOM子过程对于Pid Pname 两个参数的定义类型都为String,我的物料编码都转为文本形式的数字编码。但当计划表里面的物料增多或更新时,就会提示.Range("C2").Resize(i) = Application.Transpose(dicP.items)这个语句会提示类型不匹配的错误。我查找了很久都找不到原因,请帮忙查找原因。
       现在这个物料需求计算,还差一些就可以应用到实际生产环境中,希望能得到你的帮助完善它。
提示类型不匹配错误.jpg

采购预算模型V3-扣减库存计算需求-实际生产应用求助20171218.rar

1.7 MB, 下载次数: 150

采购预算模型V3-扣减库存计算需求-精简BOM验证20171218.rar

328.62 KB, 下载次数: 121

TA的精华主题

TA的得分主题

发表于 2017-12-18 18:15 | 显示全部楼层
wbjjzhu 发表于 2017-12-18 16:49
@ 三坛老窑  非常感谢你的热心回复与帮助!根据你的提示,我重新核对BOM表的数据,发现有三处错误,已经 ...

这个问题出在 Application.Transpose函数上,该函数对需要转置的数据量(字节数)有限制,数据量超过某个值后就转不过来了。
你可改用For循环进行转置,代码如下,你自己改一下,附件我就不上了。
  1.     arr = dicP.items
  2.     ReDim brr(UBound(arr), 0)
  3.     For i = 0 To UBound(arr)
  4.         brr(i, 0) = arr(i)
  5.     Next i
  6.     .Range("C2").Resize(i) = brr ' Application.Transpose(arr)
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-12-19 23:03 来自手机 | 显示全部楼层
@三坛老窖 按照你的代码修改后,可以正常输出数据,谢谢!

TA的精华主题

TA的得分主题

发表于 2018-1-31 19:39 | 显示全部楼层
三坛老窖 发表于 2011-2-13 09:28
看着看着就晕了……
确实难以理解,尤其是牵涉到递归。不过此类问题,除了用递归求解外,好像没有更通俗易 ...

老师,请问你所说的母件-子件环是什么意思啊,存在这个环有什么不妥之处啊

TA的精华主题

TA的得分主题

发表于 2018-1-31 22:11 | 显示全部楼层
本帖最后由 三坛老窖 于 2018-1-31 22:43 编辑
Nick_Chen0622 发表于 2018-1-31 19:39
老师,请问你所说的母件-子件环是什么意思啊,存在这个环有什么不妥之处啊

母件-子件环,简言之是子件中又包含母件的成分。
例如,馒头是由发面蒸煮后生成,发面由面粉+水+酵母通过发酵生成,而酵母就是发面通过风干而成,按此工艺过程直接描述,BOM结构如下:
母件    子件    用量
馒头    发面    100
发面    面粉    0.50
发面    水       0.45
发面    酵母    0.05
酵母    发面    2.00


此时在BOM中则出现母件-子件环(发面-酵母-发面),如果不作特殊处理,则程序会出现死循环。


这样的情景在化工行业比较常见。

TA的精华主题

TA的得分主题

发表于 2018-1-31 22:54 | 显示全部楼层
三坛老窖 发表于 2018-1-31 22:11
母件-子件环,简言之是子件中又包含母件的成分。
例如,馒头是由发面蒸煮后生成,发面由面粉+水+酵母通 ...

存在这种“母件-子件环”感觉还有点难办。

TA的精华主题

TA的得分主题

发表于 2018-2-1 09:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
三坛老窖 发表于 2018-1-31 22:11
母件-子件环,简言之是子件中又包含母件的成分。
例如,馒头是由发面蒸煮后生成,发面由面粉+水+酵母通 ...

老师,这么解释好清楚,我大概明白了,如果出现这个环:
    If dicBOM.exists(Pid) Then
        temp1 = Split(dicBOM(Pid), "/")
        For i = 0 To UBound(temp1) - 1
            temp2 = Split(temp1(i), ",")
            BOM temp2(0), N * temp2(1), iTab + 1, PName, PNum
        Next
    Else
这个递归程序会死循环了,但是您给出来一个itab参数,以防止该种情况发生,那么我想问itab参数的临界值10是如何确定的呢,,

TA的精华主题

TA的得分主题

发表于 2018-2-1 13:13 | 显示全部楼层
本帖最后由 三坛老窖 于 2018-2-1 14:39 编辑
Nick_Chen0622 发表于 2018-2-1 09:05
老师,这么解释好清楚,我大概明白了,如果出现这个环:
    If dicBOM.exists(Pid) Then
        temp ...

iTab这个参数的临界值MAXTAB,唯一的作用就是当BOM中存在母子环时,防止程序死循环,它不能排错,如果BOM表中存在母子环,程序虽然能正常运行,但通过该程序展开的用量还是错误的。
MAXTAB值的确定依据是:应大于BOM表中所有产品的BOM层数(深度)。上面馒头的BOM层数是3.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-20 22:05 , Processed in 0.037969 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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