Creación de gráficos con VBA/Excel

Estándar

Crear gráficos personalizados puede ser una tarea práctica y sencilla si sabemos utilizar el objeto Chart y ChartObjetc, al igual que sus métodos y propiedades.

Inicialmente en Excel solo se podían crear hojas de gráficos (Chart), es decir un grafico se situaba en toda una hoja algo similar a lo que sucede cuando se presiona la tecla F11 sobre un listado de datos, inmediatamente se crea una hoja de grafico de los datos con el tipo de grafico por defecto. Después Excel incorporo la posibilidad de tener objetos de gráficos dentro de una hoja existente (ChartObject).

En este tutorial se muestra como crear un grafico, manipular el área de grafico, el área de trazado y las series de un objeto grafico (ChartObject), al igual que algunas de sus propiedades. También se verá cómo crear un grafico circular con un subgrafico de barras que agrupe porcentajes menores a un valor establecido y por último como exportar un grafico como una imagen.

La ventaja de crear gráficos y exportarlos como imagen es que podemos utilizar dichas imágenes exportadas para poderlas cargas en un formulario, poderlas visualizar en páginas web y otras posibilidades mas…


Option Explicit

‘Creacion de un grafico desde VBA
Sub Crear_Grafico()
Dim ws As Worksheet
Dim migrafico As ChartObject

Set ws = ActiveSheet
Charts.Add ‘Se crea una hoja de grafico

With ActiveChart ‘en la hoja de gafico activa…
.SetSourceData ws.Range(“A1”).CurrentRegion ‘establecer el origen de los datos a graficar
.Location xlLocationAsObject, ws.Name ‘mover a la hoja1, con lo cual pasa de objeto Chart a ChartObject
End With

Set migrafico = ws.ChartObjects(1) ‘se crea una referencia

With migrafico
.Width = 300 ‘ancho
.Height = 150 ‘alto
.Left = 180 ‘distancia con la parte izquierda de la hoja
.Top = 10 ‘distancia con la parte superior de la hoja
.Chart.Legend.Position = xlLegendPositionBottom ‘poner leyenda en la parte inferior del grafico
End With
End Sub

‘Modifica el area de grafico (ChartArea) del grafico activo
Sub Area_Grafico()
Dim ws As Worksheet
Dim grafico As Chart
Dim area As ChartArea

Set ws = ActiveSheet ‘hoja activa
Set grafico = ws.ChartObjects(1).Chart ‘grafico 1
Set area = grafico.ChartArea ‘area de grafico

With area
.Shadow = True
.Select
.Border.ColorIndex = 3
.Border.Weight = xlMedium
.Interior.ColorIndex = 34
.AutoScaleFont = False
.Font.Size = 14
End With
End Sub

‘Modifica el area de trazado (PlotArea) del grafico activo
Sub Area_Trazado()
Dim ws As Worksheet
Dim grafico As Chart
Dim trazado As PlotArea

Set ws = ActiveSheet
Set grafico = ws.ChartObjects(1).Chart
Set trazado = grafico.PlotArea

With trazado
.Top = 20
.Left = 35
.Height = 100
.Width = 200
End With
End Sub

‘Modificar las series del grafico
Sub Series()
Dim ws As Worksheet
Dim grafico As Chart
Dim serie As Series

Set ws = ActiveSheet
Set grafico = ws.ChartObjects(1).Chart
Set serie = grafico.SeriesCollection(“Xdata”)

With serie
.ChartType = xlLine
.Border.Weight = xlThick
.MarkerStyle = xlMarkerStyleCircle
.MarkerBackgroundColorIndex = xlColorIndexAutomatic
.MarkerForegroundColorIndex = xlColorIndexAutomatic
.MarkerSize = 10
End With
End Sub

‘Crea un grafico circular con subgrafico de barras (agrupa todos los porcentajes < 5%)
Sub Grafico_Circular()
Dim ws As Worksheet
Dim rng As Range
Dim grafico As Chart
Dim grupo As ChartGroup

Set ws = ThisWorkbook.Sheets(“Hoja2”)
Set rng = ws.Range(“A1”).CurrentRegion
Set grafico = Charts.Add

With grafico
.ChartType = xlBarOfPie ‘tipode grafico
.SetSourceData rng ‘fuente de datos
.ApplyDataLabels xlDataLabelsShowPercent ‘mostrar etiquetas de porcentaje

Set grupo = .ChartGroups(1)

With grupo
.SplitType = xlSplitByPercentValue
.SplitValue = 5 ‘menor que 5% combinado
.GapWidth = 200 ‘espacio entre el grafico circular y las barras
.SecondPlotSize = 55 ‘% relativo al tamaño del circulo
End With

.Location xlLocationAsObject, ws.Name ‘establecer como objeto de grafico
End With
End Sub

‘Exportar un grafico como imagen
Sub Exporta_Grafico()
Dim ws As Worksheet
Dim grafico As Chart

Set ws = ThisWorkbook.Sheets(“Hoja2”)
Set grafico = ws.ChartObjects(1).Chart
grafico.Export “C:\grafico.gif”, filtername:=”GIF” ‘se exporta el grafico a la unidad C como imagen gif
End Sub

Aqui se puede ver la aplicacion del codigo anterior: Graficos

Aqui anexo un video: Video Explicativo

Anuncios

