Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Ebene in SmartArt Hierarchie zutun

Forumthread: VBA Ebene in SmartArt Hierarchie zutun

VBA Ebene in SmartArt Hierarchie zutun
16.03.2023 10:03:26
Hundeliebhaber

Hallo,

ich bräuchte Hilfe, um für die folgenden aus Smart Arts bestehenden Hierarchie eine weitere Reihe ganz unten hinzuzufügen, von der man die Werte in Spalte D einträgt.
Die Beispielmappe ist angehängt: https://www.herber.de/bbs/user/158281.xlsm

Option Explicit

Sub CreateTree()
    Dim w As Worksheet
    Dim a As Variant
    Dim i As Long
    Dim m As Long
    Dim cat As String
    Dim subcat As String
    Dim subsubcat As String
    Dim t As SmartArt
    Dim r As SmartArtNode
    Dim c As SmartArtNode
    Dim sc As SmartArtNode
    Dim ssc As SmartArtNode
    Set w = ActiveSheet
    Set t = w.Shapes("Diagram 1").SmartArt
    Do While t.Nodes.Count
        t.Nodes(1).Delete
    Loop
    Set r = t.Nodes.Add
    r.TextFrame2.TextRange.Text = "Root"
    m = w.Range("A1").End(xlDown).Row
    a = w.Range("A1:C" & m).Value
    i = 2
    Do
        cat = a(i, 1)
        Set c = r.AddNode(msoSmartArtNodeBelow)
        c.TextFrame2.TextRange.Text = cat
        Do
            subcat = a(i, 2)
            Set sc = c.AddNode(msoSmartArtNodeBelow)
            sc.TextFrame2.TextRange.Text = subcat
            Do
                subsubcat = a(i, 3)
                Set ssc = sc.AddNode(msoSmartArtNodeBelow)
                ssc.TextFrame2.TextRange.Text = subsubcat
                i = i + 1
                If i > m Then GoTo ExitHere
            Loop Until a(i, 2) > subcat Or a(i, 1) > cat
        Loop Until a(i, 1) > cat
    Loop
ExitHere:
End Sub


Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Ebene in SmartArt Hierarchie zutun
16.03.2023 15:04:15
Rudi Maintaire
Hallo,
prinzipiell genauso.
Hab mal ein bisschen aufgeräumt.
Eigentlich sollte das smarter gehen.
Sub CreateTree()
  Dim i As Long
  Dim objSA As SmartArt
  Dim strNODE(4) As String
  Dim objNODE(4) As SmartArtNode
  Dim arrNODES As Variant
  
  Set objSA = ActiveSheet.Shapes("Diagram 1").SmartArt
  
  With objSA
    Do While .Nodes.Count
      .Nodes(1).Delete
    Loop
  End With
  
  arrNODES = ActiveSheet.Cells(1, 1).CurrentRegion.Value
  i = 2
  
  strNODE(0) = "ROOT"
  Set objNODE(0) = objSA.Nodes.Add
  objNODE(0).TextFrame2.TextRange.Text = strNODE(0)
  
  Do
    strNODE(1) = arrNODES(i, 1)
    Set objNODE(1) = objNODE(0).AddNode(msoSmartArtNodeBelow)
    objNODE(1).TextFrame2.TextRange.Text = strNODE(1)
    Do
      strNODE(2) = arrNODES(i, 2)
      Set objNODE(2) = objNODE(1).AddNode(msoSmartArtNodeBelow)
      objNODE(2).TextFrame2.TextRange.Text = strNODE(2)
      Do
        strNODE(3) = arrNODES(i, 3)
        Set objNODE(3) = objNODE(2).AddNode(msoSmartArtNodeBelow)
        objNODE(3).TextFrame2.TextRange.Text = strNODE(3)
        Do
          strNODE(4) = arrNODES(i, 4)
          Set objNODE(4) = objNODE(3).AddNode(msoSmartArtNodeBelow)
          objNODE(4).TextFrame2.TextRange.Text = strNODE(4)
          i = i + 1
          If i > UBound(arrNODES) Then Exit Sub
        Loop Until arrNODES(i, 3) > strNODE(3)
      Loop Until arrNODES(i, 2) > strNODE(2)
    Loop Until arrNODES(i, 1) > strNODE(1)
  Loop
  
End Sub
Gruß
Rudi


Anzeige
AW: VBA Ebene in SmartArt Hierarchie zutun
16.03.2023 17:59:19
Hundeliebhaber
Herzlichen Dank, das funktioniert wie gewünscht.
Jetzt wollte ich einmal noch eine fünfte Ebene einfügen, scheitere aber daran. So ist es nicht richtig:

