Obtener nombre de la tabla con VBA

Voy a configurar una macro para generar un gráfico. He grabado una macro mientras yo estaba generar el gráfico de ejemplo, pero ahora necesito tener la macro que trabajan de forma independiente desde el nombre de la tabla (Chart 9 en este caso)

Sheets("statistics").Select
Sheets("statistics").Range("A101:C106").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlColumnStacked
ActiveChart.SetSourceData Source:=Range("statistics!$A$101:$C$106")
ActiveChart.ChartArea.Select
ActiveSheet.Shapes("Chart 9").Name = "waterfall"
ActiveChart.Location Where:=xlLocationAsObject, Name:="summary"
ActiveSheet.ChartObjects("waterfall").Activate
ActiveSheet.Shapes("waterfall").IncrementLeft 80
ActiveSheet.Shapes("waterfall").IncrementTop -2200
ActiveSheet.ChartObjects("waterfall").Activate
ActiveSheet.Shapes("waterfall").ScaleWidth 1.6025463692, msoFalse, msoScaleFromTopLeft
ActiveSheet.Shapes("waterfall").ScaleHeight 1.6084106153, msoFalse, msoScaleFromTopLeft
ActiveSheet.ChartObjects("waterfall").Activate
ActiveChart.Legend.Select
Selection.Delete
ActiveSheet.ChartObjects("waterfall").Activate
ActiveChart.SeriesCollection(1).Select
Selection.Format.Fill.Visible = msoFalse
ActiveChart.SeriesCollection(2).Select
ActiveChart.SeriesCollection(2).Points(6).Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent3
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0
    .Solid
End With
ActiveChart.SeriesCollection(2).Points(1).Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent3
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0
    .Solid
End With
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent1
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0
    .Transparency = 0
    .Solid
End With
ActiveChart.SeriesCollection(2).Points(5).Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent1
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0
    .Solid
End With
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.RGB = RGB(255, 0, 0)
    .Transparency = 0
    .Solid
End With
ActiveChart.SetElement (msoElementDataLabelCenter)
ActiveChart.SeriesCollection(2).Points(1).Select
ActiveChart.ChartArea.Select
ActiveChart.ChartArea.Select
ActiveChart.SeriesCollection(2).Points(1).Select
ActiveChart.PlotArea.Select
ActiveChart.SeriesCollection(2).Select
ActiveChart.SetElement (msoElementDataLabelCenter)
ActiveChart.SetElement (msoElementPrimaryValueAxisTitleHorizontal)
Selection.Caption = "hrs"
ActiveChart.Axes(xlValue).AxisTitle.Select
Selection.Left = 7
Selection.Top = 13.028

He intentado

Sheets("statistics").Range("A101:C106").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlColumnStacked
ActiveChart.SetSourceData Source:=Range("statistics!$A$101:$C$106")
ActiveChart.ChartArea.Select
Set ThisChart = ActiveChart
ActiveSheet.Shapes(ThisChart).Name = "waterfall"

pero no es trabajo

  • Se va a crear solo 1 tabla por hoja o varios gráficos?
  • es para el usuario.

4 Kommentare

  1. 2

    Tratar el siguiente código, lo bucle a través de todos los ChartObjects en «estadísticas» de la hoja de cálculo, y si encuentra un chartobject con un nombre de «el Gráfico 9» que se cambie el nombre a «la cascada».

    Nota: usted podría utilizar un enfoque similar para crear el gráfico, sin la necesidad de utilizar Select, ActiveSheet y ActiveChart.

    Código

    Option Explicit
    
    Sub RenameExistingChart()
    
    Dim ChtObj As ChartObject
    
    For Each ChtObj In Worksheets("statistics").ChartObjects
        If ChtObj.Name = "Chart 9" Then
            ChtObj.Name = "waterfall"
        End If
    Next ChtObj
    
    End Sub

    Editar 1: crear la tabla con ChtObj:

    Set ChtObj = Worksheets("statistics").ChartObjects.Add(Left:=100, Top:=100, _
                                        Width:=100, Height:=100) ' <-- just default settings , modify later    
    With ChtObj
        .Chart.ChartType = xlColumnStacked
        .Chart.SetSourceData Source:=range("statistics!$A$101:$C$106")
        .Name = "waterfall"
    
        With .Chart.SeriesCollection(2).Format.Fill ' modify fill for series (2)
            .Visible = msoTrue
            .ForeColor.ObjectThemeColor = msoThemeColorAccent3
            .ForeColor.TintAndShade = 0
            .ForeColor.Brightness = 0
            .Solid
        End With
    
        .Chart.SeriesCollection(1).ApplyDataLabels ' add data lables to series (1)
    
    End With
    • tal vez mi pregunta no fue claro. Estoy editando para el propósito.
    • ¿qué estás tratando de hacer ? Supongo que no entienden lo que usted está tratando de lograr ?
    • Quiero que la macro para trabajar en el gráfico se crea, independientemente de su nombre
    • sí, ahora se crea la tabla, pero luego se mete el resto de la macro grabada, donde todos los ActiveChart fallar
    • ¿por qué quieres usar ActiveChart ?
    • Permítanos continuar esta discusión en el chat.
    • ver código editado en Editar > 1 para modificar más de la tabla de configuración, como la serie y datalabels

  2. 1

    Usted podría usar algo como esto:

    Sub ChartStuff()
    Dim cht As Shape
    Range("A101:A106").Select
    ActiveSheet.Shapes.AddChart.Select
    Set cht = ActiveSheet.Shapes(1)
    cht.Name = "waterfall"
    End Sub

    Espero que esto ayude!

    • ¿Qué pasa si hay más de una tabla por hoja?
  3. 1

    Tratar con los gráficos en VBA es un poco complicado.
    Cuando se utiliza Addchart, la Selección va a ser un ChartArea
    Un ChartArea es parte de una Tabla, la cual es parte de un ChartObject
    El nombre de un gráfico que se ve es en realidad el nombre de la ChartObject

    Puede hacer algo como esto:

    Range("A101:A106").Select
    ActiveSheet.Shapes.AddChart.Select
    
    Dim ca As ChartArea, ch As Chart, co As ChartObject
    Set ca = Selection 
    Set ch = ca.Parent
    ch.ChartType = xl3DColumn
    Set co = ch.Parent
    co.Name = "waterfall"
    Debug.Print ca.Name, ch.Name, co.Name
    • En realidad es muy fácil obtener una referencia a la tabla directamente: Set ch = ActiveSheet.Shapes.AddChart.Chart
    • Estás en lo correcto. Es confuso que el valor de retorno es un Chart mientras que la Selección es un ChartArea
  4. 0

    Crear una función que llama desde dentro de la sub, que envía el nombre de el gráfico activo, por ejemplo:

    Function actchart(ActiveChart As String) As String
      actchart = ActiveChart
    End Function

    Y, a continuación, desde dentro de su sub, se puede reemplazar, como un ejemplo, donde se tiene:

    ActiveSheet.Shapes("Chart 9").Name = "waterfall" 

    con

    ActiveSheet.Shapes(actchart(ActiveChart.Parent.Name)).Name = "waterfall"

    Esto funcionó para mí con el mismo problema! Espero que ayude.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea