【问题标题】:Populating TreeView with column header and subheader使用列标题和子标题填充 TreeView
【发布时间】:2016-02-06 22:16:39
【问题描述】:

我是树视图控件的新手,我想填充我的 TreeView(两列),其中标题列作为父节点,子标题作为子节点,如图所示:

我从以下代码开始,但我坚持使用它:

Sub UserForm_Initialize()

    Dim WB As Workbook
    Dim WS As Worksheet
    Dim HeaderRng As Range
    Dim rng As Range
    Dim rCell As Range
    Dim i As Long
    Dim Nod As Node

    Set WB = ThisWorkbook
    Set WS = WB.Worksheets("Data")
    Set HeaderRng = WS.Range("A1:M1")

    With Me.TreeView1.Nodes
        .Clear
        For Each rCell In HeaderRng
            .Add Key:=rCell.Value, Text:=rCell.Value
        Next rCell
    End With

    TreeView1.CheckBoxes = True
    TreeView1.Style = tvwTreelinesPlusMinusText
    TreeView1.BorderStyle = ccFixedSingle

End Sub

【问题讨论】:

    标签: excel vba treeview populate


    【解决方案1】:

    感谢您向我介绍 TreeView!在这个article 的帮助下,我已经让它符合你的条件。

    设计视图 |用户表单的执行:

    代码(已更新以适应 HeaderRng 中的乱序组):

    Option Explicit
    
    Sub UserForm_Initialize()
        With Me.TreeView1
            .BorderStyle = ccFixedSingle
            .CheckBoxes = True
            .Style = tvwTreelinesPlusMinusText
            .LineStyle = tvwRootLines
        End With
    
        UpdateTreeView
    End Sub
    
    Private Sub UpdateTreeView()
        Dim WB As Workbook
        Dim WS As Worksheet
        Dim HeaderRng As Range
        Dim rng As Range
        Dim sCurrGroup As String
        Dim sChild As String
        Dim oNode As Node
    
        Set WB = ThisWorkbook
        Set WS = WB.Worksheets("Data")
        With WS ' Row A are Header/Groups
            Set HeaderRng = Intersect(.Rows(1), .UsedRange)
        End With
    
        With Me.TreeView1
            With .Nodes
                '.Clear
                sCurrGroup = ""
                For Each rng In HeaderRng
                    'Debug.Print "rng: " & rng.Address & " | " & rng.Value
                    sCurrGroup = rng.Value
                    ' Add Node only if it does NOT exists
                    Set oNode = Nothing
                    On Error Resume Next
                    Set oNode = .Item(sCurrGroup)
                    If oNode Is Nothing Then
                        'Debug.Print "Adding Group: " & sCurrGroup
                        .Add Key:=sCurrGroup, Text:=sCurrGroup
                    End If
                    On Error GoTo 0
    
                    ' Add the Child below the cell
                    sChild = rng.Offset(1, 0).Value
                    'Debug.Print "Adding [" & sChild & "] to [" & sCurrGroup & "]"
                    .Add Relative:=sCurrGroup, Relationship:=tvwChild, Key:=sChild, Text:=sChild
                Next
            End With
            For Each oNode In .Nodes
                oNode.Expanded = True
            Next
        End With
    
        Set HeaderRng = Nothing
        Set WS = Nothing
        Set WB = Nothing
    End Sub
    

    【讨论】:

    • 感谢 Patrick,但我收到错误消息“密钥在集合中不是唯一的”。有什么想法吗?
    • 取消注释 Debug.Print "Adding... 以查看它认为哪个是重复的,然后在单元格中检查它是否是重复的。如果您在其他地方拨打UpdateTreeView,我建议您也取消注释.Clear
    • Patric ..它有效的问题是,如果我有串联组然后它有效。如果我的组不是串联的,它会给我这个错误(例如 Group1、Group 2、Group1.Group2...等)。
    • 我明白了,这些组不按顺序排列...您将需要一种不同的方法。但是标题是独一无二的吗?
    • 嗨 Patric,我想获取一个已检查节点(唯一的子节点)的列表作为数组,并将选择限制为最多 8 个子节点。我一直在检查所选节点是父节点还是子节点。有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2019-04-20
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多