我有以下物料清单表:
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。
如果您需要更多数据或信息,请随时询问。
非常感谢,艾伦。
答案 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函数,并且比像此处的此测试子项那样仅打印它来更好地处理结果。
请注意:该代码未针对性能进行优化。
欢呼
詹斯