ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-9-11 22:44 | 显示全部楼层 |阅读模式
本帖最后由 shaowu459 于 2023-9-12 07:26 编辑

根据父子关系、上下级信息或展示数据关系的列表来求路径、层级或整合数据,是一种比较常见的题型,大部分可以用循环或递归解决,本帖主要提供几个案例供大家参考。本帖不涉及常规的类似会计科目代码展开或填充那种例子,也不涉及下拉公式解法,主要是自动溢出结果的写法。帖中的公式并非最优解,主要起到抛砖引玉的作用,供各位坛友仅参考。

如果大家有其他类型的上下级、父子关系的题目,也欢迎把文件和要求发上来,大家共同探讨。

父子上下级关联关系.rar

163.64 KB, 下载次数: 249

评分

9

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 22:49 | 显示全部楼层
第一个问题,根据家庭父子信息整理族谱数据。

下图中A列是人名,B列是父辈的人名,要求展开成右侧表格数据。张老黑和张老祖是族谱中最顶级的人,因为原始数据中没有这两个人的父亲信息,右侧依次是左侧人名的子辈。

图片.png


参考公式如下:
  1. =LET(t,A2:A15,s,B2:B15,REDUCE(UNIQUE(FILTER(s,COUNTIF(t,s)=0)),s,LAMBDA(x,y,DROP(REDUCE(0,SEQUENCE(ROWS(x)),LAMBDA(m,n,LET(o,INDEX(x,n,),u,TAKE(o,,-1),IFNA(VSTACK(m,IF(OR(s=u),IFNA(HSTACK(o,FILTER(t,s=u)),o),o)),"")))),1))))
复制代码

图片.jpg
图片.png

上面的公式写法和Microsoft 365:机灵鬼小y中18楼的题目写法基本一致,可以参考阅读。
112507wsd2cdeo4ogmgg0e.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 22:54 | 显示全部楼层
第二个问题,获取包含父子、上下级关系表格中的层级信息。

如下图A:B列仍是某家族人员信息,要求获得每个人的层级。无父辈信息的人为1级,他的子辈为2级,以此类推。

图片.jpg

参考公式如下:
  1. =LET(s,UNIQUE(TOCOL(A2:B15)),t,MAP(s,LAMBDA(z,MATCH(,SCAN(z,ROW(1:9),LAMBDA(x,y,XLOOKUP(x,A:A,B:B,0))),))),SORTBY(HSTACK(s,t),t))
复制代码
图片.jpg
图片.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 23:00 | 显示全部楼层
本帖最后由 shaowu459 于 2023-9-11 23:05 编辑

第三个问题,求根节点到叶节点路径。

下图A:B列为父子层级信息,与上面族谱信息整理的例子不同,这里最顶级的父辈对应的B列是空单元格,除此之外没有什么不同。要求将父子信息展开成右侧表格样式。
图片.png

第一个例子中,是先找到最顶级父辈信息,然后向右逐个查找子辈,用的是普通循环公式。这个例子,换一种递归写法,并且先查找最底层的子辈信息,然后逐层往上查找父辈信息。
首先定义名称fx:
  1. =LAMBDA(x,LET(s,VLOOKUP(x,$A:$B,2),IF(s=0,x,HSTACK(fx(s),x))))
复制代码
图片.png
任意空单元格输入以下公式:
  1. =IFNA(DROP(REDUCE(0,FILTER(A2:A8,ISNA(MATCH(A2:A8,B:B,))),LAMBDA(x,y,VSTACK(x,fx(y)))),1),"")
复制代码

图片.png
图片.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 23:06 | 显示全部楼层
第四个问题,BOM展开。

下图A:C列示BOM清单父件和子件信息表,要求展开成右侧示例结果样式。例如A下级有B1、B2、B3,但是要从A开始,展开B1的下级,B1下级的下级……展开到最末级为止。然后展开A的第二个下级B2,然后直到末级。

图片.png

这个例子也可以用递归方法来解决。首先定义名称dx:
  1. =LAMBDA(z,DROP(REDUCE(0,SEQUENCE(ROWS(z)),LAMBDA(x,y,LET(s,INDEX(z,y,),t,FILTER($B$2:$C$32,$A$2:$A$32=INDEX(s,2),0),IF(COUNTA(t)=1,VSTACK(x,s),VSTACK(x,s,dx(HSTACK(@s*TAKE(t,,-1)^0+1,t))))))),1))
