¿Cómo se crea un árbol padre-hijo con datos de tabla/excel?

Estoy usando el acceso para modelar una base de datos relacional. Tengo los siguientes datos en un formato de 2 columnas:

El resultado debería generar un diagrama de árbol/viñetas similar a este:

  • A
    • B
      • C
    • D
    • GRAMO
  • mi
    • F

http://www.stepblogging.com/how-to-create-parent-child-category-tree-using-php-mysqli/

Encontré algo similar en este hilo, pero Excel o MS Access deberían tener esta función integrada en alguna parte.

¿Cuál es la mejor solución de software para hacer este diagrama de árbol?

Además, ¿hay alguna manera de abstraer un diagrama de árbol en los datos de la tabla anterior (usando el formato básico .docx o markdown)?

hay una publicación aquí de stackoverflow discutiendo el algoritmo stackoverflow.com/questions/444296/…
respuesta semirelacionada en formato json stackoverflow.com/questions/17847131/…

Respuestas (2)

Resolví, quizás, un caso ligeramente diferente con la representación de árboles en las páginas de Confluence con el complemento https://bobswift.atlassian.net/wiki/display/GVIZ/Digraph+Macro que puede tomar una tabla como fuente.

¿Tienes una captura de pantalla de cómo se ve? Estoy leyendo el enlace de Graphwiz pero aún no tengo idea de cómo se hace.

Está bien, encontré la solución. funcionó para mí

Especifique la hoja que desea como "ENTRADA"

y la hoja de salida como "ESTRUCTURA DE NIVEL"

El formulario está en parent | child, por lo que si sus datos están al revés, simplemente intercambie columnas. Si es el nodo superior, póngalo rootcomo el nombre de parent.

de esa manera, cada celda en las columnas A, B tiene algún valor en ella

ejecutar excel vba

FUENTE: https://sites.google.com/a/madrocketscientist.com/jerrybeaucaires-excelassistant/text-functions/cascading-tree

Option Explicit

Sub TreeStructure()
'JBeaucaire  3/6/2010, 10/25/2011
'Create a flow tree from a two-column accountability table
Dim LR As Long, NR As Long, i As Long, Rws As Long
Dim TopRng As Range, TopR As Range, cell As Range
Dim wsTree As Worksheet, wsData As Worksheet
Application.ScreenUpdating = False

'Find top level value(s)
Set wsData = Sheets("Input")
  'create a unique list of column A values in column M
    wsData.Range("A:A").AdvancedFilter Action:=xlFilterCopy, _
         CopyToRange:=wsData.Range("M1"), Unique:=True

  'Find the ONE value in column M that reports to no one, the person at the top
    wsData.Range("N2", wsData.Range("M" & Rows.Count).End(xlUp) _
        .Offset(0, 1)).FormulaR1C1 = "=IF(COUNTIF(C2,RC13)=0,1,"""")"
    Set TopRng = wsData.Columns("N:N").SpecialCells(xlCellTypeFormulas, 1).Offset(0, -1)
  'last row of persons listed in data table
    LR = wsData.Range("A" & wsData.Rows.Count).End(xlUp).Row

'Setup table
    Set wsTree = Sheets("LEVEL STRUCTURE")
    With wsTree
        .Cells.Clear    'clear prior output
        NR = 3          'next row to start entering names

'Parse each run from the top level
    For Each TopR In TopRng         'loop through each unique column A name
        .Range("B" & NR) = TopR
        Set cell = .Cells(NR, .Columns.Count).End(xlToLeft)

        Do Until cell.Column = 1
          'filter data to show current leader only
            wsData.Range("A:A").AutoFilter Field:=1, Criteria1:=cell
        'see how many rows this person has in the table
            LR = wsData.Range("A" & Rows.Count).End(xlUp).Row
            If LR > 1 Then
              'count how many people report to this person
                Rws = Application.WorksheetFunction.Subtotal(103, wsData.Range("B:B")) - 1
              'insert that many blank rows below their name and insert the names
                cell.Offset(1, 1).Resize(Rws).EntireRow.Insert xlShiftDown
                wsData.Range("B2:B" & LR).Copy cell.Offset(1, 1)
              'add a left border if this is the start of a new "group"
                If .Cells(.Rows.Count, cell.Column + 1).End(xlUp).Address _
                    <> cell.Offset(1, 1).Address Then _
                       .Range(cell.Offset(1, 1), cell.Offset(1, 1).End(xlDown)) _
                          .Borders(xlEdgeLeft).Weight = xlThick
            End If

            NR = NR + 1     'increment to the next row to enter the next top leader name
            Set cell = .Cells(NR, .Columns.Count).End(xlToLeft)
        Loop
    Next TopR

  'find the last used column
    i = .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), _
        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
  'format the used data range
    With Union(.Range(.[B1], .Cells(1, i)), .Range("B:BB").SpecialCells(xlCellTypeConstants, 23))
        .Interior.ColorIndex = 5
        .Font.ColorIndex = 2
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
    .Range("B1").Interior.ColorIndex = 53
    .Range("B1").Value = "LEVEL 1"
    .Range("B1").AutoFill Destination:=.Range("B1", .Cells(1, i)), Type:=xlFillDefault
End With

wsData.AutoFilterMode = False
wsData.Range("M:N").ClearContents
wsTree.Activate
Application.ScreenUpdating = True
End Sub
Respuestas relacionadas en excel VBA stackoverflow.com/questions/9821545/…
respuesta relacionada también stackoverflow.com/questions/9821545/…