使用Excel Sheet中的分层数据填充树视图控件

我目前正在使用JKP的Treeview控件的树视图控件。 试图用来自Excel工作表的分层数据填充树,我遇到了这个问题:我填充的树不反映数据。 在这幅图中, AP0004应该在TP0002

在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 

我的方法在这里肯定有问题。 任何build议?

我想这是在这里的某个地方:

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

cNode.Child只是selectcNode.Child的第一个孩子,而不是你想要的。

注意AP003是TP002下的唯一节点,因为TP002是创build的。


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

恕我直言,更好的办法是总是检查:我需要的父节点已经存在?
如果是的话,这会得到您需要添加子节点的节点。
如果不是,创build它,然后你也有父节点。

好的,我现在知道了。我知道这是意大利面条代码,但现在它工作。

对于未来的人,谁可能需要这个

 lastRow = Sheet14.Range("A" & Rows.Count).End(xlUp).Row ' root nodes For Each c In Sheet14.Range("A2:A" & lastRow) If cRoot Is Nothing Then Set cRoot = .AddRoot(sKey:=c.Value2, vCaption:=c.Value2) cRoot.Bold = True currentRootKey = cRoot.key Set cExtraNode = cRoot.AddChild("ML_" & c.Value2, "Meilensteine") currentMLKey = cExtraNode.key End If If c.Value2 <> currentRootKey Then Set cRoot = .AddRoot(sKey:=c.Value2, vCaption:=c.Value2) cRoot.Bold = True currentRootKey = cRoot.key Set cExtraNode = cRoot.AddChild("ML_" & c.Value2, "Meilensteine") currentMLKey = cExtraNode.key End If Next ' level 1 children For Each c In Sheet14.Range("B2:B" & lastRow) If Not IsEmpty(c.Value2) And c.Value2 <> currNodeKey Then Set cNode = .Nodes(c.Offset(, -1).Value2) Set cNode = cNode.AddChild(c.Value2, c.Value2) currNodeKey = cNode.key End If Next 'level 2 children For Each c In Sheet14.Range("C2:C" & lastRow) If Not IsEmpty(c.Value2) And c.Value2 <> currNodeKey Then Set cNode = .Nodes(c.Offset(, -1).Value2) Set cNode = cNode.AddChild(c.Value2, c.Value2) currNodeKey = cNode.key End If Next 'level 3 children For Each c In Sheet14.Range("D2:D" & lastRow) If Not IsEmpty(c.Value2) And c.Value2 <> currNodeKey Then Set cNode = .Nodes(c.Offset(, -1).Value2) Set cNode = cNode.AddChild(c.Value2, c.Value2) currNodeKey = cNode.key End If Next