物料清单-细分代码

时间:2018-11-18 21:17:15

标签: excel vba excel-vba

我有以下物料清单表:

Parent    Child
A001      A002
A002      A003
A002      M002
A002      M003
A003      M004
A004      M005

我需要做的是返回父列中的每个ACode以及该行后面的任何MCode。因此,上面的代码将返回:

A001 M002
A001 M003
A001 M004
A002 M002
A002 M003
A002 M004
A003 M004
A004 M005

因此,简而言之,每个ACode都具有进入其下任意级别的每个MCode。

如果您需要更多数据或信息,请随时询问。

非常感谢,艾伦。

1 个答案:

答案 0 :(得分:1)

关于您的任务的棘手事情是,从A ***父级到M ***子级的级别数可能有所不同。此外,目前尚不清楚多少个M ***属于一个A ***。

基于这种观察,我猜想递归的VBA函数比Vlookup或Index / Match更有意义:

Sub Test(needle As String)

    Dim c As Collection
    Set c = GetMs(Selection, needle)

    Dim i As Long
    For i = 1 To c.Count
        Debug.Print needle & "->" & c.Item(i)
    Next i

End Sub


Function GetMs(r As Range, needle As String) As Collection
    Dim c As New Collection

    Dim i As Long
    Dim j As Long

    For i = 1 To r.Rows.Count
        If r.Cells(i, 1).Value = needle Then
            If Left(r.Cells(i, 2).Value, 1) = "M" Then
                c.Add r.Cells(i, 2).Value
            Else
                Dim tempC As Collection
                Set tempC = GetMs(r, r.Cells(i, 2).Value)
                For j = 1 To tempC.Count
                    c.Add tempC.Item(j)
                Next j
            End If
        End If
    Next i

    Set GetMs = c
End Function

如果您使用一个A元素(例如,

 Test "A001"

将打印

A001-> M004

A001-> M002

A001-> M003

,但请确保已选择包含所有父子数据的数据范围。否则,“测试”子菜单中的“选择”将不起作用。

从这里开始,您只需要编写自己的循环即可,该循环调用GetMs函数,并且比像此处的此测试子项那样仅打印它来更好地处理结果。

请注意:该代码未针对性能进行优化。

欢呼

詹斯