31 comentarios en “Creación de gráficos con VBA/Excel

  1. Hola ExcelBoy!

    He querido ver el resultado, he descargado el archivo xlsm y lo he abierto con libre calc por lo que no logro ver los resultados.

    Una petición / sugerencia: Podrías adicionar alguna imagen del resultado obtenido?

    Salu2+

    • Hola! me imagino a que te refieres al origen de los datos, en el ejemplo empiezan a partir de la celda A1.

      Pues bien, si es asi, lo unico que debes hacer es cambiar A1 por la celda donde comience tu origen de datos y listo.

      Lo que hace Range(“A1”).CurrentRegion es seleccionar un rnago contiguo de datos, algo asi como si manualmente te situaras en la celda A1 y presionaras Control+E, com lo cual se seleccionarian todas las celdas contigua a A1, estas celdas contiguas deben tener datos, por ejemplo si tu tienes datos en el rango: A1:D10 y te posicionas en A1 y presionas Control+E, se seleccionara todo ese rango.

      Espero haber podido aclarar tu duda y gracias por comentar!

      • Hugo

        Gracias por responder, me parece que no me explique bien, mira, si yo tengo tres tablas con datos, los cuales deseo graficar, y estos se encuentran en las celdas A1:B11, F17:G27 y M12:N21, ¿Cómo le hago para poder graficarlos con la macro, sin tener que cambiar los datos de origen?. Es decir en donde se encuentre mi celda activa, que ahí ejecute la macro.

    • Si lo que quiere es un grafico 3D, tendrias que cambiar la propiedad ChartType, dependiendo del grafico deseado.

      Y si solo es el eje creo que tendrias que acceder a la coll eccion Axes del grafico e interacturar. Lo mas sencillo seria que hicieras el grafico a mano ta cual deseas y que actives la grabadora de macros para que puedas extraer la parte de codigo que hace lo que necesitas, la modifiques y la incluyas en tu proyecto.

      Saludos!

  2. mauriciomazob@gmail.com.

    Hola ExcelBoy.
    Excelente post!
    Esto sí que saca de apuros!!

    Tengo una duda.
    Resulta que estoy tratando de crear un gráfico de dispersión que muestra dos variables, con Excel 2013. El gráfico se crea sin problemas.
    Sin embargo cuando trato de asignar los títulos de eje horizontal y vertical con un texto fijo, tengo problemas.
    La macro me arroja el error 424 en tiempo de ejecución: se requeire un objeto.

    Creo que para lo que intento hacer no basta con ejecutar una macro grabada.

    ¿Se te ocurre cómo lo podría hacer?

    Muchas gracias!
    Atento a cualquier comentario,
    Saludos,
    Mauricio.

  3. Antoni

    Hola,

    No se si me podéis ayudar?..intento modificar el color del gráfico (de la serie) y hace caso omiso si el tipo de gráfica es “xlLine”, he probado con otro tipo (xlColumnClustered) y si funciona, que puedo hacer.. ¿?¿?, he probado de grabar una macro y me sorprende que no lo hace…

    ..
    ..
    .SeriesCollection(i + 1).name = series(i, 0)
    .SeriesCollection(i + 1).Interior.color = RGB(x,y,z)
    ..
    ..

    Saludos y gracias.

    • Hola! En mi caso yo queria cambiar el color de las series de acuerdo a sus valores, algo asi como un semaforo, asi que utilice el siguiente codigo:


      'Da formato a las series de un grafico dependiendo el valor de cada serie y los limites brindados
      Sub Semaforo_Series(gp As ChartObject, min As Integer, med As Integer, max As Integer)
      Dim serie As Series
      Dim pt As Point
      Dim valores As Variant
      Dim i As Integer

      For Each serie In gp.Chart.SeriesCollection
      valores = serie.Values

      For i = 1 To UBound(valores)
      Set pt = serie.Points(i)

      Select Case valores(i)
      'rojo
      Case Is < min
      pt.Interior.ColorIndex = 9 '9, 46
      'amarillo
      Case Is = med
      pt.Interior.ColorIndex = 10 '10,43
      End Select
      Next i
      Next serie
      End Sub

      Espero te sea de ayuda!

      • Hola,

        Lo miraré mañana, pero creo que no me funciona así.. intentaré pasar el código.

        Muchas gracias, con vuestros ejemplos se aprende un montón.

        Antoni.

      • Antoni

        Hola,

        No me ha funcionado, no modifica el color de la serie… adjunto el código ejemplo:

        Set ws = ActiveSheet

        ‘Asignamos las propiedades
        With ActiveChart

        .ChartType = xlLine
        .ApplyLayout (1)
        .SetElement (msoElementPrimaryCategoryGridLinesMajor)

        .SeriesCollection(1).name = “Test 1”

        ‘El ejemoplo de Microsoft no funciona.
        ‘.SeriesCollection(1).Format.Fill.ForeColor.RGB = rgbRed

        ‘Ejemplo de “Mexcel” tampoc me funciona.
        For Each serie In .SeriesCollection

        valores = serie.Values

        For i = 1 To UBound(valores)

        Set pt = serie.Points(i)

        pt.Interior.ColorIndex = 10

        Next i

        Next serie

        .ChartArea.Font.Size = 14

        End With

        Set ws = Nothing

  4. Antoni

    Hola de nuevo,

    Parece que el problema surge al utilizar el tipo de gráfica “xlLine”, si utilizo otro si funciona, pero me piden que sea de tipo “xlLine” y no encuentro la forma de hacerlo..

    Muchas gracias por vuestro tiempo.
    Antoni.

  5. Juanjo

    Impresionante
    Muchisimas gracias. Me ha sido de gran ayuda para un problema de automatizacion que tenia y el resultado es excelente.
    Solo una consulta:
    Creo el grafico y me sale de barras. En el mismo Sub lo modifico para que sea de lineas y funciona bien…¿ pero se puede crear directamente para que las series sean de lineas?.
    Saludos

  6. Juanjo

    Hola de nuevo.
    Tengo otra pregunta:
    Como puedo hacer para mostrar la tabla de datos en el propio grafico para que tenga el mismo aspecto que haciendolo con el asistente?
    Gracias de antemano

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s