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 de santiagomf
1
1
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
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