ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 父子、上下级、BOM、关联关系那点事

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-19 18:57 来自手机 | 显示全部楼层
alan57 发表于 2023-9-19 16:52
求助递归写法,循环提取内容:https://club.excelhome.net/forum ... 1540217&_dsign=

都是超人老师那 ...

上下级和BOM展开估计也就这样了,一个套路解决了。

TA的精华主题

TA的得分主题

发表于 2023-9-19 20:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
shaowu459 发表于 2023-9-19 18:57
上下级和BOM展开估计也就这样了,一个套路解决了。

是的,函数公式我是看不懂了,宏的话,就是构建树(形成递归链),然后做一次深度遍历(dfs)就可以了,也是一个套路

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-20 08:17 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
今铭昔 发表于 2023-9-19 20:38
是的,函数公式我是看不懂了,宏的话,就是构建树(形成递归链),然后做一次深度遍历(dfs)就可以了, ...


差不多,公式就是循环查找下一层,然后运算、堆叠就成。公式写递归也行,不过循环在单元格里更方便些

TA的精华主题

TA的得分主题

发表于 2023-9-20 15:01 | 显示全部楼层
本帖最后由 alan57 于 2023-9-21 09:40 编辑
今铭昔 发表于 2023-9-19 08:14
用WPS的JS宏做了一遍,都是些很好的题

关于BOM表的练习,我也做过一些:

多层级/未知层级 BOM缺料计算 交流:https://club.excelhome.net/forum ... 1333811&_dsign=
  1. =LET(_a1,H3:H34,_b1,I3:J34,_c2,UNIQUE(FILTER(_a1,COUNTIF(_b1,_a1)=0)),_d1,IFNA(DROP(REDUCE(_c2,_a1,LAMBDA(x,y,DROP(REDUCE(0,SEQUENCE(ROWS(x)),LAMBDA(m,n,LET(_e,INDEX(x,n,),_f,TAKE(_e,,-2),_g,FILTER(_b1,_a1=@+_f,""),_h,HSTACK(_e,@+_f,_g),VSTACK(m,IF(COUNTIF(_a1,@+_f),IFNA(_h,TAKE(_h,1)),_e))))),1))),,1),""),REDUCE(P2:S2,SEQUENCE(ROWS(_d1)),LAMBDA(m,n,VSTACK(m,LET(_a,B2:F2,_c1,INDEX(_d1,n,),_b,INDEX(B3:F5,XMATCH(@_c1,A3:A5),),_c,TOROW(IF(_c1="",\,_c1),3),_e,TRANSPOSE(FILTER(VSTACK(_b,_a),_b<>0)),xl,LAMBDA(m,XLOOKUP(m,L3:L25,M3:M25,0)),_d,VSTACK(HSTACK(@_c,@_c,1),WRAPROWS(_c,3)),_f2,TAKE(_d,,-1),_f4,TAKE(xl(TAKE(_d,,-2)),,1),_f3,IF(AND(_f4=0),0,_f4),_f,TAKE(_d,,-1)&","&_f3,_f1,TOCOL(TAKE(DROP(REDUCE(0,TAKE(_e,,1),LAMBDA(x,y,HSTACK(x,SCAN(y,TAKE(_d,,-1),LAMBDA(x,y,x*y))))),,1),-1)),_i,TAKE(SCAN(0,VSTACK(DROP(_f2,1),1)&","&_f3,LAMBDA(x,y,(x+TEXTAFTER(y,","))*TEXTBEFORE(y,","))),-1),_o1,TAKE(REDUCE(-_i,_f1,LAMBDA(x,y,VSTACK(x,IF(@TAKE(x,-1)<0,y+x,y)))),-ROWS(_f1)),_o2,--XLOOKUP(@_c&@TAKE(_c,,-2),CHOOSECOLS(m,2)&TAKE(m,,1),TAKE(DROP(m,,2),,1),0),_o3,IF(_o2,_f1,_o1),_o,IF(_o3<0,0,_o3)&","&TEXT(TAKE(_e,,-1),"yyyy/mm/dd"),_j,HSTACK(@TAKE(_c,,-2),@_c),_k,IFNA(HSTACK(_j,DROP(REDUCE(0,_o,LAMBDA(x,y,VSTACK(x,TEXTSPLIT(y,",")))),1)),_j),_k)))))
复制代码
这个太难了,一千多的长火车,解出来感觉与大神有些数据还是有差异,不知道对不对。
image.jpg

TA的精华主题

TA的得分主题

发表于 2023-9-20 19:56 来自手机 | 显示全部楼层
alan57 发表于 2023-9-20 15:01
多层级/未知层级 BOM缺料计算 交流:https://club.excelhome.net/forum ... 1333811&_dsign=
这个太难了 ...

