Introducción: la creación de gráficos con VBA puede hacerse relativamente fácil si se comprenden los objetos Chart y ChartObject como así también sus correspondientes métodos y propiedades.
GRAFICOS INCRUSTADOS:
Empezaremos con el objeto ChartObject que pertenece a la colección ChartObjects dentro de una Hoja de cálculo, por lo tanto, como pueden haber muchos en una Hoja hay que distinguirlos con un indice(ChartObject(i)). El objeto ChartObject es como un contenedor para el gráfico, es decir, para un Chart.
La gerarquía es
Application
Workbook
WorkSheet
ChartObject
Chart
ChartTitle(como un objeto dentro del gáfico a manera de ejemplo)
Podemos representar lo dicho gráficamente como sigue
PRINCIPALES PARTES DE UN GRAFICO :
Antes de hacer el código VBA de un gráfico es de fundamental importancia conocer sus partes mas importantes, que pueden ser a su vez objetos y esto, considero, es la clave para entender el código de un gráfico completo
Haremos un gráfico de barras que estará en la Hoja "Gráfico" y con una fuente de datos en la Hoja "Datos"
Los datos son la lluvia caída en cada mes del año en una cierta región
colocamos en un módulo el siguiente código
Set Lluvias = Sheets("Grafico").ChartObjects.Add(Left:=300, Top:=0,
Width:=300, Height:=200) ' Top y Left se toman a 'partir del margen superior e izquierdo de la Hoja, respectivamente
With Lluvias.Chart
.SetSourceData Source:=Sheets("Datos").Range("A1:B13")'fuente de datos
.ChartType = xlColumnClustered 'tipo de grafico
.Legend.Delete' se borraron las leyendas, esto es conveniente si hay solo una serie de datos
End With
End Sub
En el caso de haber una sola serie de datos, como en este caso; la leyenda se borra ya que no aporta nada a la claridad del gráfico y quita espacio
Observar que aparece como título del gráfico la etiqueta de la única serie de datos que hay (lluvias), debido a que se borro la leyenda
Luego de correr la macro se obtiene el siguiente gráfico
Este es un gráfico muy simple al que le iremos agregando elementos y cambiando propiedades.
Los colores de las barras tienen el color azul por defecto, esto es lo primero que modificaremos
1-Para cambiar el color de las barras debemos agregar el código
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(0, 170, 171) entre With y End With , esto cambia el color a verde esmeralda, notar que del lado izquierdo tenemos la propiedad RGB mientras que del lado derecho la función RGB propia del lenguaje de programación VBA
Cuando hay más de una serie de datos, es conveniente que aparezcan las Leyendas(Lgend) ya que en estas pueden identificarse los colores y las formas de cada una de las series de datos. También agregaremos un título (CharTitle)
La fuente de datos es
siendo el código
Set Lluvias = Sheets("Grafico").ChartObjects.Add(Left:=300, Top:=0,
Width:=300, Height:=200) ' Top y Left se toman a 'partir del margen superior e izquierdo de la Hoja, respectivamente
With Lluvias.Chart
.SetSourceData Source:=Sheets("Datos").Range("A1:C13")'fuente de datos
.ChartType = xlColumnClustered 'tipo de grafico
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(0, 170, 171)
.HasTitle = True
.ChartTitle.Text = "Lluvias y % de Humedad "' se agrega el titulo
End With
End Sub
como se ve Excel agrega unas barras de color rojo
Para cambiar el tipo de gráfico de la serie 2 (% de Humedad Promedio) del tipo barras a linea, debemos hacer referencia a ella con SeriesCollection(2), ya que las series son una coleccion de objetos dentro de Chart, agregando la siguiente línea de código
.SeriesCollection(2).ChartType = xlLine
como ya se habrán dado cuenta, la intención es lograr que el gráfico quede lo más parecido al que está en el enlace
PRINCIPALES PARTES DE UN GRAFICO
con el códigode abajo se logra casi ese objetivo
Set Lluvias = Sheets("Grafico").ChartObjects.Add(Left:=300, Top:=0,
Width:=300, Height:=200) ' Top y Left se toman a 'partir del margen superior e izquierdo de la Hoja, respectivamente
With Lluvias.Chart
.SetSourceData Source:=Sheets("Datos").Range("A1:C13")'fuente de datos
.ChartType = xlColumnClustered 'tipo de grafico
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(0, 170, 171)
.SeriesCollection(2).ChartType = xlLine 'se cambia a tipo liea de la serie 2
.HasTitle = True
.ChartTitle.Text = "Lluvias y % de Humedad " ' se agrega el titulo
.ChartTitle.Format.Line.Visible = msoCTrue 'se hace visible el marco del titulo
.ChartTitle.Format.Line.ForeColor.RGB = RGB(127, 115, 210) 'color del marco del titulo
.ChartTitle.Format.Fill.ForeColor.RGB = RGB(172, 209, 242) 'color del fonfo del titulo
.PlotArea.Format.Fill.ForeColor.RGB = RGB(244, 227, 128) 'color del area de trazado
.ChartArea.Format.Fill.ForeColor.RGB = RGB(199, 199, 199) 'color del area del grafico
.Legend.Format.Line.Visible = msoCTrue 'se hace visible el marco de la leyenda
.Legend.Format.Line.ForeColor.RGB = RGB(250, 0, 0) 'color del marco de la leyenda
.Legend.Format.Fill.ForeColor.RGB = RGB(248, 170, 154) 'color del fondo de la leyenda
End With
End Sub
y digo casi porque faltan los títulos de los ejes(AxesTitle). Igualmente hay muchas cosas que se pueden configurar en los ejes en si mismos como veremos.
Para acceder a los ejes debemos recurrir a método llamado Axes(Tipo de eje, grupo de eje), que devuélvelos ejes como objetos
Para el eje X el objeto es: Lluvias.Chart.Axes(xlCategory,xlPrimary)
Para el eje Y el objeto es: Lluvias.Chart.Axes(xlValues,xlPrimary)
Por lo que debemos agregar al código ya escrito la configuración para ambos ejes , como se muestra después de los comentarios
'Configuracion del eje x y 'Configuracion del eje y
Set Lluvias = Sheets("Grafico").ChartObjects.Add(Left:=140, Top:=5,
Width:=350, Height:=250) ' Top y Left se toman a 'partir del margen superior e izquierdo de la Hoja, respectivamente
With Lluvias.Chart
.SetSourceData Source:=Sheets("Datos").Range("A1:C13")'fuente de datos
.ChartType = xlColumnClustered 'tipo de grafico
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(0, 170, 171)
.SeriesCollection(2).ChartType = xlLine 'se cambia a tipo líeade la serie 2
.HasTitle = True
.ChartTitle.Text = "Lluvias y % de Humedad " ' se agrega el titulo
.ChartTitle.Format.Line.Visible = msoCTrue 'se hace visible el marco del titulo
.ChartTitle.Format.Line.ForeColor.RGB = RGB(127, 115, 210) 'color del marco del titulo
.ChartTitle.Format.Fill.ForeColor.RGB = RGB(172, 209, 242) 'color del fonfo del titulo
.PlotArea.Format.Fill.ForeColor.RGB = RGB(244, 227, 128) 'color del area de trazado
.ChartArea.Format.Fill.ForeColor.RGB = RGB(199, 199, 199) 'color del area del grafico
.Legend.Format.Line.Visible = msoCTrue 'se hace visible el marco de la leyenda
.Legend.Format.Line.ForeColor.RGB = RGB(250, 0, 0) 'color del marco de la leyenda
.Legend.Format.Fill.ForeColor.RGB = RGB(248, 170, 154) 'color del fondo de la leyenda
End With
'Configuracion del eje X
With Lluvias.Chart.Axes(xlCategory,xlPrimary)
.HasTitle = True ' Se agrega el título , sin recuadro
.AxisTitle.Characters.Text = "Meses" ' Se da nombre al rótulo
.AxisTitle.Format.Fill.ForeColor.RGB = RGB(248, 170, 154) ' Color de fondo del título
.AxisTitle.Format.Line.Visible = msoCTrue ' Se hace visible el recuadro del título
.AxisTitle.Format.Line.ForeColor.RGB = RGB(0, 250, 0)' Se da un color verde al recuadro
.AxisTitle.Characters.Font.Italic = True ' fuente del título
.AxisTitle.Characters.Font.Size = 14 ' Tamaño de la fuente
.AxisTitle.Characters.Font.Color = vbRed ' Color de la fuente del título
.HasMajorGridlines = True 'Líneas de grilla verticales
.TickLabels.Format.Fill.ForeColor.RGB = RGB(236, 213, 202) 'color de fondo de los rótulos
.TickLabels.Font.Color = RGB(0, 0, 250) ' color de la fuente del rótulo
End With
'Para el eje Y solo cambia " Axes(xlValues,xlPrimary) "
'Configuracion del eje Y
With Lluvias.Chart.Axes(xlValues,xlPrimary)
.HasTitle = True'se agrega un recuadro negro alrededor del area del grafico
With Lluvias.Chart.ChartArea.Format.Line
.Visible = msoCTrue
.DashStyle = msoLineSolid
.Weight = 3
End With
End Sub
En la macro de arriba se agregaron muchos elementos, como el color de fondo de los rótulos, entre otros( todo esta debidamente comentado)siendo el resultado final el mostrado abajo
Se podría objetar que el gráfico parece una ensalada (con salsa golf incluida), la razón es mostrar algunas cosas que se pueden hacer con los elementos de un gráfico, quedando a criterio del usuario cuales usar y cuáles no, es más, no es aconsejable usar todo.
Otra cosa que podríamos hacer para que el área del trazado sea más grande es ubicar la leyenda en la parte inferior, para lo que agregamos
..Legend.Position = xlLegendPositionBottom
que ubicamos en el primer With-End WIth. Esto modifica el gráfico como se muestra
finalmente para que el todo quede más armónico, modificamos los parámetros del área de trazado(PlotArea) agregando 10 píxeles al ancho y 27 píxeles al alto
ancho = MiCrafico.Chart.PlotArea.Width + 10
alto = MiCrafico.Chart.PlotArea.Height + 27
también modificamos la distancia a la parte superior del gráfico y la distancia al la parte izquierda del gráfico(Top y Left)
El código que debemos agregar es el siguiente:
With MiCrafico.Chart.PlotArea
.Width = ancho
.Height = alto
.Left = 20
.Top = 25
End With
En la figura vemos el resultado final
Nota: en los ejemplos reales se irán viendo otras formas de manipular los gráficos con programación VBA.