¿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

Respuesta
1

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

  1. Abre tu libro de excel
  2. Para abrir VBa y poder pegar la función, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la función
  5. 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

¡Gracias! Muchas gracias!! 

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

¡Gracias! Ahora sí, eres un fenómeno, muchas gracias de nuevo!!

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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas