Macro que presenta un reloj en la hoja de cálculo

Insertar un reloj en una hoja de cálculo no es de lo más práctico que se me ocurre, pero si que es una forma de ver como podemos utilizar una variable a nivel de módulo para controlar desde una subrutina el comportamiento de otra subrutina en la que existe un bucle.

En el documento Calc que puedes bajar desde aquí Reloj.zip encontrarás el código que vamos a analizar, por si prefieres no teclear.

Abre un nuevo documento de Calc y guárdalo con el nombre Reloj

Activa el editor de macros (desde el meú Herramientas > Macros > Organizar Macros > OpenOffice.org Basic... ) y selecciona en la lista Macro desde la carpeta Standard de tu documento Reloj.ods; haz clic sobre el botón Nuevo.

Acepta el diálogo que te propone el nombre del nuevo módulo.

El código

En primer lugar vamos a crear la variable a nivel de módulo que controlará si la macro que maneja el reloj sigue ejecutándose. Antes de cualquier sentencia, agregaremos:

Dim Detener As Boolean

Como cualquier variable booleana, se iniciará por defecto como False.

Ahora teclearemos la subrutina que ejecutará el reloj, que es la que a continuación observas:

Sub Reloj
Dim oDoc As Object
Dim oHoja As Object
Dim oCelda As Object

oDoc=ThisComponent
oHoja=oDoc.Sheets.getByName("Hoja1")
oCelda=oHoja.getCellRangeByName("B2") ' Celda B2
Detener= False

Do
oCelda.SetString(Now)
Wait 1000
if Detener then exit Do
Loop While 1
oCelda.SetString("DETENIDO")
End Sub

Las tres primeras líneas de la sub declaran tres variables de tipo Object a nivel de subrutina. A continuación, asignamos a la variable oDoc el componente que se está ejecutando, que será nuestro documento de Calc; desde este componente, tomaremos la Hoja1 y la asignamos a la variable oHoja; finalmente, asignamos a la variable oCelda la celda B2 de la Hoja1. Establecemos la variable a nivel de módulo Detener a False.

El bucle Do contiene tres líneas: asigna a la celda el valor de la función Now, que devuelve la fecha y hora actual. Espera 1000 milisegundos, o sea, un segundo, y testea si la variable Detener ha cambiado; si sigue siendo False, repetirá el bucle, pero si cambia a True entonces abandonará el bucle.

Al abandonarlo, insertará en la celda el texto "DETENIDO" y finalizará la macro.

Ahora teclearemos la subrutina que se encargará de detener el reloj. Es la siguiente:

Sub PararReloj
Detener= True
End Sub

Esta rutina tan solo cambia el estado de la variable a nivel de módulo Detener; como esta variable es visible para todas las funciones y subrutinas contenidas en el módulo, al cambiarla a True podrá ser testeada por la rutina Reloj si se está ejecutando, forzando a que salga del bucle y se detenga el reloj.

Guardamos y cerramos el editor Basic. En la Hoja1 de nuestro documento podemos agregar dos botones, uno para que active el reloj (llama a la macro Reloj) y otro para que lo detenga (llama a la macro PararReloj.

No hay reacciones, todavía


Form is loading...