sábado, abril 11, 2009

Cronómetro para competencias con Excel.

Dado que Excel nos permite hacer cálculos con tiempo, la tentación de crear un cronómetro para medir tiempos en competencias es muy grande. Y efectivamente, se puede hacer, pero hay que tomar en cuenta algunas desventajas y defectos potenciales de crear un cronómetro con Excel. Sin entrar en detalles técnicos podemos decir que la principal desventaja es que Excel no fue creado para medir tiempos de competencias y por lo tanto no podemos garantizar la precisión de la medición.

Dicho esto, mostraremos en esta nota cómo construir con Excel un cronómetro par competencias.

Empezamos por crear una hoja donde registraremos los competidores y los tiempos.





En la fila 6 hemos puesto tres botones a los cuales le asociaremos macros, cuyo cometido explicaré más adelante.

En las files 8-9 usamos botones en lugar de texto en celdas para facilitar el código de las macros. Estos botones no están asociados a ninguna macro y sólo funcionan como encabezamientos de las columnas.

Nuestro modelo funciona de la siguiente manera:

En la columna A, a partir de la celda A10 introducimos los nombres de los participantes en la competencia.

Una vez registrados los participantes apretamos el botón “Largar”. La hora de largada (hora, minuto, segundos, milésimas de segundo) queda registrada en la celda B6. A medida que los competidores van llegando a la meta, hacemos un doble clic en la celda de la columna B a lado del nombre. Esto hace que en la celda se registre el momento de la llegada.
Una vez terminada la competencia se pulsa el botón Cerrar. Esto hará que la lista de competidores se ordene por orden de llegada y se calcule la diferencia respecto al primero.

Esta es la situación al terminar la competencia


Y ésta después de apretar el botón Cerrar



Todo el proceso puede verse en esta captura de pantalla


Este modelo funciona en base a la función Timer del Vba (Visual Basic for Applications, el lenguaje macro de Excel). La función Timer da la cantidad de segundos transcurridos desde la medianoche (00:00:00). Al apretar el botón Largar, registramos la cantidad de segundos transcurridos desde la medianoche y ponemos el dato en la celda B6. Pero previamente lo dividimos por 86400 para poder expresarlo como hora (hora, minutos, segundos y milésimas de segundo).

Un detalle importante: todas las celdas que contienen tiempos están formadas con este formato personalizado

hh:mm:ss.000

En un módulo común del editor de Vb ponemos este código y lo ligamos al botón Largar

Sub largada()
startTime = Timer
Range("B6") = startTime / 86400
End Sub


Para registrar el momento de llegada de cada competidor necesitamos dos herramientas: un evento que registre que hemos hecho un doble clic en la celda de llegada del competidor y una macro que calcule el momento y lo registre en la celda correspondiente.

El código del evento va en un módulo de la hoja. En el editor de Vb hacemos un doble clic sobre el icono de la hoja Competencia



y en el módulo que se abre ponemos este código

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim Partic As Long, partList As Range

Partic = Range("A10").CurrentRegion.Rows.Count - 1

Set partList = Range(Range("A10").Offset(0, 1), _
Range("A10").Offset(Partic, 1))

If Union(Target, partList).Address = partList.Address And _
IsEmpty(Target) Then Call llegada
End Sub

La tarea de este código es detectar si hemos hecho un doble clic sobre alguna de las celdas de la columna B al lado del nombre de un competidor. Además el código controla que la celda esté vacía, es decir que no hayamos registrado el tiempo de llegada previamente. Si se cumplen ambas condiciones, se activa la macro “llegada”. La tarea de esta macro es registrar la hora de llegada y el tiempo transcurrido desde el comienzo de la competencia.

Esta macro va en un módulo común del editor de Vb y su código es:

Sub llegada()
Dim finalTime As Single
finalTime = Timer
ActiveCell = finalTime / 86400
ActiveCell.Offset(0, 1) = ActiveCell - Range("B6")
End Sub

Ahora necesitamos ligar una macro al botón Cerrar. Esta macro debe ordenar los competidores por orden de llegada y calcular las diferencias respecto al primero. El código de esta macro es:

Sub cierre_comp()

Dim Participantes As Long, iX As Long

On Error Resume Next
Range("A10").CurrentRegion.Sort Key1:=Range("C10"), Order1:=xlAscending, Header:= _
xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
On Error GoTo 0

'calcula la diferencia con el primero

Participantes = Range("A10").CurrentRegion.Rows.Count

