Sie sind auf Seite 1von 8

PARA SUMAR POR EL COLOR DE FONDO

Function ContarColorFondo(rngCeldaColor As Range, rngRangoAContar As


Range) As Long
Dim rngCelda As Range
For Each rngCelda In rngRangoAContar
If rngCelda.Interior.ColorIndex = rngCeldaColor.Cells(1,
1).Interior.ColorIndex Then ContarColorFondo = ContarColorFondo + 1
Next rngCelda
Set rngCelda = Nothing
End Function

FUNCION PARA SUMAR EL COLOR DE LA CELDA MAS EL CONTENIDO


Function SUMACOLOR(RangoColor As Range, CeldaColor As Range) As
Double

Dim rngCelda As Range

'revisamos cada celda del rango


For Each celda In RangoColor

'si los colores coinciden, sumar el valor de la celda al resultado previo


If celda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex And
IsNumeric(celda) Then
SUMACOLOR = SUMACOLOR + celda.Value
End If

Next

End Function

eseamos contar y sumar los valores de ciertas celdas segn su color. Para

ello, hemos de utilizar MacroFunciones tambin denominadas Funciones


Diseadas por el Usuario, que se programan como si se tratara de una macro, en
el Editor de Visual Basic. En este Post aprenderemos a manejar los 56 colores
bsicos que podemos poner como fondo a una celda. Esto se hace con la
instruccin ColorIndex.

Hoja 1
En la primera hoja tenemos tres macros, con tres botones. La primera que
deberamos ejecutar es 'Limpia' que borra el contenido y los formatos de las
columnas C y E. Al efectuar la limpieza observamos que las columnas F y G nos
dan error, ya que la frmula que contienen deja de funcionar. Luego veremos como
se resuelve este error.
El botn 'Lista Colores' lanza la macro denominada 'marcas' que genera, en la
columna C, una lista con los nmeros del 1 al 56. A cada una de esas celdas las
dota del color correspondiente segn su cdigo de color entre 1 y 56.
Observar que al lanzar esta macro la columna G ya nos est dando el cdigo de
color gracias a una funcin que luego veremos. Por el contrario en la columna F
obtenemos un cdigo extrao (-4142).
Cdigo:

Sub marcas()
'Pone un tono de color a cada celda entre 1 y 56
Dim i As Integer
For i = 1 To 56
With Range("C5").Offset(i, 0)
.Value = i
.Interior.ColorIndex = i
.Interior.Pattern = xlSolid
End With
Next
End Sub

El botn 'Detecta Color' lanza la macro denominada DetectaColor.

Cdigo:

Sub DetectaColor()
'Detecta el tono de color de cada celda
'y pone su nmero a la derecha de la celda
Dim i As Integer
Dim ColorCelda As Integer
Range("C5").Select
For i = 1 To 56
Selection.Offset(1, 0).Select
ColorCelda = Selection.Interior.ColorIndex
Selection.Offset(0, 2).Value = ColorCelda
Next

Range("A1").Select
End Sub

Vamos a crear una funcin que nos proporcione el nmero del color entre 1 y 56.
La funcin se denomina Num_Color.

Cdigo:

Function num_color(Celda As Range)


num_color = Celda.Interior.ColorIndex
End Function

Esta funcin estar disponible en el Asistente de Funciones dentro de la categora


de funciones 'Definidas por el usuario'. En la columna F determinamos con esta
funcin el cdigo de colore correspondiente a cada celda de la columna C. Si la
funcin se aplica para calcular el color de una celda vaca nos da el resultado
-4142. Si se aplica sobre una celda con cierto color nos da un nmero entre 1 y 56.
Pero si se cambia posteriormente el color de esa celda la frmula no se actualiza
automticamente, ni siquiera pulsando la tecla F9 de reclculo manual. Este es el
motivo por el que al limpiar (borrar) los valores de la columna C, en la columna F
obtuviramos errores. Para que la funcin refresque debemos editarla, o pulsando
F2 y luego pulsando Enter, o haciendo doble clic con el ratn sobre ella y luego
pulsando Enter.
Una forma parcial de paliar esto es realizando una pequea modificacin de la
frmula, que es la que podemos ver en la columna G. En la celda G6 escribimos:
=num_color(C6)+AHORA()*0
Lo que hacemos es aadir una funcin volatil. La funcin =AHORA() nos
proporciona la fecha y hora actuales del sistema. Con este truco conseguimos que
las frmulas de la columna G se actualicen al pulsar la tecla F9. Haga la prueba,
cambie el color de una celda de la columna C y pulse F9, ver como en la columna
G se actualiza el nmero que corresponde al color modificado.

