# 思路讲解 优先考虑使用 [Excel常用函数](../ERP接口配置/4.0-other/998.Excel常用函数.md) 去解决 ## 案例一 已知BOM结构如下 | A | B | C | D | | ------------ | --------------- | -------- | ---------- | | 母件编码 | 母件代号 | 状态 | 母件损耗率 | | 101006002002 | 701435440201 | 审核 | 0 | | 级别 | 子件编码 | 基本用量 | 基础数量 | | + | 201006002002001 | 1 | 1 | | ++ | 201006002002002 | 1 | 1 | | +++ | 401001001004 | 0.224 | 1 | 想要的结果如下 | A | B | | ------- | --------------- | | 层级 | 编码 | | 0 | 101006002002 | | 0.1 | 201006002002001 | | 0.1.1 | 201006002002002 | | 0.1.1.1 | 401001001004 | 母件编码与子件级别共同在A列,要获取BOM的层级关系,可进行分步处理 1. 将多余行删除,删除后结果如下 | A | B | C | D | | ------------ | --------------- | ----- | ---- | | 101006002002 | 701435440201 | 审核 | 0 | | + | 201006002002001 | 1 | 1 | | ++ | 201006002002002 | 1 | 1 | | +++ | 401001001004 | 0.224 | 1 | 2. 首先获取母件的层级,使用 IF函数 判断当前单元格是否为母件,如果是母件就编号加一,如果不是母件就不增加编号 思路如下: 1. 所有编码长度固定,且子件级别最大长度小于编码长度,那么只要单元格长度等于十二的就代表这是个母件 2. 所有编码长度固定,但子件级别最大长度等于或大于编码长度,那么需要判断当前单元格是否为数字,若是数字则代表这是个母件 3. 所有编码长度不固定,且编码仅以数字开头,中间掺杂字母,则判断当前单元格内容的第一个字符是否为数字,若是数字则代表这个是母件 4. 所有编码长度不固定,开头内容不固定,仅可确保不是以加号开头,则判断当前单元格内容的第一个字符是否为加号,若不是加号则代表这个是母件 案例公式:=IF(ISNUMBER(VALUE('母件结构表-多阶'!A3)),A2+1,A2) **说明**:这种方式仅能获取到当前BOM的编号 3. 其次获取子件的层级,参考上一步的思路,在判断出其不是母件的情况下,根据子件级别输出当前的BOM层级编号 思路如下: 1. 长度为1,直接输出当前的层级编号即可 2. 长度为2及以上,层级编号不能盲目累加,需考虑如下情况,应判断前一层级的编号是否相同,若相同则代表子件处于相同层级下,可进行累加,若不相同,则需从一开始重新累加 | 层级 | 编码 | | ---- | --------------- | | | 101101001001 | | + | 201101001001001 | | ++ | 201101001001002 | | +++ | 201101001001004 | | + | 201101001001005 | | ++ | 201101001001007 | 案例公式:`=IF(ISNUMBER(VALUE('母件结构表-多阶'!A3)),0,IF(A2<>A3,0,IF((LEN('母件结构表-多阶'!A3)=1),B2+1,B2)))` **说明**:每个层级需要单独计算 4. 所有层级全部处理完成后,进行合并即可 ![image-20240731141114790](assets/image-20240731141114790.png) 案例公式:`=IF(K2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2&"."&F2&"."&G2&"."&H2&"."&I2&"."&J2&"."&K2,IF(J2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2&"."&F2&"."&G2&"."&H2&"."&I2&"."&J2,IF(I2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2&"."&F2&"."&G2&"."&H2&"."&I2,IF(H2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2&"."&F2&"."&G2&"."&H2,IF(G2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2&"."&F2&"."&G2,IF(F2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2&"."&F2,IF(E2<>0,A2&"."&B2&"."&C2&"."&D2&"."&E2,IF(D2<>0,A2&"."&B2&"."&C2&"."&D2,IF(C2<>0,A2&"."&B2&"."&C2,IF(B2<>0,A2&"."&B2,A2))))))))))` 5. 输出BOM导入清单 ## 案例二 已知BOM结构如下 | A | B | | ---- | -------------- | | 层级 | 编码 | | 0 | 02.06.03.00003 | | .1 | 02.02.02.00082 | | ..2 | 03.02.07.00059 | | ..2 | 05.02.01.00008 | | 0 | 02.06.03.00004 | | .1 | 02.02.02.00083 | | ..2 | 03.02.07.00059 | | ..2 | 05.02.01.00009 | 想要的结果如下 | A | B | | ----- | -------------- | | 层级 | 编码 | | 0 | 02.06.03.00003 | | 0.1 | 02.02.02.00082 | | 0.1.1 | 03.02.07.00059 | | 0.1.2 | 05.02.01.00008 | | 1 | 02.06.03.00004 | | 1.1 | 02.02.02.00083 | | 1.1.1 | 03.02.07.00059 | | 1.1.2 | 05.02.01.00009 | 层级都在A列,要获取BOM的层级关系,可进行分步处理 1. 首先获取母件的层级,使用 IF函数 判断当前单元格是否为母件,如果是母件就编号加一,如果不是母件就不增加编号 思路如下: 1. 如果单元格内容的值等于0,说明是母件 2. 如果单元格内容长度为1,说明是母件 案例公式:=IF(LEN(BOM多级展开!A5)=1,SUMPRODUCT((LEN(BOM多级展开!$A$2:A5)=1)*1)-1,A3) 2. 其次获取子件的层级,思路与[案例一](#案例一)的第三步大致相同,此处略 3. 所有层级全部处理完成后,进行合并即可 ![image-20240731142449950](assets/image-20240731142449950.png) 4. 输出BOM导入清单