Формирование цикла, который строит древовидную структуру - PullRequest
0 голосов
/ 04 мая 2019

У меня сложная проблема, которую я пытался решить, но безуспешно, и мне нужно некоторое руководство по этому вопросу.

Я пытаюсь построить древовидное представление со структурой, показанной на рисунке ниже. В приведенном ниже примере есть 2 корневых узла. Для первого корневого узла у него есть 2 дочерних узла. Первый дочерний узел (1.A) не имеет «дочерних узлов», тогда как второй дочерний узел (2.B) имеет несколько дочерних и «дочерних» узлов. Тогда второй корневой узел имеет такую ​​же структуру.

TreeView

Чтобы упростить задачу, были созданы функции для создания корневых узлов и дочерних узлов. Чтобы создать корневой узел, я могу просто сделать:

    Set cRoot = Tree.AddRoot("Root Node")

Чтобы создать дочерний узел, я могу просто сделать:

    Set cNode = cRoot.AddChild("1.A")
    Set cNode = cRoot.AddChild("2.B")

И если я хочу погрузиться глубже в дочерний узел, я могу сделать:

    Set cNode = cNode.AddChild("2.1 level2")
    Set cNode = cNode.AddChild("2.1.1 level3")

После запуска всего вышеприведенного кода будет сгенерировано ниже.

TreeViewSimplified

Мой вопрос / задача заключается в том, чтобы, не жестко запрограммировав, изменить его. Итак, если у меня есть древовидная структура в качестве первого изображения с небольшим количеством корневых узлов и дочерних элементов, как построить цикл, который будет добавлять все. Я в основном хочу проанализировать информацию листа обратно в код vba.

Для меня логика будет читаться первой ячейкой, если она не пуста, то это будет корневой узел. Затем, если это корневой узел, найдите и посмотрите, есть ли у него дочерний узел. В этом случае первый дочерний узел - «1.A» и т. Д.

Короче говоря, как мне создать цикл, который будет добавлять корневой и дочерний узлы обратно с помощью функций addRoot () и addChild (), которые у меня есть? Я зашел так далеко, что нашел самую дальнюю ветвь первого дочернего узла, но я не уверен, как заставить его «вернуться», и ищу, есть ли второй дочерний узел, а затем продолжаю погружение глубже.

1 Ответ

1 голос
/ 06 мая 2019

Попробуйте это для размера ...

Private Sub BuildTree()
    Dim objSrcSheet As Worksheet, lngRow As Long, objCell As Range
    Dim objSrcRange As Range, objParent As Range

    Set objSrcSheet = Sheet1
    Set objSrcRange = objSrcSheet.Range("A1:" & objSrcSheet.Cells.SpecialCells(xlCellTypeLastCell).Address)

    With objSrcRange
        For Each objCell In .Cells
            If objCell.Value <> "" Then
                If objCell.Column = 1 Then
                    ' If it's column one, it's a root node, therefore, just add it normally.
                    TreeView.Nodes.Add , , objCell.Address, objCell.Value
                Else
                    ' Loop back through the previous column to find the parent.
                    For lngRow = objCell.Row To 1 Step -1
                        Set objParent = .Cells(lngRow, objCell.Column - 1)

                        If objParent.Value <> "" Then
                            TreeView.Nodes.Add objParent.Address, tvwChild, objCell.Address, objCell.Value
                            Exit For
                        End If
                    Next
                End If
            End If
        Next
    End With
End Sub

... это использует (несколько) стандартное представление дерева общих элементов управления Microsoft.

enter image description here

https://www.microsoft.com/en-us/download/details.aspx?id=10019

Так выглядят исходные данные на листе ...

enter image description here

... и логика предполагает, что все данные начинаются с ячейки A1.

Если вы не используете тот же элемент управления, что и у меня, вы можете адаптировать его, но, если честно, я могуне уверен, но логика логична, поэтому она дает вам довольно полезную отправную точку.

Надеюсь, это поможет.

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