Excel TreeView несколько столбцов - PullRequest
0 голосов
/ 01 декабря 2009

Извините за мою Noobness с Excel / Vba ... из мира Unix ... Мне нужна помощь!

Я пытаюсь построить TreeView в форме Excel из таблицы Excel с 3 столбцами. Лист ссылается на список кинотеатров, уже организованных в «древовидном представлении», где столбец A относится к названию группы кинотеатров, столбцы B и C относятся к конкретным названиям кинотеатров и информации, например:

A1:Independent Cinemas
B2:CinemaName1 C2:Cinema1 Infos
B3:CinemaName2 C3:Cinema2 Infos
B4:CinemaName3 C4:Cinema3 Infos
A5:Cineplex Cinemas
B6:CinemaName4 C6:Cinema4 Infos
B7:CinemaName5 C7:Cinema5 Infos
A8:Next Group of Cinemas
B9:..... etc etc

Следуя этому описанию, я хочу, чтобы древовидная структура выглядела так:

+-A1
---+B2,C2
---+B3,C3
---+B4,C4
+-A5
---+B6,C6
---+B7,C7
+-A8
---+B9,C9
etc...

Извините за представление, это хромает, но вы получите картину ... Вот что у меня есть:

Private Sub TreeView_Populate()

Dim wbBook As Workbook
Dim wsZones As Worksheet
Dim rngZones As Range
Dim lngRows As Long

Set wbBook = ThisWorkbook
Set wsZones = wbBook.Worksheets("Cinemas")

lngRows = wsZones.Range("A65536").End(xlUp).row
Set rngZones = wsZones.Range("A1:A" & lngRows)

Dim lElement As Long
Dim rCell As Range

With Me.ZonesTree.Nodes
      'Clear TreeView control
      .Clear

        For Each rCell In rngZones
            'We have a group name in the A columns so we attach it to the tree
            If Not rCell.Text = "" Then
                .Add Key:=rCell.Text, Text:=rCell.Text
                'THIS IS WHERE I BLOCK!!
                'Need the range from Columns B and C until the next Value in the A Column
                'in order to add the children nodes....
                        .Add relative:=CinemaName, _
                          relationship:=tvwChild, _
                          Key:=CinemaName(here it will be B column), CinemaInfos(C column)
                          Text:=CinemaName(B column)
            End If
        Next rCell
End With
End Sub

В моей форме также есть подпрограмма инициализации .ZonesTree.LineStyle = tvwRootLines, которая создает флажки для каждого элемента дерева. Я бы хотел, чтобы все флажки были установлены по умолчанию ...

Это возможно? Мне в основном нужен «временный» диапазон, содержащий значения из столбцов B и C для построения дочерних узлов ... В коде VBA я добавил несколько комментариев, где я не могу ... Буду очень признателен за любую помощь / предложение!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2009

Спасибо, astander, вы поставили меня в путь ...

Вот и мы:

Private Sub TreeView_Populate()

Dim wbBook As Workbook
Dim wsZones As Worksheet
Dim rngZones As Range
Dim rngCinemas As Range
Dim lngRows As Long

Set wbBook = ThisWorkbook
Set wsZones = wbBook.Worksheets("Cinemas")

lngRows = wsZones.UsedRange.Rows.Count
Set rngZones = wsZones.Range("A1:A" & lngRows)

Dim rngBC As Range
Set rngBC = wsZones.Range("B1:C" & lngRows)


Dim rCell As Range
Dim lastCreatedKey As String
Dim rowCount As Integer
Dim currentRowRange As Range
rowCount = 1
lastCreatedKey = ""

With Me.ZonesTree.Nodes
      'Clear TreeView control
      .Clear

        For Each rCell In rngZones
            If Not rCell.Text = "" Then
                .Add Key:=rCell.Text, Text:=rCell.Text
                lastCreatedKey = rCell.Text
            Else
                Set currentRowRange = rngBC.Rows(rowCount)
                .Add Relative:=lastCreatedKey, relationship:=tvwChild, Key:=currentRowRange.Cells(, 2).Text, Text:=currentRowRange.Cells(, 1).Text
            End If
            rowCount = rowCount + 1
        Next rCell
End With
End Sub

Я действительно хотел, чтобы значения столбца C были ключевыми, а значения столбца B - текстами дочернего узла.

Следующая проблема, я использую режим флажка для этого дерева, означает, что все узлы доступны для выбора. Я хотел бы это по умолчанию: -все флажки выбраны

- при выборе / отмене выбора родительского узла все дочерние узлы выбираются / не выбираются

-Я хочу получить выбранные данные, чтобы сохранить их где-то

Кто-нибудь знает, как это сделать? С уважением, P

0 голосов
/ 01 декабря 2009

Посмотрите на это.

Получить полный диапазон для столбцов а, чтобы зациклить строки. Также получите Range для B, C и используйте счетчик, чтобы указать, на какой строке вы находитесь

Private Sub TreeView_Populate()

    Dim wbBook As Workbook
    Dim wsZones As Worksheet
    Dim rngZones As Range
    Dim lngRows As Long

    Set wbBook = ThisWorkbook
    Set wsZones = wbBook.Worksheets("Cinemas")

    lngRows = wsZones.UsedRange.Rows.Count
    Set rngZones = wsZones.Range("A1:A" & lngRows)
    Dim rngBC As Range
    Set rngBC = wsZones.Range("B1:C" & lngRows)

    'lngRows = wsZones.Range("A65536").End(xlUp).Row
    'Set rngZones = wsZones.Range("A1:A" & lngRows)

    Dim lElement As Long
    Dim rCell As Range
    Dim rowCount As Integer
    rowCount = 1

    With Me.ZonesTree.Nodes
          'Clear TreeView control
          .Clear

            For Each rCell In rngZones
                'We have a group name in the A columns so we attach it to the tree
                If Not rCell.Text = "" Then
                    .Add Key:=rCell.Text, Text:=rCell.Text
                    'THIS IS WHERE I BLOCK!!
                    'Need the range from Columns B and C until the next Value in the A Column
                    'in order to add the children nodes....
                            .Add relative:=CinemaName, _
                              relationship:=tvwChild, _
                              Key:=CinemaName(here it will be B column), CinemaInfos(C column)
                              Text:=CinemaName(B column)
                End If
                'this is how to get the bc range
                Dim currentRowRange As Range
                Set currentRowRange = rngBC.Rows(rowCount)
                Dim b As String
                Dim c As String
                b = currentRowRange.Cells(, 1)
                c = currentRowRange.Cells(, 2)
                rowCount = rowCount + 1
            Next rCell
    End With
    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...