jueves, 22 de noviembre de 2012

VBA: Gráfico de dispersión con etiquetas personalizadas.

Construiremos hoy un gráfico de dispersión sobre dos series de datos (Renta per capita y Consumo energético) sobre una lista de paises, con la peculiaridad de que, mediante una sencilla macro, agregaremos a cada punto del gráfico la etiqueta del nombre del país correspondiente. En respuesta a la cuestión planteada por un lector:
...realizar un grafico en el que se correlacione la evolución del consumo de energía (eje de ordenadas Y) con la evolución de la renta per cápita (eje de abscisas X), añadiendo las etiquetas de cada País en el punto correspondiente...

Empezaremos viendo los datos de que partimos (datos aleatorios, no reales!):

VBA: Gráfico de dispersión con etiquetas personalizadas.


El primer paso es construir el gráfico de dispersión (gráfico XY) sobre los rangos D2:D12 y G2:G12:

VBA: Gráfico de dispersión con etiquetas personalizadas.

que tras insertar este tipo de gráfico obtenemos:

VBA: Gráfico de dispersión con etiquetas personalizadas.


Por mucho que intentemos agregar etiquetas, desde Herramientas de gráficos > Presentación > grupo Etiquetas > botón Etiqueta de datos nunca conseguiríamos incorporar los nombres de los países correspondientes. Esto sólo sería posible mediante una sencilla macro como la siguiente.
Para ello, insertamos el siguiente código VBA en un módulo del Explorador de proyectos VBA:

Sub AgregarEtiqueta()
Dim texto As String
'Activamos nuestro gráfico, sobre el que añadiremos las etiquetas personalizadas
ActiveSheet.ChartObjects("1 Gráfico").Activate
'contamos el número de puntos existentes en la serie de dispersión XY
puntos = ActiveChart.SeriesCollection(1).Points.Count
  
Application.ScreenUpdating = False
'agregamos etiquetaas de datos
ActiveChart.SeriesCollection(1).ApplyDataLabels Type:=xlDataLabelsShowLabel

'pasamos por todos los puntos de la serie con el bucle FOR...NEXT
For i = 1 To puntos
    texto = Cells(i + 2, 1)
    'definimos el texto y valor a incluir en la etiqueta
    ActiveChart.SeriesCollection(1).Points(i).DataLabel.Text = texto
Next i
Application.ScreenUpdating = True
End Sub


El resultado tras ejecutar la macro de Excel 'AgregarEtiqueta' sería:

VBA: Gráfico de dispersión con etiquetas personalizadas.


Por supuesto, podemos seguir dando el formato deseado a nuestro gráfico...

8 comentarios:

  1. No compila esta línea:
    ActiveSheet.ChartObjects("1 Gráfico").Activate
    No sé si el nombre por defecto de mi gráfico sea otro.

    ResponderEliminar
    Respuestas
    1. Hola que tal, un placer saludarte...
      Es muy probable que el fallo sea el que comentas, el nombre del gráfico.
      Puedes Renombrar el objeto desde la hoja de calculo, y luego emplear ese nombre en el código.
      Saludos

      Eliminar
  2. Hola! Cómo estás? Te escribo para consultarte si tenés algún código que permita hacer lo mismo que hace esta pero agregar más de una serie.
    Necesito graficar dos variables, las etiquetas son los años, pero necesito comparar esto por región geográfica- Y de macros yo no se nada.
    Muchas gracias. Saludos,

    ResponderEliminar
    Respuestas
    1. Hola,
      quizá no te haga falta programación, y algo más simple como generar un gráfico dinámico te sirva...
      Crea tu TD llevando los años al área de filas y las dos variables al área de valores...

      Espero haberte entendido bien
      Slds

      Eliminar
  3. Graciaaaaaaas, siempre quise hacerlo y no sabía cómo

    ResponderEliminar
  4. Hola buenas tardes, yo quisiera poner una linea de división (Imagen) entre dos rangos, al modificar la gráfica a través de la segmentación de datos, el gráfico cambia de tamaño y la imagen deja de coincidir con el valor del eje, se puede hacer que el valor del eje coincida con la imagen?

    ResponderEliminar
    Respuestas
    1. Hola
      discúlpame, pero no entiendo el contexto de la pregunta¿¿??
      ¿la imagen (linea de división) está fuera del gráfico?

      Quedo atento

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.