Спецификация - коды пробоя - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующая таблица спецификаций:

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 голосов
/ 19 ноября 2018

Сложность вашей задачи заключается в том, что количество уровней от родителя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...