2015-12-02 55 views
3

我目前使用Treeview Control from JKP的樹視圖控件。試圖用來自Excel工作表的分層數據填充樹,我遇到了這個問題:我填充的樹不能反映數據。在這張照片AP0004應當根據TP0002使用Excel中的分層數據填充樹視圖控件Sheet

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 

一定有什麼錯在這裏我的做法。任何建議?

回答

1

好的,我現在明白了。我知道它是意大利麪代碼,但現在它可以工作。

對於未來的人,誰可能需要這個

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 
1

我想這是什麼地方在這裏:

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

cNode.Child只需挑選的cNode的第一個孩子,而不是你想要的。

請注意,AP003是TP002下的唯一節點,因爲它是創建TP002的情況。


一般注:全球On Error Resume Next看起來優雅的話,你檢查如果一個節點已經存在的必要性,但它也將掩蓋可能出現的任何其它錯誤。

恕我直言,更好的方法是始終檢查:我需要的父節點是否已經存在?
如果是的話,這會得到您需要添加子項的節點。
如果否,創建它,然後您也有父節點。

+0

謝謝你,我現在嘗試不同的方法,它的工作原理。 –