jueves, 26 de julio de 2012

VBA: Dar color a puntos de un gráfico según elementos seleccionados de un ListBox en Excel.

Última entrada de la serie de entradas del blog que empezó con el post Elementos seleccionados de un ListBox.
En este último post añadiremos las líneas de código que verifican punto por punto de la Serie de datos de nuestro gráfico, hasta encontrar las coincidencias con los elementos seleccionados, que como vimos en el anterior post, tenemos recogidos en nuestra matriz redimensionada.

A continuación del código de la entrada anterior ,insertaremos en la Hoja1 (en la hoja donde se encuentre nuestro ListBox) del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel, con un evento click, quedando:

Private Sub CommandButton1_Click()
Dim lItem As Long, seleccionados As Integer
Dim MiMatriz() As Variant
'recorremos cada elemento del ListBox
For i = 0 To ListBox1.ListCount - 1
    'verificamos si está o no seleccionado
    'en caso afirmativo, acumulamos el contador
    If ListBox1.Selected(i) = True Then
        seleccionados = seleccionados + 1
    End If
Next i
'comprobamos que hay algún elemento seleccionado
If seleccionados = 0 Then
    MsgBox "Debes marcar al menos un cliente"
    Exit Sub
End If

'redefinimos la matriz con el número de items seleccionados
ReDim MiMatriz(1 To seleccionados, 1) As Variant
x = 1
'recorremos todos los elementos del Listbox
For lItem = 0 To ListBox1.ListCount - 1
    'en caso de que el elemento esté seleccionado
    'lo añadimos a una matriz
    'que luego emplearemos para comparar en el gráfico
    If ListBox1.Selected(lItem) = True Then
    'añadimos el item a la matriz redimensionada
    MiMatriz(x, 1) = ListBox1.List(lItem)
    'dejamos el Listbox sin selección
    ListBox1.Selected(lItem) = False
    x = x + 1
    End If
Next lItem
''''''''''''''''''''''''''''''''''''''
'Trabajamos ahora sobre el gráfico
Dim grafico As ChartObject
Dim iPoint As Long, nPoint As Long
Dim s As Series
'Definimos y localizacmos el gráfico
Set grafico = Sheets(1).ChartObjects(1)
Set s = grafico.Chart.SeriesCollection(1)
nPoint = s.Points.Count
'unificamos el color de toda la serie
s.Interior.Color = vbBlue

'recorremos los elementos de la matriz
For itm = LBound(MiMatriz) To UBound(MiMatriz)
'recorremos el eje X,
'revisando si el nombre de los clientes
'coincide con los seleccionados en el Listbox
    For iPoint = 1 To nPoint
        If s.XValues(iPoint) = MiMatriz(itm, 1) Then s.Points(iPoint).Interior.Color = vbRed
    Next iPoint
Next itm

End Sub


Finalizada la programación, estamos dispuestos a probarla. Si seleccionamos varios elementos desde el ListBox, y ejecutamos la macro presionando el CommandButton que hemos llamado 'Ejecutar', veremos la acción resultante en el gráfico, cambiando de color Azul(vbBlue) a Rojo(vbRed) los puntos correspondientes.
Podemos ver una imagen:

VBA: Dar color a puntos de un gráfico según elementos seleccionados de un ListBox en Excel.


