Sumar automáticamente

Hola igual es un poco complicado o no se puede hacer, la tabla es más amplia pero para lo que necesito fórmula es para estos datos.
nombre/  partidas jugadas / partidas ganadas / Juegos ganados/ juegos perdidos/
Alvaro 3 3 15 9
Bien, se podría usar alguna fórmula cada vez que se modifica los juegos ganados y los perdidos sumara una partida más a "partidas jugadas" y en caso que se ganara una más a partidas ganadas", la dificultad viene cuando las partidas ganadas pueden quedar a 5 (juegos ganados)- 0 (juegos perdidos), 5-1,5-2,5-3. Y las partidas perdidas puedes quedare 0-5, 1-5, 2-5, 3-5. Con lo cual aun perdiendo una partida puedes ganar juegos.
Muchas gracias de antemano

1 Respuesta

Respuesta
1
Te he preparado esta macro que creo que te servirá (al menos para ir ajustándola a tus necesidades):
Option Explicit
Const nomPagina = "Hoja1"
Sub agregarResultadoPartida()
    Dim nombre1 As String   ' Nombre del primer jugador
    Dim nombre2 As String   ' Nombre del segundo jugador
    Dim nLin1               ' Número de línea en la que está el primer jugador
    Dim nLin2               ' Número de línea en la que está el segundo jugador
    Dim juegos1 As Integer  ' Juegos ganados por el primer jugador
    Dim juegos2 As Integer  ' Juegos ganados por el segundo jugador
    Do ' Primer bucle para leer los nombres de los jugadores
        Do  ' Bucle para leer los datos del primer jugador
            nombre1 = leeNombreJugador("1")
            If nombre1 = "" Then Exit Sub ' Han pulsado cancelar
            nLin1 = buscaLineaJugador(nombre1)
            If nLin1 > 0 Then Exit Do ' Se ha encontrado el jugador
            MsgBox "Jugador no encontrado"
        Loop
        Do  ' Bucle para leer los datos del segundo jugador
            nombre2 = leeNombreJugador("2")
            If nombre2 = "" Then Exit Sub ' Han pulsado cancelar
            nLin2 = buscaLineaJugador(nombre2)
            If nLin2 > 0 Then Exit Do ' Se ha encontrado el jugador
            MsgBox "Jugador no encontrado"
        Loop
        If nLin1 <> nLin2 Then Exit Do
        MsgBox "ERROR: Los dos jugadores son el mismo"
    Loop
    ' Cuando yegua a aquí, tendremos los nombres de los dos jugadores y las líneas en las que están
    ' Ahora leeremos el número de juegos ganados por los dos jugadores
    Do ' De nuevo un bucle para leer los resultados de los dos y validarlos
juegos1 = leeJuegosGanados(nombre1)
        If juegos1 < 0 Then Exit Sub ' Han cancelado el proceso
        juegos2 = leeJuegosGanados(nombre2)
        If juegos2 < 0 Then Exit Sub ' Han cancelado el proceso
        If juegos1 >= 5 Or juegos2 >= 5 Then ' Alguno ha ganado, al menos, 5 juegos
            If Abs(juegos1 - juegos2) > 1 Then Exit Do ' Hay más de un juego de diferencia entre ambos jugadores. Nos vale
        End If
        MsgBox "ERROR: Ninguno de los dos jugadores ha llegado a 5 juegos o bien la diferencia entre ambos es menor que 2"
    Loop
    ' Ya sabemos quienes son los jugadores y los juegos ganados por cada uno. Sólo nos falta sumarlos a los
' valores que tuvieran antes
    ' Ahora sólo tenemos que... sumar los juegos ganados a cada uno de los 2 y poner asignar el ganador/perdedor de la
' partida dependiendo del resultado
    ' Empezamos sumando los juegos ganados y perdidos
