Suma de celdas con color en formato condicional

Me gustaría sumar celdas con color determinado, que tienen formato condicional. He intentado hacer sumas con VBA, pero lo que he conseguido no diferencia colores y me suma todas los celdas.

Paso link con archivo detallado de lo que busco conseguir:

https://dl.dropboxusercontent.com/u/99404528/todoexpertos.xlsm

1 respuesta

Respuesta
1

Por lo que veo tienes una columna con los mínimos de cada fila, supongo que para el formato condicional.

También podrías usar esa columna para la suma con una función así:

Function sumarSiMismoValor(ByRef rangoDatos As Range, ByRef rangoMinimos As Range) As Double
Dim i As Integer
Dim suma As Double
If rangoDatos.Columns <> 1 Or rangoMinimos.Columns <> 1 Or _
rangoDatos.Rows <> rangoMinimos.Rows Then
suma = 999999999999#
Else
suma = 0
For i = 1 To rangoDatos.Rows
If rangoDatos.Cells(i, 1) = rangoMinimos.Cells(i, 1) Then
suma = suma + rangoDatos.Cells(i, 1)
End If
Next i
End If
sumarSiMismoValor = suma
End Function

Llamarías a la función con:

=sumarSiMismoValor(M8:M32;$AD$8:$AD$32)

Hola:

Gracias por la rapidez, pero no quiero sumar la última columna de la derecha.

Quiero tener resultado de la suma en cada una de las columnas independientemente, pongo una elipse roja en cada celda donde quiero ver el resultado de su propia columna.

Te pongo link:

https://dl.dropboxusercontent.com/u/99404528/Copia%20de%20todoexpertos.xlsm

Espero haberme explicado

Gracias de nuevo

Hola de nuevo

He estado probando tu respuesta anterior, me da error ¡valor!

En primer lugar: "lo siento", el código lo escribí mal porque lo hice por fuera de Excel. La función correcta y funcionando es esta:

Option Explicit
Function sumarSiMismoValor(ByRef rangoDatos As Range, ByRef rangoMinimos As Range) As Double
Dim i As Integer
Dim suma As Double
If rangoDatos.Columns.Count <> 1 Or rangoMinimos.Columns.Count <> 1 Or _
rangoDatos.Rows.Count <> rangoMinimos.Rows.Count Then
suma = 999999999999#
Else
suma = 0
For i = 1 To rangoDatos.Rows.Count
If rangoDatos.Cells(i, 1) = rangoMinimos.Cells(i, 1) Then
suma = suma + rangoDatos.Cells(i, 1)
End If
Next i
End If
sumarSiMismoValor = suma
End Function

En segundo lugar indicarte que la fórmula que tienes que poner en la celda "M34" sería la que te puse ayer:

=sumarSiMismoValor(M8:M32;$AD$8:$AD$32)

Y copiar la fórmula en cualquier otra celda de la fila 34 (exceptuando la columna AD que es dónde tienes los valores mínimos).

En la columna "Y" que indicas en tu ejemplo, la fórmula de la celda "Y34" sería:

=sumarSiMismoValor(Y8:Y32;$AD$8:$AD$32)

Como verás sólo tiene que cambiar el nombre de la columna del primer rango mientras que el segundo rango, en la columna AD, permanece fijo por el uso del carácter "$".

Por cierto, me puedes indicar cuál es el formato que tienen las celdas para que vayan cambiando de color.

Posiblemente mirando el formato se pueda hacer de otra forma, aunque no es seguro.

Perfecto ok, pero me he dado cuenta que no he resuelto el problema porque no puedo hacer el producto del valor mínimo con la celda "peso". Te paso ejemplo detallado

https://dl.dropboxusercontent.com/u/99404528/CONSULTA%20TDEX.xlsm

Te pido mil perdones, no me he dado cuenta

Gracias, un saludo

La fórmula que he metido en el formato condicional es

=W9=MIN(SI($W$9:$AN$9<>0;$W$9:$AN$9))

Un saludo

Hola: Sólo saber sí estabas con la solución

Un saludo Gracias

He estado intentado controlar el formato de la celda pero según Microsoft no se puede hacer desde el código VBA. Lógico, ya que el código podría modificar valores que a su vez cambiasen el formato. Miraré más cosas sobre ese tema para ver si algún día consigo algo; quizás desactivando el cálculo automático... no sé.

De momento te dejo esta función que sí te servirá:

Function sumarSiMismoValor(ByRef rangoDatos As Range, ByVal nColMinimos As Integer, ByVal nColPesos As Integer) As Double
Dim i As Integer
Dim iAnt As Integer
Dim suma As Double
iAnt = rangoDatos.Áreas(1).Row - 1 ' Líneas delante del rango
sumarSiMismoValor = -999999999999#
If rangoDatos.Columns.Count <> 1 Then Exit Function ' Has pasado más de una columna en el rango
suma = 0
For i = 1 To rangoDatos.Rows.Count
If rangoDatos.Cells(i, 1) = rangoDatos.Worksheet.Cells(iAnt + i, nColMinimos) Then
suma = suma + rangoDatos.Cells(i, 1) * rangoDatos.Worksheet.Cells(iAnt + i, nColPesos)
End If
Next i
sumarSiMismoValor = suma
End Function

Tienes que llamarla de la siguiente forma:

=sumarSiMismoValor(M8:M32;30;11)

El M8:M32 es tu rango; el 30 es el número de columna donde tienes los mínimos (la AD) y el 11 el número de columna donde tienes los pesos (K).

Hola: me da error #¡valor!

Espero que esta otra forma no falle:

Function sumarSiMismoValor(ByRef rangoDatos As Range, ByVal nColMinimos As Integer, ByVal nColPesos As Integer) As Double
Dim i As Integer
Dim iAnt As Integer
Dim suma As Double
Dim sh As Worksheet
Set sh = rangoDatos.Worksheet
iAnt = rangoDatos.Cells(1, 1).Row - 1 ' Líneas delante del rango
sumarSiMismoValor = -999999999999#
If rangoDatos.Columns.Count <> 1 Then Exit Function ' Has pasado más de una columna en el rango
suma = 0
For i = 1 To rangoDatos.Rows.Count
If rangoDatos.Cells(i, 1) = sh.Cells(iAnt + i, nColMinimos) Then
suma = suma + rangoDatos.Cells(i, 1) * sh.Cells(iAnt + i, nColPesos)
End If
Next i
sumarSiMismoValor = suma
Set sh = Nothing
End Function

La llamada es igual que en el caso anterior.

Añade tu respuesta

Haz clic para o