复制代码
图片.png

在空单元格输入以下公式:
  1. =dx(UNIQUE(FILTER(CHOOSE({1,2,3},0,A2:A32,1),ISNA(MATCH(A2:A32,B:B,)))))
复制代码
图片.jpg
图片.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 23:12 | 显示全部楼层
本帖最后由 shaowu459 于 2023-9-11 23:33 编辑

第五个问题,BOM成本计算。

要求根据BOM清单和采购价格表来求生产成本。BOM清单如下图所示:
图片.png

采购价格表如下图所示:
图片.png

要求根据A:C列信息计算D列黄色区域成本。
图片.png

此类问题用递归解决比较方便。首先定义名称kx:
  1. =LAMBDA(x,SUM(BYROW(FILTER($C$11:$F$27,$A$11:$A$27&$B$11:$B$27=CONCAT(x)),LAMBDA(y,INDEX(y,3)/INDEX(y,4)*IF(INDEX(y,2)=0,VLOOKUP(@y,$A$31:$B$40,2,),kx(TAKE(y,,2)))))))
复制代码
图片.png

D列输入以下公式向下填充即可:
  1. =C3*kx(A3:B3)
复制代码

图片.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 23:15 | 显示全部楼层
第六个问题,BOM结构展开。

A列和B列是BOM结构数据,A列是父件型号,B列是子件型号,要求获得D:E列结果,也即所有末级子件对应的最顶层母件型号。需要注意的是,某些末级子件会被不同的顶层母件使用,如左侧棕色部分所示。

图片.jpg

参考公式如下:
  1. =LET(A,A2:A48,B,B2:B48,UNIQUE(REDUCE(FILTER(A:B,COUNTIF(B,A)=0),A,LAMBDA(x,y,REDUCE(A1:B1,SEQUENCE(ROWS(x)),LAMBDA(m,n,LET(o,INDEX(x,n,2),VSTACK(m,IF({1,0},INDEX(x,n,1),FILTER(B,A=o,o))))))))))
复制代码
图片.jpg
图片.png

其他方法参考以下链接:BOM结构父级子级

TA的精华主题

TA的得分主题

发表于 2023-9-11 23:16 | 显示全部楼层
第一个送花,日常支持超人版主

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 23:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
第七个问题,无人驾驶公交车线路问题。

题目描述如下图红框所示:
图片.jpg

首先定义名称hx:
  1. =LAMBDA(x,y,z,IF(@z="B",y,LET(s,FILTER(TAKE(x,,-2),(TAKE(x,,1)=@z)*ISERR(FIND(INDEX(x,,2),y)),0),REDUCE(0,SEQUENCE(ROWS(s)),LAMBDA(m,n,IF(SUM(s)=0,m,LET(P,INDEX(s,n,),VSTACK(m,hx(x,TEXTBEFORE(y,":")+SUM(P)&":"&TEXTAFTER(y,":")&"-"&@P,P)))))))))
复制代码
图片.png

任意空单元格输入以下公式:
  1. =LET(s,hx(VSTACK(A2:C13,SORTBY(A2:C13,{2,1,3})),"0:E","E"),t,--TEXTSPLIT(s,":"),FILTER(s,t=MIN(IF(t>0,t))))
复制代码
图片.png

图片.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-11 23:22 | 显示全部楼层
第八个问题,关联字母整合至一行。

下图左侧是原数据,要求整理成右侧的样式。举例来说,A和B、D在一行,三个都有关系,B又和C、R在一行,所以C、R和A、B、D都有关系,需要放在同一行,以此类推。
图片.png

参考公式如下:
  1. =DROP(REDUCE(0,A3:D17,LAMBDA(x,y,IF(OR(y=x,y=""),x,IFNA(VSTACK(x,REDUCE(y,ROW(1:99),LAMBDA(m,n,UNIQUE(HSTACK(m,TOROW(FILTER(A3:D17,BYROW(A3:D17,LAMBDA(z,OR(TOCOL(z)=m)))),1)),1)))),"")))),1)
复制代码
图片.png
图片.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 01:54 , Processed in 0.048039 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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