For iX = 1 To Participantes - 1
Range("A10").Offset(iX, 3) = Range("A10").Offset(iX, 2) - _
Range("A10").Offset(0, 2)
Next iX
End Sub


Finalmente ligamos este código al botón Reset, para borrar todos los datos y poder comenzar una nueva competición:

Sub reset()
Range("B6").ClearContents
Range("A10").CurrentRegion.ClearContents
End Sub


Con esto hemos terminado de construir nuestro modelo.


Este modelo no es flexible, es decir, si cambiamos la estructura de la hoja al agregar o quitar filas o columnas, las macros dejarán de funcionar correctamente. Además no tiene ningún tipo de control para evitar entradas erróneas. Por ejemplo, necesitamos un control que impida largar la competencia si no se han introducido previamente la lista de competidores.

Un modelo flexible, que puede adaptarse al formato deseado, puede descargarse aquí. También incluye una hoja de instrucciones

10 comentarios:

  1. Bueno eso de "simbolico" por 5 euros, pues no se...pero si me pongo de parte del programador, pues es bueno que nos paguen 5 euritos, no esta mal, seria un plus.

    ResponderBorrar
  2. el archivo no esta disponible, súbanlo otra vez

    ResponderBorrar
  3. El sitio donde estaba el archivo cerró. Te sugiero que te comuniques conmigo por mail privado (fijate en el enlace Ayuda, en la parte superior de la plantilla).

    ResponderBorrar
  4. El archivo está excelente!!! Muchas gracias....quisiera saber si es posible generar uno en donde la competencia tenga varias vueltas, es decir, la carrera tienen un numero "X" de vueltas y al final la sumatoria de cada una de esas vueltas es el tiempo total por competidor

    ResponderBorrar
  5. Se puede, pero hay que modificar el código, obviamente. Te sugiero que hagas una búsqueda en la Internet; hay muchos cronómetros similares, seguramente alguno con las características que estás buscando.

    ResponderBorrar
  6. Hola Jorge. Soy Profesor de Química de Secundario y junto a mis alumnos queríamos darte las gracias porque en verdad tu código del cronómetro para competencias nos ha sido de mucha utilidad.

    ¿Podrías ayudarnos con una duda? el tema es el siguiente: tenemos un proyecto escolar en donde una serie de sensores, envían un "clic de mouse" a una pc ante determinados estímulos. (eventos). Con ayuda de tu código hemos logrado que ante un clic se registre el tiempo (según tu formato sugerido) en la celda B6.

    Hasta ahí todo perfecto, pero necesitamos que ante cada "nuevo clic" sobre el mismo botón la información quede registrada en las celdas subsiguientes.
    Para explicarme mejor:

    1º clic = registrado en celda B6
    2º clic = registrado en celda B7
    3º clic = registrado en celda B8 .... y así en las celdas sucesivas.

    Ten en cuenta que el clic se produce siempre sobre el mismo botón, no con doble clic en celdas distintas como en tu cronómetro.

    Los muchachos y quien te escribe agradeceríamos inmensamente tu ayuda.
    Un abrazo y gracias por compartir tu experiencia y conocimiento.

    Saludos. Alejandro Guatta

    ResponderBorrar
  7. Hola Alejandro,

    te sugiero que me envíes el modelo que están usando (fíjate en el enlace Ayuda, en la parte superior del blog). Me "pescas" justo un día antes de partir de viaje (vacaciones) a la Argentina, por tres semanas. Así que no puedo comprometerme a responder rápidamente, pero haré lo posible.
    Por lo que entiendo de tu consulta, me parece que la solución es sencilla. Hay que crear una rutina que vaya contando los clics y poniendo cada nuevo dato en la celda correspondiente.

    ResponderBorrar
  8. Hola: estoy buscando un cronometro y me gusto la sencillez de este...ahora: hay posibilidad de que el evento que registre el tiempo de un competidor en lugar de hacerse con un doble click junto al nombre sea ingresando un Número (de Dorsal o Pechera) previamente asignado en una celda y al darle Enter a ese Número registre su tiempo?? espero que me entienda,muchas gracias!

    ResponderBorrar
  9. Hola Wally,
    se puede hacer pero afectaría la precisión de la medida ya que toma más tiempo ingresar el número y apretar Enter que hacer un doble clic en la celda-

    ResponderBorrar
  10. Excelente cronómetro! Nos ha sido de mucha utilidad para el III festival de Cross Country de la Escuela de Ciclomontañismo de Mosquera!!! :D

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.