Hoja 2
En la Hoja2 vamos a desarrollar funciones (macrofunciones) que permiten contar y
sumar segn los colores asignados a las celdas de un rango.

Primero generamos en la columna C una serie de 20 celdas con diferentes colores


cuyo cdigo de color va entre 3 y 8, de forma aleatoria. Cada una de las 20 celdas
del rango C5:C24 contiene un valor numrico generado de forma aleatoria entre
100 y 200. La macro que permite generar los valores de la columna C se denomina
color_aleatorio. Se ejecuta pulsando sobre el botn rectangular incrustado en la
Hoja2 que tiene por titulo "Genera Colores Aleatorios".

Cdigo:

Sub color_aleatorio()
'Pone a cada celda un tono de color
'aleatoriamente entre 3 y 8
Dim i As Integer
For i = 1 To 20
With Range("C4").Offset(i, 0)
.Value = Int(Rnd() * 100) + 100
.Interior.ColorIndex = Int(Rnd() * 6) + 3
.Interior.Pattern = xlSolid
End With
'ahora generamos la columna D
Range("C4").Offset(i, 1).Value = Int(Rnd() * 500) + 500
Next
End Sub

Funcin que permite CONTAR segn


color
Queremos contar cuantos colores existen de cada tipo en la columna C. Cuantos
rojos, azules, amarillos, rosas o azules claro existen. En total deben sumar 20 que
son las celdas coloreadas de la columna C.

Mtodo 1
La funcin contar_color nos permite contar los colores que existen en RangoColor
que sean iguales al color de CeldaColor.

Cdigo:

Function contar_color(RangoColor As Range, CeldaColor As Range)


Dim Celda As Range
For Each Celda In RangoColor
If Celda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex Then
contar_color = contar_color + 1
End If
Next
End Function

En la columna G utilizamos la funcin contar_color para determinar cuantas celdas


de la columna C son de color rojo, verde, azul, amarillo, rosa o azul claro. En la
celda G6 calculamos las celdas de color rojo con la expresin:
=contar_color($C$5:$C$24;F6)+AHORA()*0
En la celda G12 contamos los valores obtenidos y comprobamos que son 20,
tantos como celdas existen en el rango C5:C24. En la celda G13 comprobamos
que cuadra la suma.
=CONTAR(C:C)=G12

Mtodo 2
Creamos la columna auxiliar B que utiliza la funcin =num_color que ya hemos
visto en la Hoja1. La frmula de la celda B5 es:
=num_color(C5)+AHORA()*0

De esta forma conseguimos tener en la columna B el cdigo del color


correspondiente de la columna C.
Las celdas rojas tendrn cdigo 3

las verdes tendrn cdigo 4

las azules tendrn cdigo 5

las amarillas tendrn cdigo 6

las rosas tendrn cdigo 7 y

las de color azul claro tendrn cdigo 8


En la columna H utilizamos la funcin =CONTAR.SI para determinar el nmero de
celdas que existen de cada color. En la celda H6 escribimos la expresin que nos
da las celdas de color rojo:
=CONTAR.SI($B$5:$B$24;F6)
En la celda H13 comprobamos mediante una frmula matricial que ambos mtodos
arrojan los mismos resultados.
{=SUMA(--(G6:G11=H6:H11))=6}

Funcin que permite SUMAR segn


color
Ahora deseamos sumar los importes de las celdas en funcin del color. Queremos
saber cuanto suman las de color rojo, y las de color verde, y las de color azul, ....