你8-19的D1的60就没有算对,倒是你前面的54和7算对了,相加应该是61才对,具体可以看我在此贴里的18楼的回复里的图片说明

TA的精华主题

TA的得分主题

发表于 2023-9-20 20:13 | 显示全部楼层
今铭昔 发表于 2023-9-20 19:56
你8-19的D1的60就没有算对,倒是你前面的54和7算对了,相加应该是61才对,具体可以看我在此贴里的18楼的 ...

不是61,54那个结果是老师您的那个,我拿来做对比的,如果第一次D1已经欠了缺料了,第二次需求即为缺口了,所以第二次是60,如果是要加起来就是67,不过我认为可能不对是因为:比如B101,在之前B100其实已经消耗掉B2及A1的库存了,在算这个时,其实要累减A,A1,B2的相关库存,我想到了这点,不过再调整公式可能又会太复杂了,懒得再改了。
image.jpg



TA的精华主题

TA的得分主题

发表于 2023-9-20 21:13 来自手机 | 显示全部楼层
本帖最后由 今铭昔 于 2023-9-20 21:16 编辑
alan57 发表于 2023-9-20 20:13
不是61,54那个结果是老师您的那个,我拿来做对比的,如果第一次D1已经欠了缺料了,第二次需求即为缺口了 ...


那个D1有54和7两个结果,总计是61,具体看18楼我的回帖说明了D1是怎么计算出来的61

TA的精华主题

TA的得分主题

发表于 2023-9-20 22:36 | 显示全部楼层
今铭昔 发表于 2023-9-20 21:13
那个D1有54和7两个结果,总计是61,具体看18楼我的回帖说明了D1是怎么计算出来的61

image.jpg 请教下老师,A->C1->D1,这是D1的第二轮计算,既然C1,D1前面耗尽,为什么A没有耗尽呢?那应该与C1,D1同步耗尽吧,所以我算出来A耗尽了应该是60.

TA的精华主题

TA的得分主题

发表于 2023-9-21 07:53 | 显示全部楼层
本帖最后由 今铭昔 于 2023-9-22 14:30 编辑
alan57 发表于 2023-9-20 22:36
请教下老师,A->C1->D1,这是D1的第二轮计算,既然C1,D1前面耗尽,为什么A没有耗尽呢?那应该与C1,D1同 ...

首先,[L:M]列的库存都是独立的,不是说因为说子件清空了,父件也跟着清空。

1、以[B2]为例,A料生产100,A料库存还有10,所以实际要生产【90】(同时库存清空为0)
2、A料的子件A3单个用量是1,则要生产90*1=90个,库存中还有50个,则A3实际生产【40】个(同时库存清空为0)
3、A3料的子件C1的单个用量是2,则要生产40*2=80个,库存中还有20个,则C1实际生产【60】个(同时库存清空为0)
4、C1料的子件D1的单个用量是0.2,则要生产60*0.2=12个,库存中还有5个,则D1实际生产【7】个(同时库存清空为0)

上面是算A->A3->C1->D1的路径,还有一个路径为A->C1->D1没有算

5、A料在上面的第1步已经知道要生产【90】了
6、A料的子件C1单个用量是3,则要生产90*3=270,同时在上面的第3步计算时,C1的库存已经耗尽了,因此C1实际就是要生产270
7、C1料的子件D1的单个用量是0.2,则要生产270*0.2=54个,在上面的第4步D1库存已耗尽,所以实际生产【54】个

最后第3步和第6步里的C1生产用量相加,则C1在8-19里的用量是:60+270=330;第4步和第7步的D1生产用量相加,则D1在8-19里的用量是:7+54=61

同时在本轮(本周次)计算时,库存已都有变化,上面举例的路径库存都完全耗尽了,因此后面的4周要在库存为0的情况下计算

简单说,每次的计算出来应有的用量,要和库存做减法,库存为0,那实际用量就等于应有的用量,如果库存不为0(库存不可能为负数),则减去库存后才是实际的用量,库存自身也要做减法(用一个少一个)。也许本次的库存并不会清空,比如路径A->A2,就不会在第一周计算中耗尽库存,剩余的库存继续参与后面周次的计算

TA的精华主题

TA的得分主题

发表于 2023-9-21 13:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.jpg 觉得生成这种样式比较规范一些,二维表的看上去直观,各有各的好处

BOM表减库存需求量2By@今铭昔0921.zip

163.68 KB, 下载次数: 16

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-4 16:21 , Processed in 0.061195 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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