11 comentarios:

  1. Buen dia, soy nuevo en excel y tengo el siguiente problema: tengo un grafico de dispersion y necesito realizar un formato condicional a las etiquetas o series donde dependan de un valor, Ejemplo: si el valor de la etiqueta es menor que 3 dar color rojo si es mayor que 3 y menor que 4 dar color azul y si son mayores qe 4 dar color verde.
    Les agradeceria enormemente que debo hacer para realizar este tipo de grafico ya que actualmente hago este cambio de color de las etiquetas manualmente.

    Mil gracias.

    Atentamente,

    Dario Barreto

    ResponderEliminar
    Respuestas
    1. Hol Darío,
      Entiendo que son a las etiquetas (y no a los puntos de dispersión) a lo que quieres dar formato...
      No sé si querrías hacerlo con macros, si es así, puedes leer al respecto en
      http://excelforo.blogspot.com.es/2012/02/vba-modificar-etiquetas-de-datos-en-un.html
      y en esta misma entrada.

      La otra opción sería hacerlo seleccionando las Etiquetas y dándole un formato personalizado a los números con este tipo:
      [Rojo][<3]#.##0;[Azul][<4]#.##0;[Verde]#.##0

      Espero te sirva
      Slds

      Eliminar
    2. Hola Ismael, gracias por su pronta respuesta, pero no lo logro realizar; le comento que estoy haciendo lo siguiente:señalo la etiqueta, doy clic derecho y voy en opciones formato etiqueta de datos, en opciones etiqueta yo solo habilito nombre de la serie, que es el que debo cambiar de color dependiendo del valor de un campo (<4 rojas, >5 azul...) que es diferente al valor de (x,y) de la etiqueta, donde (Y) es un valor fijo y (X) es un valor variable. como decía yo cambio este color de etiqueta manualmente, no se si se podría realizarlo automáticamente, aclaro que no soy un usuario avanzado en excel.

      De antemano mil gracias.

      Atentamente,

      Dario Barreto

      Eliminar
    3. Hola Darío,
      desde Formato de Etiqueta, selecciona el menú Número > Tipo personalizado, y dentro de este, en el editable Tipo, introduce:
      [Rojo][<3]#.##0;[Azul][<4]#.##0;[Verde]#.##0
      Slds

      Eliminar
    4. Hola Ismael, le comento que me funciona perfectamente su solución cuando gráfico el valor de los campos (x ó y) y le agradezco enormemente en donde lo estoy utilizando en un gráfico, pero tengo el siguiente inconveniente para otro gráfico que estoy realizando: yo solo gráfico la etiqueta que es diferente a los valores de (x,y), esta etiqueta tiene un nombre aparte de los valores (x,y), Ejemplo: Nombre la etiqueta Dario (Nombre Digitado Manualmente), ubicación gráfica X=30(Valor Variable) y=15(Valor Fijo); en la gráfica solo muestro el nombre de la etiqueta (Dario) ó Valor de la serie.

      Mi inconveniente es que el color de esta etiqueta ó valor de la serie(Dario)depende de un campo totalmente diferente al (Valor de X y Valor de Y), Ejemplo: El valor del Campo es 1.65< colorear en rojo, si >=1,65 y 3< colorear en azul, si >=3 y < colorear amarillo, si > 5 colorear verde.

      De antemano mil gracias por su pronta respuesta.

      Atentamente,

      Dario Barreto

      Eliminar
    5. Darío,
      puedes modifcar el código de esta entrada:
      http://excelforo.blogspot.com.es/2012/11/vba-grafico-de-dispersion-con-etiquetas.html
      hay algo más de documentación de cómo cambiar colores de series, etiquetas en la categoría de Gráficos del blog.
      Slds

      Eliminar
    6. Buen día Ismael, le comento que realice el gráfico como lo indica en su entrada y me gráfico perfecto el nombre de cada etiqueta, mil gracias por su ayuda.

      Pero le comento que no he podido dar color de las etiquetas, busque en los blog y no encontré como solucionarlo por ser un usuario básico en Excel e Internet.

      Yo hice lo siguiente: En la Columna A coloque los nombres de las etiquetas, En la Columna B coloque el valor del Punto X, En la Columna C coloque el valor del Punto Y y, En la Columna D coloque el valor ó rango del color de la etiquetas.
      Después de Colocar los datos ejecute su código y perfecto me coloca las etiquetas, ahora tengo el problema de colocar el color de las etiquetas llamando los valores de la Columna D, que este color dependería de 4 condiciones según el valor de las celdas de la columna D (1.65< Rojo; >1.65 y >3 Azul; >3 y <5 Amarillo; >5 Verde).

      Qué pena molestarlo tanto pero no sé como realizar este proceso debido a que soy un usuario básico.

      Mil gracias por su pronta respuesta.

      Atentamente,

      Dario

      Eliminar
    7. Hola Darío, envíame el fichero por email:
      excelforo@gmail.com
      Slds

      Eliminar
    8. Gracias Ismael, le acabe de enviar al email dos ficheros: el que realiza con el Post y el original que vengo realizando manualmente.

      Mil gracias.

      Atentamente,

      Dario

      Eliminar
    9. Ismael, muchas gracias por la paciencia y las solución de este problema que tenia al colocar el color de la etiquetas mediante condicionales.

      Atentamente,

      Dario

      Eliminar