Estoy buscando formatear varios gráficos seleccionados en Excel 2010 usando VBA. El código siguiente funciona cuando solo se selecciona un gráfico, pero cuando se seleccionan varios gráficos, aparece un "error en tiempo de ejecución '91' Variable de objeto o Con variable de bloque no establecida". ¿Alguna idea de cómo ejecutar la macro para una cantidad de gráficos seleccionados ?

Sub ChartFormat5_Click()


''Adjust chart area

'Size
Selection.Width = 631.9
Selection.Height = 290.1

'Border
With Selection.Format.Line
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorText1
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0
    .Transparency = 0
    .Weight = 1
    .DashStyle = msoLineSolid
End With

'Font
With Selection.Format.TextFrame2.TextRange.Font
    .Name = "Calibri"
    .Size = 10
    .Fill.Visible = msoTrue
    .Fill.ForeColor.ObjectThemeColor = msoThemeColorText1
    .Fill.ForeColor.TintAndShade = 0
    .Fill.ForeColor.Brightness = 0
    .Fill.Transparency = 0
    .Fill.Solid
End With


End Sub

¡Gracias!

0
JKo_FinanceUse 28 ene. 2016 a las 19:12

3 respuestas

La mejor respuesta

Esto procesará el gráfico activo o todos los gráficos seleccionados. La primera rutina determina qué procesar (gráfico activo o gráficos seleccionados) y la segunda procesa cada uno.

Sub FormatCharts()
  Dim obj As Object

  If Not ActiveChart Is Nothing Then
    FormatOneChart ActiveChart
  Else
    For Each obj In Selection
      If TypeName(obj) = "ChartObject" Then
        FormatOneChart obj.Chart
      End If
    Next
  End If
End Sub

Sub FormatOneChart(cht As Chart)
  ' do all your formatting here, based on cht not on ActiveChart
End Sub

No seleccione partes del gráfico, solo haga referencia a ellas por completo. En vez de

ActiveChart.ChartArea.Select
With Selection.Format.Line

Utilizar este

With cht.ChartArea.Format.Line

Etcetera.

Nota: este es un duplicado de VBA: formateo de varios gráficos seleccionados (Gráfico, Gráfico, Leyenda, etc.)

1
Community 23 may. 2017 a las 12:07

Intenta:

Sub ChartFormat5_Click_v02()

  For i = 1 To Application.Sheets.Count

    Application.Sheets(i).Activate

    For j = 1 To ActiveSheet.ChartObjects.Count

        ActiveSheet.ChartObjects(j).Activate


        'your code here

    Next j

  Next i

End Sub
0
Andre Turina 28 ene. 2016 a las 17:46

Después de un poco de prueba y error, descubrí cómo hacer que funcione si solo tiene uno o varios gráficos seleccionados. Fue sencillo, pero funcionó cuando lo probé.

Tenga en cuenta que rompí el formato real del área del gráfico en un sub.

Sub ChartFormat5_Click()

    Select Case TypeName(Selection)

        Case Is = "ChartArea" `only 1 selected

            FormatChart Selection

        Case Is = "DrawingObjects" 'more than 1 selected

            Dim cht As ChartObject
            For Each cht In Selection
                FormatChart cht.Chart.ChartArea
            Next

    End Select

End Sub

Sub FormatChart(chtArea As ChartArea)

With chtArea

    'size
    .Width = 631.9
    .Height = 290.1

    With .Format
        'Border
        With .Line
            .Visible = msoTrue
            .ForeColor.ObjectThemeColor = msoThemeColorText1
            .ForeColor.TintAndShade = 0
            .ForeColor.Brightness = 0
            .Transparency = 0
            .Weight = 1
            .DashStyle = msoLineSolid
        End With

        'Font
        With .TextFrame2.TextRange.Font
            .Name = "Calibri"
            .Size = 10
            With .Fill
                .Visible = msoTrue
                With .ForeColor
                    .ObjectThemeColor = msoThemeColorText1
                    .TintAndShade = 0
                    .Brightness = 0
                End With
                .Transparency = 0
                .Solid
            End With
        End With
    End With
End With

End Sub
1
Scott Holtzman 28 ene. 2016 a las 20:15