使用来自 Excel Sheet 的分层数据填充树视图控件
Populate treeview control with hierarchical data from Excel Sheet
我目前正在使用 Treeview Control from JKP 的树视图控件。尝试用来自 Excel Sheet 的分层数据填充树时,我遇到了这个问题:我填充的树不反映数据。图中AP0004
应该在TP0002
下面
我试过的代码是这样的
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
似乎很优雅,使您无需检查节点是否已存在,但它也会掩盖可能出现的任何其他错误。
恕我直言,更好的方法是始终检查:我需要的 parent 节点是否已经存在?
如果是,这将为您提供添加 child.
所需的节点
如果没有,创建它,然后你也有 parent 节点。
好的,我知道了 now.I 知道它是意大利面条代码,但现在它有效。
对于未来的人,谁可能需要这个
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
我目前正在使用 Treeview Control from JKP 的树视图控件。尝试用来自 Excel Sheet 的分层数据填充树时,我遇到了这个问题:我填充的树不反映数据。图中AP0004
应该在TP0002
我试过的代码是这样的
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
似乎很优雅,使您无需检查节点是否已存在,但它也会掩盖可能出现的任何其他错误。
恕我直言,更好的方法是始终检查:我需要的 parent 节点是否已经存在?
如果是,这将为您提供添加 child.
所需的节点
如果没有,创建它,然后你也有 parent 节点。
好的,我知道了 now.I 知道它是意大利面条代码,但现在它有效。
对于未来的人,谁可能需要这个
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