excel-vba
Gráficos y gráficos
Buscar..
Creando un gráfico con rangos y un nombre fijo
Los gráficos se pueden crear trabajando directamente con el objeto Series
que define los datos del gráfico. Para llegar a la Series
sin un gráfico existente, crea un objeto ChartObject
en una ChartObject
de Worksheet
determinada y luego obtiene el objeto Chart
de la misma. La ventaja de trabajar con el objeto Series
es que puede establecer los Values
y Values
XValues
consultando los objetos de Range
. Estas propiedades de datos definirán correctamente la Series
con referencias a esos rangos. La desventaja de este enfoque es que la misma conversión no se maneja al configurar el Name
; Es un valor fijo. No se ajustará con los datos subyacentes en el Range
original. Verificando la fórmula SERIES
y es obvio que el nombre es fijo. Esto debe ser manejado creando la fórmula SERIES
directamente.
Código utilizado para crear el gráfico
Tenga en cuenta que este código contiene declaraciones de variables adicionales para el Chart
y la Worksheet
. Estos pueden omitirse si no se utilizan. Sin embargo, pueden ser útiles si está modificando el estilo o cualquier otra propiedad del gráfico.
Sub CreateChartWithRangesAndFixedName()
Dim xData As Range
Dim yData As Range
Dim serName As Range
'set the ranges to get the data and y value label
Set xData = Range("B3:B12")
Set yData = Range("C3:C12")
Set serName = Range("C2")
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (48, 195) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(48, 195, 400, 300)
'get reference to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'create the new series
Dim ser As Series
Set ser = cht.SeriesCollection.NewSeries
ser.Values = yData
ser.XValues = xData
ser.Name = serName
ser.ChartType = xlXYScatterLines
End Sub
Datos / rangos originales y Chart
resultante después de que se ejecuta el código
Tenga en cuenta que la fórmula SERIES
incluye una "B"
para el nombre de la serie en lugar de una referencia al Range
que la creó.
Creando un gráfico vacío
El punto de partida para la gran mayoría de códigos de gráficos es crear un Chart
vacío. Tenga en cuenta que esta Chart
está sujeta a la plantilla de gráfica predeterminada que está activa y puede que no esté realmente vacía (si la plantilla se ha modificado).
La clave para el ChartObject
es determinar su ubicación. La sintaxis de la llamada es ChartObjects.Add(Left, Top, Width, Height)
. Una vez que se crea el objeto ChartObject
, puede utilizar su objeto Chart
para modificar realmente el gráfico. El objeto ChartObject
comporta más como una Shape
para colocar el gráfico en la hoja.
Código para crear un gráfico vacío
Sub CreateEmptyChart()
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (0, 0) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(0, 0, 400, 300)
'get refernce to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'additional code to modify the empty chart
'...
End Sub
Gráfico resultante
Crea un gráfico modificando la fórmula SERIES
Para tener un control completo sobre un nuevo objeto Chart
y Series
(especialmente para un nombre de Series
dinámico), debe recurrir a la modificación de la fórmula SERIES
directamente. El proceso para configurar los objetos de Range
es sencillo y el principal obstáculo es simplemente la creación de cadenas para la fórmula SERIES
.
La fórmula SERIES
toma la siguiente sintaxis:
=SERIES(Name,XValues,Values,Order)
Estos contenidos pueden suministrarse como referencias o como valores de matriz para los elementos de datos. Order
representa la posición de la serie dentro del gráfico. Tenga en cuenta que las referencias a los datos no funcionarán a menos que estén completamente calificadas con el nombre de la hoja. Para ver un ejemplo de una fórmula de trabajo, haga clic en cualquier serie existente y verifique la barra de fórmulas.
Código para crear un gráfico y configurar datos usando la fórmula SERIES
Tenga en cuenta que la creación de cadenas para crear la fórmula SERIES
utiliza .Address(,,,True)
. Esto garantiza que se utilice la referencia de rango externa para que se incluya una dirección completamente calificada con el nombre de la hoja. Recibirá un error si se excluye el nombre de la hoja .
Sub CreateChartUsingSeriesFormula()
Dim xData As Range
Dim yData As Range
Dim serName As Range
'set the ranges to get the data and y value label
Set xData = Range("B3:B12")
Set yData = Range("C3:C12")
Set serName = Range("C2")
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (48, 195) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(48, 195, 400, 300)
'get refernce to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'create the new series
Dim ser As Series
Set ser = cht.SeriesCollection.NewSeries
'set the SERIES formula
'=SERIES(name, xData, yData, plotOrder)
Dim formulaValue As String
formulaValue = "=SERIES(" & _
serName.Address(, , , True) & "," & _
xData.Address(, , , True) & "," & _
yData.Address(, , , True) & ",1)"
ser.Formula = formulaValue
ser.ChartType = xlXYScatterLines
End Sub
Datos originales y cuadro resultante.
Tenga en cuenta que para este gráfico, el nombre de la serie se establece correctamente con un rango a la celda deseada. Esto significa que las actualizaciones se propagarán al Chart
.
Organizar gráficos en una cuadrícula
Una tarea común con gráficos en Excel es estandarizar el tamaño y el diseño de múltiples gráficos en una sola hoja. Si lo hace manualmente, puede mantener presionada la tecla ALT mientras cambia el tamaño o mueve la tabla para "pegarse" a los límites de las celdas. Esto funciona para un par de gráficos, pero un enfoque de VBA es mucho más simple.
Código para crear una grilla
Este código creará una cuadrícula de gráficos que comienza en una posición dada (Arriba, Izquierda), con un número definido de columnas y un tamaño de gráfico común definido. Los gráficos se colocarán en el orden en que se crearon y se ajustarán alrededor del borde para formar una nueva fila.
Sub CreateGridOfCharts()
Dim int_cols As Integer
int_cols = 3
Dim cht_width As Double
cht_width = 250
Dim cht_height As Double
cht_height = 200
Dim offset_vertical As Double
offset_vertical = 195
Dim offset_horz As Double
offset_horz = 40
Dim sht As Worksheet
Set sht = ActiveSheet
Dim count As Integer
count = 0
'iterate through ChartObjects on current sheet
Dim cht_obj As ChartObject
For Each cht_obj In sht.ChartObjects
'use integer division and Mod to get position in grid
cht_obj.Top = (count \ int_cols) * cht_height + offset_vertical
cht_obj.Left = (count Mod int_cols) * cht_width + offset_horz
cht_obj.Width = cht_width
cht_obj.Height = cht_height
count = count + 1
Next cht_obj
End Sub
Resultado con varios gráficos
Estas imágenes muestran el diseño aleatorio original de los gráficos y la cuadrícula resultante de ejecutar el código anterior.
antes de
Después