Сложность вашей задачи заключается в том, что количество уровней от родителя 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, и обработать результат лучше, чем просто распечатать его, как это делает этот тестовый сабл.
Обратите внимание: код не был оптимизирован для производительности.
Приветствия
Jens