¿Cómo sumar el 50% de los valores escogidos más uno que sean los más altos?
Me explico con un ejemplo :
Tengo 5 números en las celdas:
A1 = 5
B1=8
C1=2
D1=4
E1=3
Entonces quiero seleccionar las 5 celdas y que haga la suma del 50% del total de celdas (5 celdas) más uno, en este ej. 3 celdas, y que esas 3 celdas sean en concreto las de valores más altos (en este ejemplo serían 5 +8+4 =17 ).
1 Respuesta
Te anexo una función
Function SumarAltos(celdas As Range) 'Por.Dante Amor n = celdas.Count m = Int(n / 2) + 1 If m > 0 Then For i = 1 To m wsum = wsum + WorksheetFunction.Large(Range("A1:E1"), i) Next End If SumarAltos = wsum End Function
Sigue las Instrucciones para una Función
- Abre tu libro de excel
- Para abrir VBa y poder pegar la función, Presiona Alt + F11
- En el menú elige Insertar / Módulo
- En el panel del lado derecho copia la función
- En cualquier celda utiliza la función, como cualquier otra función de excel
Escribe la función =SumarAltos en la celda que quieras el resultado, dentro de la función escribe el rango de celdas, Ejemplo:
Saludos. Dante Amor
He probado y no me vale para lo que quería, doy más detalles a ver si me podéis ayudar.
lo que quiero hacer es un ranking en el que se tienen en cuanta la mitad de las pruebas más una para sumar el total, en el ejemplo que pongo son 4 pruebas (marcadas en verde los puntos de cada una) al ser 4, la mitad más 1 es 3 (4/2+1=3) las 3 pruebas con mayor puntuación claro.
En la respuesta anterior parece que funcionaba pero no puedo arrastrar para obtener el mismo resultado en otras filas y claro me interesa poder arrastrarlo para todos los competidores.
Un saludo y gracias de nuevo.
Te anexo la macro actualizada
Function SumarAltos(cel1 As Range, Optional cel2 As Variant, Optional cel3 As Variant, _ Optional cel4 As Variant, Optional cel5 As Variant, Optional cel6 As Variant, _ Optional cel7 As Variant, Optional cel8 As Variant, Optional cel9 As Variant) 'Por.Dante Amor If IsMissing(cel2) Then Set celdas = cel1 Else If IsMissing(cel3) Then Set celdas = Union(cel1, cel2) Else If IsMissing(cel4) Then Set celdas = Union(cel1, cel2, cel3) Else If IsMissing(cel5) Then Set celdas = Union(cel1, cel2, cel3, cel4) Else If IsMissing(cel6) Then Set celdas = Union(cel1, cel2, cel3, cel4, cel5) Else If IsMissing(cel7) Then Set celdas = Union(cel1, cel2, cel3, cel4, cel5, cel6) Else If IsMissing(cel8) Then Set celdas = Union(cel1, cel2, cel3, cel5, cel6, cel7) Else If IsMissing(cel9) Then Set celdas = Union(cel1, cel2, cel3, cel5, cel6, cel7, cel8) Else Set celdas = Union(cel1, cel2, cel3, cel5, cel6, cel7, cel8, cel9) End If End If End If End If End If End If End If End If ' n = 0 For Each c In celdas If c.Value > 0 Then n = n + 1 End If Next ' m = Int(n / 2) + 1 If m > 0 Then For i = 1 To m wsum = wsum + WorksheetFunction.Large(celdas, i) Next End If SumarAltos = wsum End Function
Por lo que veo en tu imagen, del rango de celdas desde la D hasta la K, solamente estás ocupando 4 celdas.
La función que te estoy enviando ahora funciona un poco diferente, si las celdas que vas a ocupar están salteadas, es decir, no es un rango consecutivo, entonces tienes que poner la función así:
=SumarAltos(E3,G3,I3,K3)
Ejemplo:
Nota: Por la configuración de tu país, tal vez tengas que separar cada celda por punto y coma:=SumarAltos(E3;G3;I3;K3)
Otra forma que tiene esta nueva función, es que le puedes indicar solamente un rango de celdas consecutivas:
=SumarAltos(E4:K4)
Otra forma es que le puedes indicar varios rangos:
=SumarAltos(D7:E7,F7:G7,H7:I7,J7:K7)
La función soporta 9 celdas o 9 rangos o la combinación de celdas y rangos hasta 9
=SumarAltos(D7:E7,G7,I7,J7:K7)
Cualquier opción que utilices ahora sí, puedes arrastrar la fórmula.
Saludos. Dante Amor
Encontré un detalle a la función, te anexo la función actualizada
Function SumarAltos(cel1 As Range, Optional cel2 As Variant, Optional cel3 As Variant, _ Optional cel4 As Variant, Optional cel5 As Variant, Optional cel6 As Variant, _ Optional cel7 As Variant, Optional cel8 As Variant, Optional cel9 As Variant) 'Por.Dante Amor If IsMissing(cel2) Then Set celdas = cel1 Else If IsMissing(cel3) Then Set celdas = Union(cel1, cel2) Else If IsMissing(cel4) Then Set celdas = Union(cel1, cel2, cel3) Else If IsMissing(cel5) Then Set celdas = Union(cel1, cel2, cel3, cel4) Else If IsMissing(cel6) Then Set celdas = Union(cel1, cel2, cel3, cel4, cel5) Else If IsMissing(cel7) Then Set celdas = Union(cel1, cel2, cel3, cel4, cel5, cel6) Else If IsMissing(cel8) Then Set celdas = Union(cel1, cel2, cel3, cel4, cel5, cel6, cel7) Else If IsMissing(cel9) Then Set celdas = Union(cel1, cel2, cel3, cel4, cel5, cel6, cel7, cel8) Else Set celdas = Union(cel1, cel2, cel3, cel4, cel5, cel6, cel7, cel8, cel9) End If End If End If End If End If End If End If End If ' n = 0 For Each c In celdas If c.Value > 0 Then n = n + 1 End If Next ' m = Int(n / 2) + 1 If m > 0 Then For i = 1 To m wsum = wsum + WorksheetFunction.Large(celdas, i) Next End If SumarAltos = wsum End Function
Hola,
he estado utilizando el módulo que me hiciste sin problema, pero... ahora se me ha dado el caso de 5 números/celdas a tener en cuenta, por lo que la mitad (=2,5) (redondeado al alza (=3)) más 1 (3+1=4) sería 4. Y la fórmula me está sumando solo 3. Se puede corregir esto?
En tu pregunta original al seleccionar 5 celdas, el resultado es 3, revisa tu ejemplo:
Entonces quiero seleccionar las 5 celdas y que haga la suma del 50% del total de celdas (5 celdas) más uno, en este ej. 3 celdas, y que esas 3 celdas sean en concreto las de valores más altos (en este ejemplo serían 5 +8+4 =17 )
Si quieres que ahora sea 4, entonces cambia esta línea:
m = Int(n / 2) + 1
Por esta:
m = WorksheetFunction.RoundUp((n / 2), 0) + 1
Revisa si es lo que necesitas, de lo contrario, crea una nueva pregunta para revisar los resultados.
- Compartir respuesta