Mtodo 1
La funcin sumar_color nos permite sumar el valor numrico de las celdas de un
rango segn que el color de esa celda se corresponda con el de una celda
concreta denominada CeldaColor.
En la columna I calculamos la suma de las celdas de la columna C por cada color.
En la celda I6 calculamos la suma de las celdas de color rojo:
=sumar_color($C$5:$C$24;F6)+AHORA()*0

Cdigo:

Function sumar_color(RangoColor As Range, CeldaColor As Range)


Dim Celda As Range
For Each Celda In RangoColor
If Celda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex Then
sumar_color = sumar_color + Celda.Value
End If
Next
End Function

Mtodo 2
En la columna J calculamos la suma por colores con la funcin =SUMAR.SI. En la
celda J6 tenemos la expresin:
=SUMAR.SI($B$5:$B$24;F6;$C$5:$C$24)

Mtodo 3
El mtodo 3 considera que puede suceder que lo que pretendamos sumar no est
precisamente en el mismo rango que se encuentran las celdas coloreadas. En este
caso, las celdas coloreadas se encuentran en la columna C y las celdas que
queremos sumar estn en la columna D. Es necesario que el rango que se desea

sumar (D5:D24) sea de la misma dimensin que el rango en el que se encuentran


las celdas coloreadas (C5:C24).
Esto se hace con la funcin sumar_color2.

Cdigo:

Function sumar_color2(RangoColor As Range, _


CeldaColor As Range, RangoSuma As Range)
Dim Celda As Range
Dim col As Long
col = RangoSuma.Column - RangoColor.Column
For Each Celda In RangoColor
If Celda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex Then
sumar_color2 = sumar_color2 + Celda.Offset(0, col).Value
End If
Next
End Function

En nuestro caso utilizamos la columna K para generar estas sumas. La celda K6


tiene la siguiente expresin:
=sumar_color2($C$5:$C$24;F6;$D$5:$D$24)+AHORA()*0

Mtodo 4
Para sumar los importe de la columna D segn los colores de la columan C
utilizamos la funcin =SUMAR.SI. Esto se hace en la columna L. La celda L6 tiene
la siguiente expresin:
=SUMAR.SI($B$5:$B$24;F6;$D$5:$D$24)
Aqu nuevamente hemos utilizado la columna auxiliar B, que es donde calculamos
el cdigo de color de las celdas de la columna C.

Mtodo 5
El mtodo 5 es una variante del mtodo 3. En muchos casos el tercer argumento
coincidir con el primero. Esto es, el RangoSuma ser igual en muchos casos al
RangoColor, por lo que vamos a convertir este tercer argumento en optativo. Si no
se indica nada en este tercer argumento (RangoSuma) se supondr que lo que
queremos sumar esta precisamente en las celdas coloreadas (RangoColor).

Cdigo:

Function sumar_color3(RangoColor As Range, _


CeldaColor As Range, Optional RangoSuma As Range)
Dim Celda As Range
Dim col As Long
If RangoSuma Is Nothing Then
col = 0
Else
col = RangoSuma.Column - RangoColor.Column
End If
For Each Celda In RangoColor
If Celda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex Then
sumar_color3 = sumar_color3 + Celda.Offset(0, col).Value
End If
Next
End Function

Esto se calcula en la columan M. Concretamente en la celda M6 tenemos la


frmula:
=sumar_color3($C$5:$C$24;F6)+AHORA()*0
Expresin que nos permite utilizar nicamente dos argumentos, y en la que
sumamos los valores de la columna C cuya celda es de color rojo. Al no utilizar el
tercer argumento que es optativo, lo que estamos haciendo es indicar a la frmula
que lo que deseamos sumar est en la columna C que es donde se encuentran las
celdas coloreadas.

Observaciones

Si cambiamos un color es necesario pulsar F9 (tecla de reclculo manual)


para que se actualicen los clculos. Para que esto funcione es por lo que hemos
aadido en las funciones la suma de la funcin =AHORA() multiplicada por cero.

Las formulas que cuentan y suman segn colores NO funcionan si los


colores se obtienen con Formato Condicional.
Las funciones creadas por el usuario pueden llevar argumentos optativos.
Para ello se debe utilizar la palabra clave Optional. En el siguiente ejemplo, se
suman las variables a y b. La variable b es optativa y si no se pone nada se
considera que vale 1.