sumaValorCelda nLin1, 4, juegos1 ' Los juegos ganados por 1 en la columna 4 (D) del jugador 1 (juegos ganados)
    SumaValorCelda nLin1, 5, juegos2 ' Los juegos ganados por 2 en la columna 5 (E) del jugador 1 (juegos perdidos)
    ' Y viceversa
    SumaValorCelda nLin2, 4, juegos2 ' Los juegos ganados por 2 en la columna 4 (D) del jugador 2 (juegos ganados)
    SumaValorCelda nLin2, 5, juegos1 ' Los juegos ganados por 1 en la columna 5 (E) del jugador 2 (juegos perdidos)
    If juegos1 > juegos2 Then
        ' Ha ganado el jugador 1. Sumamos 1 a su contador de ganados y 1 al de perdidos del jugador 2
sumaValorCelda nLin1, 2, 1 ' Partida ganada por el jugador 1. Sumamos 1 a la columna 2 (B)
        SumaValorCelda nLin2, 3, 1 ' Partida perdida por el jugador 2. Sumamos 1 a la columna 3 (C)
      Else
        ' Si no ha ganado el 1, lo habrá hecho el 2
sumaValorCelda nLin2, 2, 1 ' Partida ganada por el jugador 2. Sumamos 1 a la columna 2 (B)
        SumaValorCelda nLin1, 3, 1 ' Partida perdida por el jugador 1. Sumamos 1 a la columna 3 (C)
    End If
    MsgBox "Resultados agregados correctamente"
End Sub
Function leeNombreJugador(ByVal nJugador As String) As String
    leeNombreJugador = InputBox$("Nombre del jugador " & nJugador, "Leer nombre de jugadores")
End Function
Function buscaLineaJugador(ByVal nomJugador As String) As Integer
    Dim nLin As Long
    ' Buscamos el nombre en la columna 1 (la A)
    Debug.Print Cells.SpecialCells(xlCellTypeLastCell).Row
    For nLin = 1 To Sheets(nomPagina).Cells.SpecialCells(xlCellTypeLastCell).Row
        If UCase$(Sheets(nomPagina).Cells(nLin, 1)) = UCase$(nomJugador) Then Exit For
    Next nLin
    If nLin > Sheets(nomPagina).Cells.SpecialCells(xlCellTypeLastCell).Row Then
        ' No se ha encontrado
        buscaLineaJugador = -1
      Else
        ' Si se ha encontrado y está en la línea "nlin"
        buscaLineaJugador = nLin
    End If
End Function
Function leeJuegosGanados(ByVal nomJugador As String) As Integer
    Dim txt As String
    leeJuegosGanados = -1 ' Cuando sepamos los correctos los pondremos
    Do ' Repetimos hasta leer un valor correcto
        txt = InputBox$("Juegos ganados por " & nomJugador, "Leer los juegos ganados")
        If txt = "" Then Exit Function ' Han cancelado el proceso
        If IsNumeric(txt) Then ' Si es un número
            If Val(txt) = CDbl(txt) Then ' Y se trata de un número entero
                If Val(txt) >= 0 Then ' Y se trata de un número positivo...
                    leeJuegosGanados = Val(txt) ' Damos el valor por bueno
                    Exit Function
                End If
            End If
        End If
        MsgBox "No se ha tecleado un número, no es un número entero o tiene un valor negativo."
    Loop
End Function
Sub sumaValorCelda(ByVal nLin As Long, ByVal nCol As Integer, ByVal valorSumar As Integer)
    If Sheets(nomPagina).Cells(nLin, nCol) = "" Then
        ' La celda está vacía, ponemos directamente el valor
        Sheets(nomPagina).Cells(nLin, nCol) = valorSumar
      Else
        If IsNumeric(Sheets(nomPagina).Cells(nLin, nCol)) Then
            ' Ya tiene un valor numérico previo. Sumamos el valor nuevo
            Sheets(nomPagina).Cells(nLin, nCol) = Sheets(nomPagina).Cells(nLin, nCol) + valorSumar
          Else
            ' Tiene algo que no es un número. Avisamos y cambiamos el valor
            MsgBox "AVISO: la celda de la fila " & nLin & " y columna " & nCol & " contiene un valor que no es un " & _
                   "número. Se borra dicho valor para sumar el resultado actual"
            Sheets(nomPagina).Cells(nLin, nCol) = valorSumar
        End If
    End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas