ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 父子关系格式的BOM,转换为每成品料号展开一行或多行

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-25 10:34 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 nico1321 于 2018-12-25 13:18 编辑

各位大侠,请求帮助,非常感谢!
原始数据有几万行,分别是所有料号的父阶/子阶关系,需要将数据整理成为成品料号的所有半成品料号子阶展开。
数据逻辑如下:
1.每个成品料号依次展开所有子阶
2. 同一层有多个子阶,则多行存放
3. 如某一成品料号展开过程中,有互为父子等异常状况,则备注该成品料号有“互为父子料号异常”


原始数据  程序运行结果     
父阶料号属性
父阶料号
子阶料号
成品料号
备注
第一层子阶
第二层子阶
第三层子阶
第四层子阶
。。。。
成品料号
A
AA
A
AA
AAA
AAAA

半成品料号
AA
AAA
B
BB
BBB


半成品料号
AAA
AAAA
B
BB1
BBB1


成品料号
B
BB
C
互为父子异常
CC


半成品料号
B
BB1
半成品料号
BB
BBB
半成品料号
BB1
BBB1
成品料号
C
CC
半成品料号
CC
CC1
半成品料号
CC1
CC
 
 
 

成品料号的所有子阶展开 VB求助.zip

9.4 KB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2018-12-25 12:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
文件不能解压

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-25 13:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

不好意思,新增附件

成品料号的所有子阶展开 VB求助.zip

9.4 KB, 下载次数: 72

TA的精华主题

TA的得分主题

发表于 2018-12-25 15:14 | 显示全部楼层
本帖最后由 一把小刀闯天下 于 2018-12-25 15:19 编辑

Option Explicit

Sub test()
  Dim arr, i, j, k, a, b, cnt, m, n, s, t, dic
  Set dic = CreateObject("scripting.dictionary")
  arr = [a1].CurrentRegion.Offset(1)
  ReDim brr(1 To UBound(arr, 1), 1 To 10 + 2) '最多支持10级
  arr(UBound(arr, 1), 1) = "成品料号"
  ReDim crr(1 To 100) As String
  For i = 2 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j + 1, 1) = "成品料号" Then
        t = arr(i, 2): cnt = 1
        For k = i + 1 To j
          If arr(k, 2) = arr(i, 2) Then cnt = cnt + 1
        Next
        For k = 1 To cnt
          For a = i To j
            If arr(a, 2) = t Then
              arr(a, 2) = vbNullString
              s = arr(a, 3)
              Call rec(arr, i, j, arr(a, 3), s)
              m = m + 1: n = 2
              brr(m, 1) = t: s = Split(s, ",")
              dic.RemoveAll
              For b = 0 To UBound(s)
                n = n + 1: brr(m, n) = s(b)
                dic(s(b)) = dic(s(b)) + 1
                If dic(s(b)) > 1 Then brr(m, 2) = "互为父子:" & s(b)
              Next
            End If
        Next a, k
        i = j: Exit For
      End If
  Next j, i
  With [e3]
    .Resize(Rows.Count - 2, UBound(brr, 2)).ClearContents
    .Resize(m, UBound(brr, 2)) = brr
  End With
End Sub

Function rec(arr, a, b, t, s)
  Dim i, j
  For i = a To b
    If arr(i, 2) = t Then
      s = s & "," & arr(i, 3)
      arr(i, 2) = vbNullString
      Call rec(arr, a, b, arr(i, 3), s)
    End If
  Next
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-25 15:40 | 显示全部楼层

哇。。。。 超赞~~~  谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-25 16:09 | 显示全部楼层

还得请教一下,如果原始数据是随机存放的,可能前100行是成品,后1000行是半成品。。。
程序还需要怎样改动呢? 谢谢!

TA的精华主题

TA的得分主题

发表于 2018-12-25 16:10 | 显示全部楼层
nico1321 发表于 2018-12-25 16:09
还得请教一下,如果原始数据是随机存放的,可能前100行是成品,后1000行是半成品。。。
程序还需要怎样 ...

成品与半成品肯定有某种关系,否则无解。可以上附件图示一下,,,

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-25 16:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 nico1321 于 2018-12-26 12:59 编辑
一把小刀闯天下 发表于 2018-12-25 16:10
成品与半成品肯定有某种关系,否则无解。可以上附件图示一下,,,

前2618行为成品料号,展开了一层,然后第二层,只得到了一个料号
SHILI.png

TA的精华主题

TA的得分主题

发表于 2018-12-25 20:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Dim d, s&
  2. Sub 宏1()
  3. arr = Range("a1").CurrentRegion
  4. Set d = CreateObject("scripting.dictionary")
  5. For i = 3 To UBound(arr)
  6.     If Not d.exists(arr(i, 2)) Then
  7.         d(arr(i, 2)) = arr(i, 3)
  8.     Else
  9.         d(arr(i, 2)) = d(arr(i, 2)) & "," & arr(i, 3)
  10.     End If
  11. Next
  12. s = 0
  13. For i = 3 To UBound(arr)
  14.     If arr(i, 1) = "成品料号" Then aa arr(i, 2), "", s
  15. Next
  16. End Sub
  17. Sub aa(x, p, s)
  18. On Error GoTo 100
  19. If d.exists(x) Then
  20.     aa d(x), p & "-" & x, s
  21. Else
  22.     If InStr(x, ",") > 0 Then
  23.         p2 = p
  24.         y = Split(x, ",")
  25.         For i = 0 To UBound(y)
  26.             p = p2
  27.             aa y(i), p, s
  28.         Next
  29.     Else
  30. 100:        p = p & "-" & x
  31.         s = s + 1
  32.         Cells(s, "m") = Mid(p, 2)
  33.     End If
  34. End If
  35. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-26 09:26 | 显示全部楼层

神哪。。。运行出来了。。。  好激动~~~   
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 07:32 , Processed in 0.048836 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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