vba - 使用 Excel 工作表中的分层数据填充 TreeView 控件

标签 vba excel treeview

我目前正在使用 Treeview Control from JKP 中的 TreeView 控件。尝试使用 Excel 工作表中的分层数据填充树时,我遇到了这个问题:我填充的树不反射(reflect)数据。在此图中,AP0004 应位于 TP0002

Populate a treeview control in VBA

我尝试过的代码是这样的

For Each c In Sheet14.Range("A2:A" & Sheet14.Range("A" & Rows.Count).End(xlUp).Row)

    On Error Resume Next
    'Populate level 1
    Set cRoot = .AddRoot(sKey:=c.Value2, vCaption:=c.Value2)

    Set cExtraNode = cRoot.AddChild("ML_" & c.Value2, "Meilensteine")

    'Populate level 2
    Set cNode = cRoot.AddChild(c.Offset(, 1).Value2, c.Offset(, 1).Value2)

    'Populate level 3
    If cNode.Level = 2 Then Set cNode = cNode.ParentNode

    If Not IsEmpty(c.Offset(, 2).Value2) Then
        Set cNode = cNode.AddChild(c.Offset(, 2).Value2, c.Offset(, 2).Value2)
    End If

    'Populate level 4
    If Not IsEmpty(c.Offset(, 3).Value2) Then
        If cNode.Level = 2 Then
            Set cNode = cNode.AddChild(c.Offset(, 3).Value2, c.Offset(, 3).Value2)
            Set cNode = cNode.ParentNode
        ElseIf cNode.Level = 1 Then
            Set cNode = cNode.Child.AddChild(c.Offset(, 2).Value2, c.Offset(, 2).Value2)
            Set cNode = cNode.Child.AddChild(c.Offset(, 3).Value2, c.Offset(, 3).Value2)
            Set cNode = cNode.ParentNode
        End If
    End If
Next

我的做法肯定有问题。有什么建议吗?

最佳答案

我猜它就在这附近:

Set cNode = cNode.Child.AddChild(c.Offset(, 3).Value2, c.Offset(, 3).Value2)

cNode.Child只需选择 cNode 的第一个 child ,不是您想要的。

请注意 AP003 是 TP002 下的唯一节点,因为它是创建 TP002 的情况。

<小时/>

一般说明:全局On Error Resume Next看起来很优雅,让您无需检查节点是否已存在,但它也会掩盖可能出现的任何其他错误。

恕我直言,更好的方法是始终检查:我需要的父节点是否已经存在?
如果是,这将为您提供添加子节点所需的节点。
如果没有,则创建它,然后您也有了父节点。

关于vba - 使用 Excel 工作表中的分层数据填充 TreeView 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34039831/

相关文章:

excel - 使用 Excel 保存带有名称的 Word 文件

excel - 使用动态数组存储和粘贴值

python - Tkinter Treeview 没有给出隐藏字符的指示

vba - 如何在Excel VBA中锁定行之间

excel - 有没有办法简化这段代码?该代码在 3 张纸上重复。

Excel 2016 Office 365 灾难性故障

c# - 在 TreeView 中编辑节点时删除背景

python - 如何将数据放入 TreeView 中?

.net - 在 Outlook 2007 或更高版本中控制加密和数字签名按钮

excel - 使用 "if"函数识别特定时间