jueves, 9 de agosto de 2018

VBA: Color RGB y el Círculo Cromático en Excel

Llevaba tiempo queriendo escribir sobre este tema de los colores RGB en Excel, y no he encontrado mejor forma que haciéndolo sobre el Círculo Cromático de 12 colores (ni el más simple ni el más completo).
Si no te suena qué es esto, puedes leer algo más en Wikipedia


En este caso lo más importante es conocer la combinación RGB de esos doce colores...



Nuestra gama de colores está dividida en tres colores primarios:
amarillo = RGB 255-255-000
rojo = RGB 255-000-000
azul = RGB 000-000-255

Tres colores secundarios:
Naranja = rojo + amarillo= RGB 255-166-000
Violeta = rojo + azul = RGB 128-000-128
Verde = azul + amarillo = RGB 000-255-000

y seis terciarios:
Naranja amarillento = naranja + amarillo = RGB 255-198-000
Rojo anaranjado = rojo + naranja = RGB 255-090-004
Violeta rojizo = violeta + rojo = RGB 206-000-099
Azul violáceo = azul + violeta = RGB 132-008-255
Verde azulado = verde + azul = RGB 000-160-140
Amarilloso verdoso = verde + amarillo = RGB 222-255-000


Nuestro objetivo es construir un gráfico con los colores del tipo seleccionados en las celdas K1:K3.

Para ello añadimos tres 'casillas de verificación' vinculadas cada una de ellas a la celda que tiene debajo (en K1:K3).
A modo de ejemplo veamos la primera..

VBA: Color RGB y el Círculo Cromático en Excel



A partir del resultado obtenido en las celda vinculadas K1:K3 se rellenarán las fórmulas del campo 'Selección' en la tabla 'TblCromatica'.
La fórmula será un sencillo condicional para marcar rápidamente las filas con las que trabajar.
Para las filas de colores primarios añadimos:
=SI($K$1;"x";"")

Para las filas de colores secundarios:
=SI($K$2;"x";"")

Y para las filas de terciarios:
=SI($K$3;"x";"")

VBA: Color RGB y el Círculo Cromático en Excel



Estas 'equis' nos servirán posteriormente en la macro para saber qué colores trasladar al gráfico.

En el paso siguiente generamos un rango K10:N21 al que hemos asignado un nombre definido:
rngColores =colores!$K$10:$N$21

además en el rango O10:O21 hemos añadido la siguiente fórmula:
=SI(K10<>"";1/CONTARA($K$10:$K$21);"")

que permite asignar una parte igual en función de los colores trasladados o seleccionados en K1:K3.

VBA: Color RGB y el Círculo Cromático en Excel



Por otra parte sobre el rango discontinuo: K9:K21 + O9:O21 construimos un gráfico Circular con la leyenda a la derecha y sin título de gráfico, y al que he llamado 'chCirculoCromatico'.

Este gráfico es necesario que exista para el correcto funcionamiento de la macro siguiente...


Tenemos todo lo necesario:
1- controles del tipo 'casilla de verificación' (tres, uno por tipo: primario, secundario y terciario)
2- una tabla con la información de los colores y sus valores de color RGB (tabla 'TblCromatica')
3- un rango K9:O21 donde volcar datos desde la 'TblCromatica' y que
4- alimentará el gráfico circular llamado 'chCirculoCromatico'


Insertaremos el siguiente procedimiento en un módulo estándar, para luego asociar la macro a un botón:

Sub CirculoCromatico()
'limpiamos datos anteriores
Range("rngColores").ClearContents

Dim rng_R As Range, rng_G As Range, rng_B As Range
Set rng_R = Range("TblCromatica[Red]")
Set rng_G = Range("TblCromatica[Green]")
Set rng_B = Range("TblCromatica[Blue]")

Dim rng_Color As Range
Set rng_Color = Range("TblCromatica[Color]")

'TRasladamos nueva selección
Dim color As String
x = 0: y = 0
For Each celda In Range("TblCromatica[Selección]")
    y = y + 1
    'recuperamos valores de la TblCromática
    color = rng_Color.Item(y).Value
    rojo = rng_R.Item(y).Value
    verde = rng_G.Item(y).Value
    azul = rng_B.Item(y).Value
    'si el color está seleccionado
    If celda.Value = "x" Then
        'llevamos datos al área del gráfico
        '1.descripción del color
        Range("K10").Offset(0 + x, 0).Value = color
        '2. valor de rojo
        Range("K10").Offset(0 + x, 1).Value = rojo
        '3. valor de verde
        Range("K10").Offset(0 + x, 2).Value = verde
        '4. valor de azul
        Range("K10").Offset(0 + x, 3).Value = azul
        
        x = x + 1
        'y trasladamos el color al punto de la serie del gráfico
        'ajustamos el color de cada partición del gráfico
        'que YA está creado y se llama 'chCirculoCromatico'
        Set ChtObj = ActiveSheet.ChartObjects("chCirculoCromatico")
        With ChtObj
            Set ser = .Chart.SeriesCollection(1)
            'punto.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            'llevamos el color al punto de la serie
            With ser.Points(x).Format.Fill
                .Visible = msoTrue
                .ForeColor.RGB = RGB(rojo, verde, azul)
                .Transparency = 0
                .Solid
            End With
        End With
    End If
Next celda

'liberamos memoria
Set rng_R = Nothing
Set rng_G = Nothing
Set rng_B = Nothing
Set rng_Color = Nothing
Set ser = Nothing

End Sub



Hemos finalizado. Podemos seleccionar en los controles la categoría de color a mostrar en nuestro círculo cromático...

Por ejemplo, solo primarios..

VBA: Color RGB y el Círculo Cromático en Excel



O Primarios y Secundarios..

VBA: Color RGB y el Círculo Cromático en Excel



O cualquier otra combinación posible...

2 comentarios:

  1. Saludos desde Venezuela. Muchas gracias por compartir, interesante ejercicio aunque se me presenta una duda: ¿Cómo le asigno un nombre al gráfico circular? He buscado la forma, más no he dado con ella. De antemano, muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola Justo,
      como a cualquier gráfico solo tienes que seleccionar el gráfico y en el Cuadro de nombre (a la izquierda de la barra de fórmula) introduces el nuevo nombre...
      Saludos!

      Eliminar