Sub CreateTree()
  Dim i As Long
  Dim objSA As SmartArt
  Dim strNODE(5) As String
  Dim objNODE(5) As SmartArtNode
  Dim arrNODES As Variant
  
  Set objSA = ActiveSheet.Shapes("Diagram 1").SmartArt
  
  With objSA
    Do While .Nodes.Count
      .Nodes(1).Delete
    Loop
  End With
  
  arrNODES = ActiveSheet.Cells(1, 1).CurrentRegion.Value
  i = 2
  
  strNODE(0) = "ROOT"
  Set objNODE(0) = objSA.Nodes.Add
  objNODE(0).TextFrame2.TextRange.Text = strNODE(0)
  
  Do
    strNODE(1) = arrNODES(i, 1)
    Set objNODE(1) = objNODE(0).AddNode(msoSmartArtNodeBelow)
    objNODE(1).TextFrame2.TextRange.Text = strNODE(1)
    Do
      strNODE(2) = arrNODES(i, 2)
      Set objNODE(2) = objNODE(1).AddNode(msoSmartArtNodeBelow)
      objNODE(2).TextFrame2.TextRange.Text = strNODE(2)
      Do
        strNODE(3) = arrNODES(i, 3)
        Set objNODE(3) = objNODE(2).AddNode(msoSmartArtNodeBelow)
        objNODE(3).TextFrame2.TextRange.Text = strNODE(3)
        Do
          strNODE(4) = arrNODES(i, 4)
          Set objNODE(4) = objNODE(3).AddNode(msoSmartArtNodeBelow)
          objNODE(4).TextFrame2.TextRange.Text = strNODE(4)
			Do
			 strNODE(5) = arrNODES(i, 5)
			 Set objNODE(5) = objNODE(4).AddNode(msoSmartArtNodeBelow)
			 objNODE(5).TextFrame2.TextRange.Text = strNODE(5)
			 i = i + 1
			 If i > UBound(arrNODES) Then Exit Sub
			Loop Until arrNODES(i, 4) > strNODE(4)
		Loop Until arrNODES(i, 3) > strNODE(3)
      Loop Until arrNODES(i, 2) > strNODE(2)
    Loop Until arrNODES(i, 1) > strNODE(1)
  Loop
  
End Sub


Anzeige
AW: VBA Ebene in SmartArt Hierarchie zutun
16.03.2023 20:14:17
Rudi Maintaire
Hallo,
sieht an sich richtig aus.
Versuch's mal hiermit. Ist ziemlich universell.
Sub CreateTree2()
  Dim w As Worksheet
  Dim arrNODES As Variant
  Dim strNODE As String
  Dim i As Long, j As Long
  Dim objSA As SmartArt
  Dim objNODE As SmartArtNode
  
  Dim objNodes() As Object, oObj, oNode As SmartArtNode
  Dim x
  
  Set w = ActiveSheet
  arrNODES = w.Cells(1, 1).CurrentRegion.Value
  Set objSA = w.Shapes("Diagram 1").SmartArt
  
  ReDim objNodes(1 To UBound(arrNODES, 2))
  
  For i = 1 To UBound(arrNODES, 2)
    Set objNodes(i) = CreateObject("scripting.dictionary")
  Next i
  
  strNODE = "ROOT"
  
  For i = 2 To UBound(arrNODES)
    For j = 2 To UBound(arrNODES, 2)
      objNodes(1)(arrNODES(i, 1)) = strNODE
      If j = UBound(arrNODES, 2) Then
        objNodes(j)(Format(i, "0000_") & arrNODES(i, j)) = arrNODES(i, j - 1)
      Else
        objNodes(j)(arrNODES(i, j)) = arrNODES(i, j - 1)
      End If
    Next j
  Next i
  
  With objSA
    Do While .Nodes.Count
      .Nodes(1).Delete
    Loop
  End With
  
  Set objNODE = objSA.Nodes.Add
  objNODE.TextFrame2.TextRange.Text = strNODE
  
  For j = 1 To UBound(arrNODES, 2) - 1
    For Each oObj In objNodes(j)
      If oObj > "" Then
        For Each oNode In objSA.AllNodes
          If oNode.TextFrame2.TextRange.Text = objNodes(j)(oObj) Then
            Set objNODE = oNode.AddNode
            objNODE.TextFrame2.TextRange.Text = oObj
            Do While objNODE.Level  j + 1
              objNODE.Demote
            Loop
            Do While objNODE.Level > j + 1
              objNODE.Promote
            Loop
            Exit For
          End If
        Next oNode
      End If
    Next oObj
  Next j
  
  For Each oObj In objNodes(j)
    If Mid(oObj, 6) > "" Then
      For Each oNode In objSA.AllNodes
        If oNode.TextFrame2.TextRange.Text = objNodes(j)(oObj) Then
          Set objNODE = oNode.AddNode
          objNODE.TextFrame2.TextRange.Text = Mid(oObj, 6)
          Do While objNODE.Level  j + 1
            objNODE.Demote
          Loop
          Do While objNODE.Level > j + 1
            objNODE.Promote
          Loop
          Exit For
        End If
      Next oNode
    End If
  Next oObj
  
