Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1924to1928
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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


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


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.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige