Guía definitiva: VBA para cuadros y gráficos en Excel (más de 100 ejemplos)
Los cuadros y gráficos son una de las mejores características de Excel; son muy flexibles y se pueden utilizar para realizar visualizaciones muy avanzadas. Sin embargo, esta flexibilidad significa que hay cientos de opciones diferentes. Podemos crear exactamente la visualización que queremos, pero su aplicación puede llevar mucho tiempo. Cuando queremos aplicar esos cientos de configuraciones a muchos gráficos, puede llevar horas y horas. de clics frustrantes. Esta publicación es una guía para usar VBA para cuadros y gráficos en Excel.
Tabla de contenido
- Adaptando el código a sus necesidades
- Comprender el modelo de objetos del documento
- Objetos de gráficos frente a gráficos frente a hojas de gráficos
- Escribir código para trabajar en cualquier tipo de gráfico
- Ejemplos de código VBA
- Insertar gráficos
- Cuadros de referencia en una hoja de trabajo.
- Hojas de gráficos de referencia
- Configuración básica del gráfico
- Eje del gráfico
- Líneas de cuadrícula
- Titulo del gráfico
- Leyenda del gráfico
- Área de parcela
- Serie de gráficos
- Etiquetas de datos
- Barras de error
- Puntos de datos
- Otras macros de gráficos útiles
- Hacer que el gráfico cubra el rango de celdas
- Exportar el gráfico como una imagen
- Cambiar el tamaño de todos los gráficos al mismo tamaño que el gráfico activo
- Reuniéndolo todo
- Uso de Macro Recorder para VBA para cuadros y gráficos
- Conclusión
Los ejemplos de código siguientes demuestran algunas de las opciones de gráficos más comunes con VBA. Con suerte, podrá darles un buen uso y automatizar la creación y modificación de sus gráficos.
Si bien puede resultar tentador pasar directamente a la sección que necesita, le recomiendo que lea la primera sección en su totalidad. Comprender el modelo de objetos de documento (DOM) es esencial para comprender cómo se puede utilizar VBA con cuadros y gráficos en Excel.
En Excel 2013, se introdujeron muchos cambios en el motor de gráficos y en el modelo de objetos de documento. Por ejemplo, el método AddChart2 reemplazó al método AddChart. Como resultado, es posible que parte del código presentado en esta publicación no funcione con versiones anteriores a Excel 2013.
Adaptando el código a sus necesidades
No es factible proporcionar código para cada escenario con el que te puedas encontrar; hay demasiados, pero, al aplicar los principios y métodos de esta publicación, podrá hacer casi cualquier cosa que desee con gráficos en Excel usando VBA.
Comprender el modelo de objetos del documento
El modelo de objetos de documento (DOM) es un término que describe cómo se estructuran las cosas en Excel. Por ejemplo:
- Un libro de trabajo contiene hojas
- Una hoja contiene rangos
- Una gama contiene un interior
- Un interior contiene una configuración de color.
Por lo tanto, para cambiar el color de una celda a rojo, haríamos referencia a esto de la siguiente manera:
ActiveWorkbook.Sheets("Sheet1").Range("A1").Interior.Color = RGB(255, 0, 0)
Los gráficos también son parte del DOM y siguen principios jerárquicos similares. Para cambiar la altura del Gráfico 1, en la Hoja 1, podríamos usar lo siguiente.
ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 1").Height = 300
Cada elemento de la jerarquía de objetos debe enumerarse y separarse por un punto ( . ).
Conocer el modelo de objetos del documento es la clave del éxito con los gráficos VBA. Por tanto, necesitamos conocer el orden correcto dentro del modelo de objetos. Si bien el siguiente código puede parecer aceptable, no funcionará.
ActiveWorkbook.ChartObjects("Chart 1").Height = 300
En el DOM, ActiveWorkbook no contiene ChartObjects, por lo que Excel no puede encontrar el Gráfico 1. El padre de un ChartObject es una hoja y el padre de una hoja es un libro de trabajo. Debemos incluir la hoja en la jerarquía para que Excel sepa qué quieres hacer.
ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 1").Height = 300
Con este conocimiento, podemos hacer referencia a cualquier elemento de cualquier gráfico utilizando el DOM de Excel.
Objetos de gráficos frente a gráficos frente a hojas de gráficos
Una de las cosas que complica el DOM para los gráficos es que existen muchas cosas en muchos lugares. Por ejemplo, un gráfico puede ser un gráfico incrustado en el frente de una hoja de trabajo o como una hoja de gráfico separada.
- En la propia hoja de trabajo, encontramos ChartObjects. Dentro de cada ChartObject hay un Chart. Efectivamente, un ChartObject es un contenedor que contiene un Chart.
- Un gráfico también es una hoja independiente que no tiene un ChartObject a su alrededor.
Esto puede parecer confuso al principio, pero hay buenas razones para ello.
Para cambiar el texto del título del gráfico, haríamos referencia a los dos tipos de gráfico de manera diferente:
- Gráfico en una hoja de trabajo:
Hojas(“Hoja1”).ChartObjects(“Gráfico 1”).Chart .ChartTitle.Text = “Título de mi gráfico” - Hoja de gráfico:
Hojas (“Gráfico 1”). ChartTitle.Text = "Título de mi gráfico"
Las secciones en negrita son exactamente iguales. Esto muestra que una vez que hemos entrado en el Gráfico, el DOM es el mismo.
Escribir código para trabajar en cualquier tipo de gráfico
Queremos escribir código que funcione en cualquier gráfico; Hacemos esto creando una variable que contiene la referencia a un gráfico.
Cree una variable para hacer referencia a un gráfico dentro de un ChartObject:
Dim cht As ChartSet cht = Sheets("Sheet1").ChartObjects("Chart 1").Chart
Cree una variable para hacer referencia a un gráfico que es una hoja:
Dim cht As ChartSet cht = Sheets("Chart 1")
Ahora podemos escribir código VBA para una hoja de gráfico o un gráfico dentro de un ChartObject haciendo referencia al gráfico usando cht:
cht.ChartTitle.Text = "My Chart Title"
Bien, ahora hemos establecido cómo hacer referencia a los gráficos y hemos cubierto brevemente cómo funciona el DOM. Es hora de ver muchos ejemplos de código.
Ejemplos de código VBA
Insertar gráficos
En esta primera sección, creamos gráficos. Tenga en cuenta que algunas de las líneas de código individuales se incluyen a continuación en sus secciones relevantes.
Crear un gráfico a partir de un gráfico en blanco
Sub CreateChart()'Declare variablesDim rng As RangeDim cht As Object'Create a blank chart Set cht = ActiveSheet.Shapes.AddChart2'Declare the data range for the chart Set rng = ActiveSheet.Range("A2:B9")'Add the data to the chart cht.Chart.SetSourceData Source:=rng'Set the chart type cht.Chart.ChartType = xlColumnClusteredEnd Sub
Cuadros de referencia en una hoja de trabajo.
En esta sección, analizamos los métodos utilizados para hacer referencia a un gráfico contenido en una hoja de trabajo.
Gráfico activo
Cree una variable de gráfico para contener ActiveChart:
Dim cht As ChartSet cht = ActiveChart
Objeto de gráfico por nombre
Cree una variable de gráfico para contener un gráfico específico por nombre.
Dim cht As ChartSet cht = Sheets("Sheet1").ChartObjects("Chart 1").Chart
Objeto gráfico por número
Si hay varios gráficos en una hoja de trabajo, se puede hacer referencia a ellos por su número:
- 1 = el primer gráfico creado
- 2 = el segundo gráfico creado
- etcétera etcétera.
Dim cht As ChartSet cht = Sheets("Sheet1").ChartObjects(1).Chart
Recorrer todos los objetos del gráfico
Si hay varios ChartObjects en una hoja de trabajo, podemos recorrer cada uno de ellos:
Dim chtObj As ChartObjectFor Each chtObj In Sheets("Sheet1").ChartObjects 'Include the code to be applied to each ChartObjects 'refer to the Chart using chtObj.cht.Next chtObj
Recorre todos los objetos de gráfico seleccionados
Si solo queremos recorrer los ChartObjects seleccionados, podemos usar el siguiente código.
Este código es complicado de aplicar ya que Excel funciona de manera diferente cuando se selecciona un gráfico, en comparación con varios gráficos. Por lo tanto, como forma de aplicar la configuración del gráfico, sin la necesidad de repetir mucho código, recomiendo llamar a otra macro y pasar el Gráfico como argumento para esa macro.
Dim obj As Object'Check if any charts have been selectedIf Not ActiveChart Is Nothing Then Call AnotherMacro(ActiveChart)Else For Each obj In Selection 'If more than one chart selected If TypeName(obj) = "ChartObject" Then Call AnotherMacro(obj.Chart) End IfNextEnd If
Hojas de gráficos de referencia
Ahora pasemos a ver los métodos utilizados para hacer referencia a una hoja de gráfico independiente.
Gráfico activo
Configure una variable de gráfico para contener ActiveChart:
Dim cht As ChartSet cht = ActiveChart
Nota: este es el mismo código que cuando se hace referencia al gráfico activo en la hoja de trabajo.
Hoja de gráfico por nombre
Configurar una variable de gráfico para contener una hoja de gráfico específica
Dim cht As Chart Set cht = Sheets("Chart 1")
Recorrer todas las hojas de gráficos de un libro de trabajo
El siguiente código recorrerá todas las hojas de gráficos del libro activo.
Dim cht As ChartFor Each cht In ActiveWorkbook.Charts Call AnotherMacro(cht)Next cht
Configuración básica del gráfico
Esta sección contiene configuraciones básicas de gráficos.
Todos los códigos comienzan con cht. , ya que suponen que se ha hecho referencia a un gráfico utilizando los códigos anteriores.
Cambiar tipo de gráfico
'Change chart type - these are common examples, others do exist.cht.ChartType = xlAreacht.ChartType = xlLinecht.ChartType = xlPiecht.ChartType = xlColumnClusteredcht.ChartType = xlColumnStackedcht.ChartType = xlColumnStacked100cht.ChartType = xlAreacht.ChartType = xlAreaStackedcht.ChartType = xlBarClusteredcht.ChartType = xlBarStackedcht.ChartType = xlBarStacked100
Cree un ChartObject vacío en una hoja de trabajo
'Create an empty chart embedded on a worksheet.Set cht = Sheets("Sheet1").Shapes.AddChart2.Chart
Seleccione la fuente de un gráfico
'Select source for a chartDim rng As RangeSet rng = Sheets("Sheet1").Range("A1:B4")cht.SetSourceData Source:=rng
Eliminar un objeto de gráfico o una hoja de gráfico
'Delete a ChartObject or Chart sheetIf TypeName(cht.Parent) = "ChartObject" Then cht.Parent.DeleteElseIf TypeName(cht.Parent) = "Workbook" Then cht.DeleteEnd If
Cambiar el tamaño o la posición de un gráfico
'Set the size/position of a ChartObject - method 1cht.Parent.Height = 200cht.Parent.Width = 300cht.Parent.Left = 20cht.Parent.Top = 20'Set the size/position of a ChartObject - method 2chtObj.Height = 200chtObj.Width = 300chtObj.Left = 20chtObj.Top = 20
Cambiar la configuración de las celdas visibles
'Change the setting to show only visible cellscht.PlotVisibleOnly = False
Cambiar el espacio entre columnas/barras (ancho del espacio)
'Change the gap space between barscht.ChartGroups(1).GapWidth = 50
Cambiar la superposición de columnas/barras
'Change the overlap setting of barscht.ChartGroups(1).Overlap = 75
Eliminar el borde exterior del objeto del gráfico
'Remove the outside border from a chartcht.ChartArea.Format.Line.Visible = msoFalse
Cambiar el color del fondo del gráfico
'Set the fill color of the chart areacht.ChartArea.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)'Set chart with no background colorcht.ChartArea.Format.Fill.Visible = msoFalse
Eje del gráfico
Los gráficos tienen cuatro ejes:
- xlValor
- xlValor, xlSecundario
- xlCategoría
- xlCategoría, xlSecundario
Estos se utilizan indistintamente en los ejemplos siguientes. Para adaptar el código a sus requisitos específicos, debe cambiar el eje del gráfico al que se hace referencia entre paréntesis.
Todos los códigos comienzan con cht. , ya que suponen que se ha hecho referencia a un gráfico utilizando los códigos anteriores en esta publicación.
Establecer mínimo y máximo del eje del gráfico
'Set chart axis min and maxcht.Axes(xlValue).MaximumScale = 25cht.Axes(xlValue).MinimumScale = 10cht.Axes(xlValue).MaximumScaleIsAuto = Truecht.Axes(xlValue).MinimumScaleIsAuto = True
Mostrar u ocultar el eje del gráfico
'Display axischt.HasAxis(xlCategory) = True'Hide axischt.HasAxis(xlValue, xlSecondary) = False
Mostrar u ocultar el título del gráfico
'Display axis titlecht.Axes(xlCategory, xlSecondary).HasTitle = True'Hide axis titlecht.Axes(xlValue).HasTitle = False
Cambiar el texto del título del eje del gráfico
'Change axis title textcht.Axes(xlCategory).AxisTitle.Text = "My Axis Title"
Invertir el orden de un eje de categorías
'Reverse the order of a catetory axischt.Axes(xlCategory).ReversePlotOrder = True'Set category axis to default ordercht.Axes(xlCategory).ReversePlotOrder = False
Líneas de cuadrícula
Las líneas de cuadrícula ayudan al usuario a ver la posición relativa de un elemento en comparación con el eje.
Agregar o eliminar líneas de cuadrícula
'Add gridlinescht.SetElement (msoElementPrimaryValueGridLinesMajor)cht.SetElement (msoElementPrimaryCategoryGridLinesMajor)cht.SetElement (msoElementPrimaryValueGridLinesMinorMajor)cht.SetElement (msoElementPrimaryCategoryGridLinesMinorMajor)'Delete gridlinescht.Axes(xlValue).MajorGridlines.Deletecht.Axes(xlValue).MinorGridlines.Deletecht.Axes(xlCategory).MajorGridlines.Deletecht.Axes(xlCategory).MinorGridlines.Delete
Cambiar el color de las líneas de cuadrícula
'Change colour of gridlinescht.Axes(xlValue).MajorGridlines.Format.Line.ForeColor.RGB = RGB(255, 0, 0)
Cambiar la transparencia de las líneas de cuadrícula
'Change transparency of gridlinescht.Axes(xlValue).MajorGridlines.Format.Line.Transparency = 0.5
Titulo del gráfico
El título del gráfico es el texto en la parte superior del gráfico.
Todos los códigos comienzan con cht. , ya que suponen que se ha hecho referencia a un gráfico utilizando los códigos anteriores en esta publicación.
Mostrar u ocultar el título del gráfico
'Display chart titlecht.HasTitle = True'Hide chart titlecht.HasTitle = False
Cambiar el texto del título del gráfico
'Change chart title textcht.ChartTitle.Text = "My Chart Title"
Colocar el título del gráfico
'Position the chart titlecht.ChartTitle.Left = 10cht.ChartTitle.Top = 10
Dar formato al título del gráfico
'Format the chart titlecht.ChartTitle.TextFrame2.TextRange.Font.Name = "Calibri"cht.ChartTitle.TextFrame2.TextRange.Font.Size = 16cht.ChartTitle.TextFrame2.TextRange.Font.Bold = msoTruecht.ChartTitle.TextFrame2.TextRange.Font.Bold = msoFalsecht.ChartTitle.TextFrame2.TextRange.Font.Italic = msoTruecht.ChartTitle.TextFrame2.TextRange.Font.Italic = msoFalse
Leyenda del gráfico
La leyenda del gráfico proporciona una clave de color para identificar cada serie del gráfico.
Mostrar u ocultar la leyenda del gráfico
'Display the legendcht.HasLegend = True'Hide the legendcht.HasLegend = False
Colocar la leyenda
'Position the legendcht.Legend.Position = xlLegendPositionTopcht.Legend.Position = xlLegendPositionRightcht.Legend.Position = xlLegendPositionLeftcht.Legend.Position = xlLegendPositionCornercht.Legend.Position = xlLegendPositionBottom'Allow legend to overlap the chart.'False = allow overlap, True = due not overlapcht.Legend.IncludeInLayout = Falsecht.Legend.IncludeInLayout = True'Move legend to a specific pointcht.Legend.Left = 20cht.Legend.Top = 200cht.Legend.Width = 100cht.Legend.Height = 25
Área de parcela
El área de trazado es el cuerpo principal del gráfico que contiene líneas, barras, áreas, burbujas, etc.
Todos los códigos comienzan con cht. , ya que suponen que se ha hecho referencia a un gráfico utilizando los códigos anteriores en esta publicación.
Color de fondo del área de trazado
'Set background color of the plot areacht.PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)'Set plot area to no background colorcht.PlotArea.Format.Fill.Visible = msoFalse
Establecer la posición del área de trazado
'Set the size and position of the PlotArea. Top and Left are relative to the Chart Area.cht.PlotArea.Left = 20cht.PlotArea.Top = 20cht.PlotArea.Width = 200cht.PlotArea.Height = 150
Serie de gráficos
Las series de gráficos son las líneas, barras y áreas individuales de cada categoría.
Todos los códigos que comienzan con srs . suponga que la serie de un gráfico ha sido asignada a una variable.
Agregar una nueva serie de gráficos
'Add a new chart seriesSet srs = cht.SeriesCollection.NewSeriessrs.Values = "=Sheet1!$C$2:$C$6"srs.Name = "=""New Series"""'Set the values for the X axis when using XY Scattersrs.XValues = "=Sheet1!$D$2:$D$6"
Hacer referencia a una serie de gráficos
Configure una variable de Serie para contener una serie de gráficos:
- 1 = Primera serie de gráficos
- 2 = Segunda serie de gráficos
- etcétera etcétera.
Dim srs As SeriesSet srs = cht.SeriesCollection(1)
Hacer referencia a una serie de gráficos por nombre
Dim srs As SeriesSet srs = cht.SeriesCollection("Series Name")
Eliminar una serie de gráficos
'Delete chart seriessrs.Delete
Recorre cada serie de gráficos
Dim srs As SeriesFor Each srs In cht.SeriesCollection 'Do something to each series 'See the codes below starting with "srs."Next srs
Cambiar datos de serie
'Change series source data and namesrs.Values = "=Sheet1!$C$2:$C$6"srs.Name = "=""Change Series Name"""
Cambiar colores de relleno o línea
'Change fill coloursrs.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)'Change line coloursrs.Format.Line.ForeColor.RGB = RGB(255, 0, 0)
Cambiando la visibilidad
'Change visibility of linesrs.Format.Line.Visible = msoTrue
Cambiar el grosor de la línea
'Change line weightsrs.Format.Line.Weight = 10
Cambiar estilo de línea
'Change line stylesrs.Format.Line.DashStyle = msoLineDashsrs.Format.Line.DashStyle = msoLineSolidsrs.Format.Line.DashStyle = msoLineSysDotsrs.Format.Line.DashStyle = msoLineSysDashsrs.Format.Line.DashStyle = msoLineDashDotsrs.Format.Line.DashStyle = msoLineLongDashsrs.Format.Line.DashStyle = msoLineLongDashDotsrs.Format.Line.DashStyle = msoLineLongDashDotDot
Marcadores de formato
'Changer marker typesrs.MarkerStyle = xlMarkerStyleAutomaticsrs.MarkerStyle = xlMarkerStyleCirclesrs.MarkerStyle = xlMarkerStyleDashsrs.MarkerStyle = xlMarkerStyleDiamondsrs.MarkerStyle = xlMarkerStyleDotsrs.MarkerStyle = xlMarkerStyleNone'Change marker border colorsrs.MarkerForegroundColor = RGB(255, 0, 0)'Change marker fill colorsrs.MarkerBackgroundColor = RGB(255, 0, 0)'Change marker sizesrs.MarkerSize = 8
Etiquetas de datos
Las etiquetas de datos muestran información adicional (como el valor o el nombre de la serie) sobre un punto de datos en una serie de gráficos.
Todos los códigos que comienzan con srs . suponga que la serie de un gráfico ha sido asignada a una variable.
Mostrar u ocultar etiquetas de datos
'Display data labels on all points in the seriessrs.HasDataLabels = True'Hide data labels on all points in the seriessrs.HasDataLabels = False
Cambiar la posición de las etiquetas de datos
'Position data labels'The label position must be a valid option for the chart type.srs.DataLabels.Position = xlLabelPositionAbovesrs.DataLabels.Position = xlLabelPositionBelowsrs.DataLabels.Position = xlLabelPositionLeftsrs.DataLabels.Position = xlLabelPositionRightsrs.DataLabels.Position = xlLabelPositionCentersrs.DataLabels.Position = xlLabelPositionInsideEndsrs.DataLabels.Position = xlLabelPositionInsideBasesrs.DataLabels.Position = xlLabelPositionOutsideEnd
Barras de error
Originalmente, las barras de error estaban destinadas a mostrar la variación (por ejemplo, valores mínimos y máximos) en un valor. Sin embargo, también se utilizan habitualmente en técnicas de gráficos avanzadas para crear elementos visuales adicionales.
Todos los códigos que comienzan con srs . suponga que la serie de un gráfico ha sido asignada a una variable.
Activar/desactivar las barras de error
'Turn error bars on/offsrs.HasErrorBars = Truesrs.HasErrorBars = False
Estilo de tapa del extremo de la barra de error
'Change end style of error barsrs.ErrorBars.EndStyle = xlNoCapsrs.ErrorBars.EndStyle = xlCap
Color de la barra de errores
'Change color of error barssrs.ErrorBars.Format.Line.ForeColor.RGB = RGB(255, 0, 0)
Grosor de la barra de error
'Change thickness of error barssrs.ErrorBars.Format.Line.Weight = 5
Configuración de dirección de la barra de error
'Error bar settingssrs.ErrorBar Direction:=xlY, _ Include:=xlPlusValues, _ Type:=xlFixedValue, _ Amount:=100'Alternatives options for the error bar settings are'Direction:=xlX'Include:=xlMinusValues'Include:=xlPlusValues'Include:=xlBoth'Type:=xlFixedValue'Type:=xlPercent'Type:=xlStDev'Type:=xlStError'Type:=xlCustom'Applying custom values to error barssrs.ErrorBar Direction:=xlY, _ Include:=xlPlusValues, _ Type:=xlCustom, _ Amount:="=Sheet1!$A$2:$A$7", _ MinusValues:="=Sheet1!$A$2:$A$7"
Puntos de datos
Cada punto de datos en una serie de gráficos se conoce como Punto.
Hacer referencia a un punto específico
El siguiente código hará referencia al primer punto.
1 = Primera serie de gráficos
2 = Segunda serie de gráficos
, etc., etc.
Dim srs As Series Dim pnt As PointSet srs = cht.SeriesCollection(1)Set pnt = srs.Points(1)
Recorre todos los puntos
Dim srs As Series Dim pnt As PointSet srs = cht.SeriesCollection(1)For Each pnt In srs.Points 'Do something to each point, using "pnt."Next pnt
Códigos VBA de ejemplo de puntos
Los puntos tienen propiedades similares a las Series, pero las propiedades se aplican a un único punto de datos de la serie en lugar de a toda la serie. Vea algunos ejemplos a continuación, solo para darle una idea.
Activar etiqueta de datos para un punto
'Turn on data label pnt.HasDataLabel = True
Establecer la posición de la etiqueta de datos para un punto
'Set the position of a data labelpnt.DataLabel.Position = xlLabelPositionCenter
Otras macros de gráficos útiles
En esta sección, he incluido otras macros de gráficos útiles que no están cubiertas por los códigos de ejemplo anteriores.
Hacer que el gráfico cubra el rango de celdas
El siguiente código cambia la ubicación y el tamaño del gráfico activo para que se ajuste directamente al rango G4:N20
Sub FitChartToRange()'Declare variablesDim cht As ChartDim rng As Range'Assign objects to variablesSet cht = ActiveChartSet rng = ActiveSheet.Range("G4:N20")'Move and resize chartcht.Parent.Left = rng.Leftcht.Parent.Top = rng.Topcht.Parent.Width = rng.Widthcht.Parent.Height = rng.HeightEnd Sub
Exportar el gráfico como una imagen
El siguiente código guarda el gráfico activo en una imagen en la ubicación predefinida
Sub ExportSingleChartAsImage()'Create a variable to hold the path and name of imageDim imagePath As StringDim cht As ChartimagePath = "C:UsersmarksDocumentsmyImage.webp"Set cht = ActiveChart'Export the chartcht.Export (imagePath)End Sub
Cambiar el tamaño de todos los gráficos al mismo tamaño que el gráfico activo
El siguiente código cambia el tamaño de todos los gráficos en la hoja activa para que tengan el mismo tamaño que el gráfico activo.
Sub ResizeAllCharts()'Create variables to hold chart dimensionsDim chtHeight As LongDim chtWidth As Long'Create variable to loop through chart objectsDim chtObj As ChartObject'Get the size of the first selected chartchtHeight = ActiveChart.Parent.HeightchtWidth = ActiveChart.Parent.WidthFor Each chtObj In ActiveSheet.ChartObjects chtObj.Height = chtHeight chtObj.Width = chtWidthNext chtObjEnd Sub
Reuniéndolo todo
Solo para demostrar cómo podemos usar estos fragmentos de código, he creado una macro para crear gráficos con viñetas.
Esta no es necesariamente la forma más eficiente de escribir el código, pero sirve para demostrar que al comprender el código anterior podemos crear muchos gráficos.
Los datos se ven así:
El gráfico se ve así:
El código que logra esto es el siguiente:
Sub CreateBulletChart()Dim cht As ChartDim srs As SeriesDim rng As Range'Create an empty chartSet cht = Sheets("Sheet3").Shapes.AddChart2.Chart'Change chart title textcht.ChartTitle.Text = "Bullet Chart with VBA"'Hide the legendcht.HasLegend = False'Change chart typecht.ChartType = xlBarClustered'Select source for a chartSet rng = Sheets("Sheet3").Range("A1:D4")cht.SetSourceData Source:=rng'Reverse the order of a catetory axischt.Axes(xlCategory).ReversePlotOrder = True'Change the overlap setting of barscht.ChartGroups(1).Overlap = 100'Change the gap space between barscht.ChartGroups(1).GapWidth = 50'Change fill colourSet srs = cht.SeriesCollection(1)srs.Format.Fill.ForeColor.RGB = RGB(200, 200, 200)Set srs = cht.SeriesCollection(2)srs.Format.Fill.ForeColor.RGB = RGB(150, 150, 150)Set srs = cht.SeriesCollection(3)srs.Format.Fill.ForeColor.RGB = RGB(100, 100, 100)'Add a new chart seriesSet srs = cht.SeriesCollection.NewSeriessrs.Values = "=Sheet3!$B$7:$D$7"srs.XValues = "=Sheet3!$B$5:$D$5"srs.Name = "=""Actual"""'Change chart typesrs.ChartType = xlXYScatter'Turn error bars on/offsrs.HasErrorBars = True'Change end style of error barsrs.ErrorBars.EndStyle = xlNoCap'Set the error barssrs.ErrorBar Direction:=xlY, _ Include:=xlNone, _ Type:=xlErrorBarTypeCustomsrs.ErrorBar Direction:=xlX, _ Include:=xlMinusValues, _ Type:=xlPercent, _ Amount:=100'Change color of error barssrs.ErrorBars.Format.Line.ForeColor.RGB = RGB(0, 0, 0)'Change thickness of error barssrs.ErrorBars.Format.Line.Weight = 14'Change marker typesrs.MarkerStyle = xlMarkerStyleNone'Add a new chart seriesSet srs = cht.SeriesCollection.NewSeriessrs.Values = "=Sheet3!$B$7:$D$7"srs.XValues = "=Sheet3!$B$6:$D$6"srs.Name = "=""Target"""'Change chart typesrs.ChartType = xlXYScatter'Turn error bars on/offsrs.HasErrorBars = True'Change end style of error barsrs.ErrorBars.EndStyle = xlNoCapsrs.ErrorBar Direction:=xlX, _ Include:=xlNone, _ Type:=xlErrorBarTypeCustomsrs.ErrorBar Direction:=xlY, _ Include:=xlBoth, _ Type:=xlFixedValue, _ Amount:=0.45'Change color of error barssrs.ErrorBars.Format.Line.ForeColor.RGB = RGB(255, 0, 0)'Change thickness of error barssrs.ErrorBars.Format.Line.Weight = 2'Changer marker typesrs.MarkerStyle = xlMarkerStyleNone'Set chart axis min and maxcht.Axes(xlValue, xlSecondary).MaximumScale = cht.SeriesCollection(1).Points.Countcht.Axes(xlValue, xlSecondary).MinimumScale = 0'Hide axischt.HasAxis(xlValue, xlSecondary) = FalseEnd Sub
Uso de Macro Recorder para VBA para cuadros y gráficos
Macro Recorder es una de las herramientas más útiles para escribir gráficos VBA para Excel. El DOM es tan amplio que puede resultar complicado saber cómo hacer referencia a un objeto, propiedad o método específico. Estudiar el código producido por Macro Recorder proporcione las partes del DOM que no conoce.
Como nota, Macro Recorder crea código mal construido; selecciona cada objeto antes de manipularlo (después de todo, esto es lo que hacías con el mouse). Pero esto está bien para nosotros. Una vez que entendemos el DOM, podemos tomar solo las partes del código que necesitamos y asegurarnos de colocarlas en la parte derecha de la jerarquía.
Conclusión
Como ha visto en esta publicación, el modelo de objetos de documento para cuadros y gráficos en Excel es amplio (y solo hemos arañado la superficie).
Espero que a través de todos los ejemplos de esta publicación comprenda mejor VBA para cuadros y gráficos en Excel. Con este conocimiento, estoy seguro de que podrá automatizar la creación y modificación de sus gráficos.
¿Me he perdido algún código útil? Si es así déjalos en los comentarios.
¿Busca otras guías detalladas de VBA? Mira estas publicaciones:
- VBA para objetos de lista de tablas
- VBA para tablas dinámicas
Deja una respuesta