End Sub

Gruß
Rudi


Anzeige
AW: VBA Ebene in SmartArt Hierarchie zutun
16.03.2023 20:39:37
Hundeliebhaber
Vielen Dank, jetzt ist es eine Reihe mehr. Das sieht schon sehr gut aus.

EIne Sache ist mir allerdings noch aufgefallen:
Ich habe die Beispielmappe hochgeladen. d unf f müssten rechts unter e angehängt werden und nicht links unter dem d.

https://www.herber.de/bbs/user/158291.xlsm


Anzeige
AW: VBA Ebene in SmartArt Hierarchie zutun
16.03.2023 22:49:36
Rudi Maintaire
Hallo,
da muss noch dran gearbeitet werden. Aktuell müssen alle Ebenen gleich sein (A-F gefüllt).
Ich denke nochmal drüber nach.

Gruß
Rudi


nachgedacht
17.03.2023 11:53:04
Rudi Maintaire
Hallo,
teste mal:
Sub CreateTree()
  Dim w As Worksheet
  Dim arrStruktur As Variant
  Dim strNODE As String
  Dim i As Long, j As Long
  Dim objSMART As SmartArt
  Dim objNODE As SmartArtNode, oNode As SmartArtNode
  Dim tmp
  Dim objNodes As Object, oObjNodes
  Dim objStruktur() As Object, oObjStruktur
  
  Set w = ActiveSheet
  arrStruktur = w.Cells(1, 1).CurrentRegion.Value
  Set objSMART = w.Shapes("Diagram 1").SmartArt
  
  ReDim objStruktur(1 To UBound(arrStruktur, 2))
  
  For i = 1 To UBound(objStruktur)
    Set objStruktur(i) = CreateObject("scripting.dictionary")
  Next i
  Set objNodes = CreateObject("scripting.dictionary")
  
  For i = 2 To UBound(arrStruktur)
    tmp = ""
    For j = 1 To UBound(arrStruktur, 2)
      If arrStruktur(i, j) > "" Then
        tmp = tmp & "|" & arrStruktur(i, j)
        objStruktur(j)(tmp) = 0
      End If
    Next j
  Next i
  
  With objSMART
    Do While .Nodes.Count
      .Nodes(1).Delete
    Loop
  End With
  
  strNODE = "ROOT"
  
  Set oNode = objSMART.Nodes.Add
  oNode.TextFrame2.TextRange.Text = strNODE
  objNodes(oNode) = strNODE
  
  For Each oObjStruktur In objStruktur(1)
    Set objNODE = oNode.AddNode(msoSmartArtNodeBelow)
    objNODE.TextFrame2.TextRange.Text = Split(oObjStruktur, "|")(1)
    objNodes(objNODE) = oObjStruktur
  Next
  
  For j = 2 To UBound(objStruktur)
    For Each oObjStruktur In objStruktur(j)
      tmp = Split(oObjStruktur, "|")
      strNODE = tmp(UBound(tmp))
      ReDim Preserve tmp(UBound(tmp) - 1)
      tmp = Join(tmp, "|")
      If strNODE > "" Then
        For Each oObjNodes In objNodes
          If objNodes(oObjNodes) = tmp Then
            Set objNODE = oObjNodes.AddNode(msoSmartArtNodeBelow)
            objNODE.TextFrame2.TextRange.Text = strNODE
            objNodes(objNODE) = oObjStruktur
          End If
        Next
      End If
    Next oObjStruktur
  Next j
  
End Sub
Gruß
Rudi


Anzeige
AW: nachgedacht
17.03.2023 12:10:07
Hundeliebhaber
Hallo,
herzlichen und außerordentlichen Dank! Jetzt ist es wirklich perfekt. Man kann auch flexibel bei der Spaltenanzahl sein.

;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige