En una de mis anteriores entradas (esta), Oscar me realizó una consulta por demás de interesante y que, luego de ver el ejercicio que armé al respecto, podremos profesionalizar nuestros proyectos. Este post estará dedicado a la personalización "a full" de los gráficos de Excel: Oscar necesita que la gráfica se coloree (o bien se rellene con distintas imágenes) de acuerdo al valor tratado.
En la imagen que muestro a continuación verán como a cada punto de la serie le asigno un formato específico:
[+/-] Ver el resto / OcultarCada punto de la serie (pilar, oscar, diego, arnold, esmeralda y juan) tienen un formato propio: rojo y verde sólido, azul degradado, textura de madera, tramas y, por último, una imagen desde archivo. Todas estas opciones están disponibles si hacemos click con el botón derecho del mouse sobre la serie completa (o uno de sus puntos) y seleccionamos "Formato del área del gráfico", pestaña "Tramas", sección "Area", botón "Efectos de relleno":
Luego hacemos click en el mencionado botón y las opciones quedan a nuestro alcance:
Degradado, Textura, Trama e Imagen: recordemos que en esta última Excel nos permite seleccionar una imagen (jpg, png, etc, etc) para rellenar las series (pueden observar el efecto si miran el punto "juan" del gráfico que les mostré al principio).
Pero Oscar necesita automatizar esta tarea y que el gráfico se rellene de ciertas imágenes dependiendo del valor de cada punto. Por ejemplo: si "juan" tiene un valor de 10, entonces irá una imagen determinada, si no, otra. No me queda otra que recurrir a las macros para realizar esta tarea, misma que describo a continuación.
Pasos a seguir:
1) seleccionar el gráfico
2) contar la cantidad de puntos que tiene la serie
3) recorrer punto x punto y analizar su valor
4) en base al resultado obtenido en el paso anterior, asignarle una imagen en especial.
Los comandos a utilizar son sencillos y fáciles de comprender, solo necesitamos saber como ordenarlos y aplicarlos. Cuando optamos por colocar una imagen como fondo del punto, será necesario buscarla en el disco rígido de nuestra PC; personalmente no conozco la forma de insertar dentro de un gráfico una imagen que esté dentro del libro. No ocurre lo mismo con las "tramas" y las "texturas", ya que son propias a la aplicación y no requiere del uso de archivo externos.
Lo mencionado con anterioridad nos lleva a tener que preparar, de antemano, las imágenes que utilizaremos. Para este ejemplo eché mano de 3 archivos ".png", a los que llamé "bajo", "medio" y "alto", en clara referencia a lo que reflejará cada uno de ellos:
con estas tres imágenes rellenaré los puntos de las series, de acuerdo al valor que presente cada uno de ellos.
Sigamos. Para facilitar el trabajo, los archivos deberán encontrarse dentro del mismo directorio en donde se ejecutará nuestro libro, y así acceder a ellos mediante la instrucción ActiveWorkbook.Path (o sea: ruta del libro activo).
Entonces: si tengo la siguiente tabla:
Y quiero que la imagen de fondo varíe de acuerdo a cada porcentaje:
Debo aplicar el siguiente código:
Sub RellenarSeries() Dim Valor, Puntos As Long, X As Long Dim Ruta As String 'quito el refresco de pantalla, para que la macro "corra" 'mas rápido y evitar a la vez el incómodo parpadeo Application.ScreenUpdating = False On Error GoTo Salida 'selecciono el gráfico ActiveSheet.ChartObjects("Gráfico 1").Activate ActiveChart.ChartArea.Select 'armo la ruta para llegar a las imágenes que utilizaré de 'relleno, que se encuentran en el mismo directorio que el 'libro actual: Ruta = ActiveWorkbook.Path & "\" 'utilizo la colección de series (seriesCollection) With ActiveChart.SeriesCollection(1) 'almaceno la cantidad de puntos de la serie Puntos = .Points.Count 'referencio sus respectivos valores Valor = .Values For X = 1 To Puntos 'de acuerdo al valor de cada punto, concateno a la variable 'Ruta el nombre de archivo (imagen) a utilizar. 'aquí multiplico al valor x 100, ya que los puntos son 'porcentuales: Select Case Valor(X) * 100 Case Is <= 10 .Points(X).Fill.UserPicture PictureFile:=Ruta & "bajo.png" _ , PictureFormat:=xlStack, PicturePlacement:=xlAllFaces Case Is <= 20 .Points(X).Fill.UserPicture PictureFile:=Ruta & "medio.png" _ , PictureFormat:=xlStack, PicturePlacement:=xlAllFaces Case Is <= 40 .Points(X).Fill.UserPicture PictureFile:=Ruta & "alto.png" _ , PictureFormat:=xlStack, PicturePlacement:=xlAllFaces End Select Next X End With Salida: If Err.Number <> 0 Then MsgBox "Se produjeron errores", vbCritical, Err.Number Err.Clear Application.ScreenUpdating = True End If Application.ScreenUpdating = True End Sub
Habrán notado que la principal instrucción es: .Points(X).Fill.UserPicture, lo que traducido significa que para el llenado (fill) utilizaré una imagen definida por el usuario (userPicture).
Si quisiéramos variar el color de cada punto de la serie (en lugar de rellenarlo con una imagen), el comando debería ser: .Points(X).Interior.ColorIndex = 6 (el 6 corresponde al amarillo).
Para rellenar con una trama: Selection.Fill.Patterned Pattern:=msoPatternSphere (hay varios tipos de tramas, que se definen luego de los caracteres :=)
El gráfico de Oscar es el siguiente:
con un diseño bien logrado, estas son las imágenes que utiliza mi lector, las cuales ahora se cargarán automaticamente y de acuerdo a los valores de cada punto de la serie.
Restaría ver que evento dispara nuestra macro. Yo aconsejaría colocar este gráfico en una hoja independiente, dentro del evento Private Sub Worksheet_Activate(), es decir, cuando se activa dicha hoja. Esto es para evitar que ante cualquier cambio se actualice el gráfico (cosa que podría resultar un tanto incómoda) y de esa forma correr nuestra macro solo cuando deseamos visualizar la gráfica.
Les dejo el link al archivo (.rar), en donde encontrarán las tres imágenes utilizadas.
Saludos y espero les sea de utilidad en su trabajo.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Excelente Damian.
ResponderEliminarLe has dado al clavo como decimos coloquialmente en Colombia. Me has dejado boquiabierto; ahora implementaré lo que has expuesto claramente, que me permitirá reducir el tiempo empleado en esta tarea.
Cualquier duda que me surja te la estaré comentando.
Muchísimas gracias! Un abrazo ;)
Gracias por avisarme, Oscar. Aquí también le decimos "le diste en el clavo", jaja.
ResponderEliminarEs una gran alegría saber que el proyecto te sirvió.
Un abrazo