SITIO DEDICADO  SOLO A EXCEL 2007 Y EXCEL 2003, CON TUTORIALES Y EJERCICIOS  RESUELTOS DE  TODOS LOS TEMAS

NIVELES, BASICO, MEDIO Y AVANZADO

GRAFICOS EN VBA

 

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

Contenido y contenedor

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

Fuente de datos

colocamos en un módulo el siguiente código

 

Sub GDeLluvias()
   Dim Lluvias As ChartObject

   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

Color por defecto

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

 

 

Verde esneralda

 

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

 

Dos series

siendo el código

Sub GDeLluviasYHumedad()
   Dim Lluvias As ChartObject

   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

Grafico con título

 

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

 

Dos tipos de Gráfico

 

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

 

Sub GDeLluviasYHumedad()
   Dim Lluvias As ChartObject

   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

 

 

Todas las partes de un gráfico

 

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

 

 

Sub GDeLluviasYHumedad()
   Dim Lluvias As ChartObject

   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     
     .AxisTitle.Characters.Text = "Valores"  
     .AxisTitle.Format.Fill.ForeColor.RGB = RGB(248, 170, 154)
     .AxisTitle.Format.Line.Visible = msoCTrue
     .AxisTitle.Format.Line.ForeColor.RGB = RGB(0, 250, 0)
     .AxisTitle.Characters.Font.Italic = True
     .AxisTitle.Characters.Font.Size = 14
     .AxisTitle.Characters.Font.Color = vbRed
     .HasMajorGridlines = True
     .TickLabels.Format.Fill.ForeColor.RGB = RGB(236, 213, 202)
     .TickLabels.Font.Color = RGB(0, 0, 250)
   End With

 '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

 

Configuracion completa

 

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

LEYENDA EN LA PARTE INFERIOR

 

 

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

Gráfico final

 

 

Nota: en los ejemplos reales se irán viendo otras formas de manipular los gráficos con programación VBA.

 

 

 

VOLVER A PROGRAMACION VBA

 

Copyright © 2009. Diseño CésarDesign
Free Web Hosting

http://www.1null_app_id.com/