ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

【求助】急!母件与子件对应关系(批量一对多查找)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-24 12:04 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
兄弟们,急!。。具体放附件里面了!!应该描述的挺详细的,外面就简单介绍一下

说明
1.母件料号前2位是16的,为成品,我已经筛选出来了
2.A:B列是数据源,母件和子件的对应关系
3.如何批量整理出母件和子件的关系
4.目前我认为,里面牵扯到一对多查询,以及一对多之后如何自动将单元格往下移等问题。。(目前这是我的思路,不知道大神们有什么其他思路)



万分感谢!!!!!!!!!!!!!!!

Test1.zip

682.46 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2020-3-24 18:49 | 显示全部楼层
Option Explicit
Dim d_other As Object
Sub test()
Dim arr, brr, ar, crr(1 To 50000, 1 To 10)
Dim i&, j&, m&, x
Dim d_main As Object
Set d_other = CreateObject("scripting.dictionary")
Set d_main = CreateObject("scripting.dictionary")
arr = ActiveSheet.Range("a1").CurrentRegion
For i = 2 To UBound(arr)
    If Val(Left(arr(i, 1), 2)) = 16 Then
        If Not d_main.exists(arr(i, 1)) Then
            d_main(arr(i, 1)) = Array(arr(i, 2))
        Else
            ar = d_main(arr(i, 1))
            ReDim Preserve ar(UBound(ar) + 1)
            ar(UBound(ar)) = arr(i, 2)
            d_main(arr(i, 1)) = ar
        End If
    Else
        If Not d_other.exists(arr(i, 1)) Then
            d_other(arr(i, 1)) = Array(arr(i, 2))
        Else
            ar = d_other(arr(i, 1))
            ReDim Preserve ar(UBound(ar) + 1)
            ar(UBound(ar)) = arr(i, 2)
            d_other(arr(i, 1)) = ar
        End If
    End If
Next

For Each x In d_main.keys
    m = m + 1: crr(m, 1) = x
    brr = d_main(x)
    For i = LBound(brr) To UBound(brr)
        x = brr(i)
        Call DG(x, crr, d_other, m, 2)
    Next
Next
With ActiveSheet
    .Range("s2:zz" & Rows.Count).ClearContents
    .Range("s2").Resize(m, UBound(crr, 2)).NumberFormat = "@"
    .Range("s2").Resize(m, UBound(crr, 2)) = crr
End With
End Sub

Sub DG(x, crr, d_other, m, n)
Dim i, k, brr
        crr(m, n) = x
        If Not d_other.exists(x) Then
            m = m + 1
        Else
            brr = d_other(x)
            For i = LBound(brr) To UBound(brr)
                Call DG(brr(i), crr, d_other, m, n + 1)
            Next
        End If
End Sub


1.gif

Test1.rar

1.16 MB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2020-3-29 14:56 | 显示全部楼层
本帖最后由 yjh_27 于 2020-4-1 14:15 编辑

自定义函数 见
BOM 大纲排序-自定义函数
http://club.excelhome.net/thread-1175717-1-1.html
(出处: ExcelHome技术论坛)


Test1.rar

431.8 KB, 下载次数: 20

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 17:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-29 14:56
自定义函数 见
BOM 大纲排序-自定义函数
http://club.excelhome.net/thread-1175717-1-1.html

好的,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-29 18:24 | 显示全部楼层
yjh_27 发表于 2020-3-29 14:56
自定义函数 见
BOM 大纲排序-自定义函数
http://club.excelhome.net/thread-1175717-1-1.html

老师,您好!看了您的东西我突然多了个灵感,能不能把D:F列,变成G:I列这样呢。。(我把红色部分列在G:I列)。。。这样的话就知道母件下面对应的子件了,也比较清晰
无标题.png

TA的精华主题

TA的得分主题

发表于 2020-3-29 21:24 | 显示全部楼层
StriveDandy 发表于 2020-3-29 18:24
老师,您好!看了您的东西我突然多了个灵感,能不能把D:F列,变成G:I列这样呢。。(我把红色部分列在G:I列 ...

要求独特。可以实现,重新下载3L附件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-30 17:21 | 显示全部楼层
yjh_27 发表于 2020-3-29 21:24
要求独特。可以实现,重新下载3L附件。

老师,我把完整的数据放进去,想多输出几个值,我尝试进行了一些修改,但是好像有点不对额。请问对应输出的值的增加是在哪增加的呢,具体放附件了

Test.zip

168.5 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2020-3-30 20:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
StriveDandy 发表于 2020-3-30 17:21
老师,我把完整的数据放进去,想多输出几个值,我尝试进行了一些修改,但是好像有点不对额。请问对应输出 ...
  1. Sub aa()
  2. r = Worksheets("DataBase").Range("a" & Rows.Count).End(xlUp).Row
  3. arr = Worksheets("DataBase").Range("a2:t" & r)
  4. brr = BOMSort(arr, 1, 14, -21, , , , 1)
  5. For i = 1 To UBound(brr)
  6.     If Left(brr(i, 1), 2) = "16" Then Exit For
  7. Next
  8. clm = Array(, 1, 2, 14, 15, 18, 19, 20, 21)
  9. ReDim crr(1 To UBound(brr) - i + 1, 1 To UBound(clm))
  10. For i = i To UBound(brr)
  11.     ci = ci + 1
  12.     For j = 1 To UBound(clm)
  13.         crr(ci, j) = brr(i, clm(j))
  14. Next j, i
  15. r1 = Worksheets("Sheet1").Range("a" & Rows.Count).End(xlUp).Row
  16. Worksheets("Sheet1").Range("a2").Resize(r1 - 1, UBound(crr, 2)).ClearContents
  17. Worksheets("Sheet1").Range("a2").Resize(UBound(crr), UBound(crr, 2)).NumberFormatLocal = "@"
  18. Worksheets("Sheet1").Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr
  19. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-31 11:06 | 显示全部楼层

老师您好,实在不好意思,我是要cc变成这样哦,我用你这个改了一下。。没有改出来

TA的精华主题

TA的得分主题

发表于 2020-3-31 11:44 | 显示全部楼层
StriveDandy 发表于 2020-3-31 11:06
老师您好,实在不好意思,我是要cc变成这样哦,我用你这个改了一下。。没有改出来
  1. Sub dd()
  2. r = Worksheets("DataBase").Range("a" & Rows.Count).End(xlUp).Row
  3. arr = Worksheets("DataBase").Range("a2:t" & r)
  4. brr = BOMSort(arr, 1, 14, -21, 2, , , 1)
  5. For i = 1 To UBound(brr)
  6.     If Left(brr(i, 1), 2) = "16" Then Exit For
  7. Next
  8. clm = Array(, 1, 2, 14, 15, 18, 19, 20, 21)
  9. ReDim crr(1 To UBound(brr) - i + 1, 1 To UBound(clm))
  10. For i = i To UBound(brr)
  11.     ci = ci + 1
  12.     For j = 1 To UBound(clm)
  13.         crr(ci, j) = brr(i, clm(j))
  14.     Next
  15.     If crr(ci, 8) = 2 Then i0 = ci Else crr(ci, 1) = crr(i0, 1): crr(ci, 2) = crr(i0, 2)
  16. Next
  17. r1 = Worksheets("Sheet1").Range("a" & Rows.Count).End(xlUp).Row
  18. Worksheets("Sheet1").Range("a2").Resize(r1 - 1, UBound(crr, 2)).ClearContents
  19. Worksheets("Sheet1").Range("a2").Resize(UBound(crr), UBound(crr, 2)).NumberFormatLocal = "@"
  20. Worksheets("Sheet1").Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr
  21. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-3 14:15 , Processed in 0.052811 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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