Jump to content
Sign in to follow this  
mjrofra

Reloj actualizable en userform

Recommended Posts

Abro este tema como una respuesta a una pregunta que me hizo Ernesto y que me pareció interesante y me generó curiosidad:

...com puedo hacer para que en una usrform me aparezca la hora y fecha...

Tras hacer algunas pruebas con application.ontime subo un archivo que puede resultar interesante.

Para reproducirlo se necesita una userform llamado "fmrReloj" con una etiqueta llamada "Reloj". Como código en el userform va esto:

Private Sub UserForm_Initialize()
Actualizar = True
[COLOR="red"]Reloj[/COLOR] = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Actualizar = False
End Sub[/CODE]

y en un módulo va esto:

[CODE=rich]Public Actualizar As Boolean
Sub Reloj()
frmReloj.Show (False)
End Sub
Sub Hora()
If Actualizar Then
[COLOR="green"]frmReloj[/COLOR].[COLOR="red"]Reloj[/COLOR] = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
End If
End Sub[/CODE]

No sé si a algo así se refería nuestro compañero Ernesto, pero aproveché que hoy es día festivo en Colombia y me entretuve un poco probando cómo podía hacerse algo así.

Cualquier sugerencia para mejorarlo o cualquier inconveniente por favor comentar :D.

Reloj.zip

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

el asunto es que parece que la recursividad no para,creo que es mejor utlizar la recomendacion que viene en la misma ayuda de VBA-excel y me refiero al Metodo "Ontime" que en su seccion correspondiente sugiere detener la recursividad con algo como esto:

Application.OnTime EarliestTime:=TimeValue("17:00:00"), Procedure:="my_Procedure", Schedule:=False

adaptado a mi caso seria (es mi reloj personal ,que uso desde hace mas de 3 años :rolleyes: )

Application.OnTime Now + TimeValue("00:00:01"), "Reloj", schedule:=False

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

Esta muy bueno, gracias.- (esto de meterme a hacer algo con userform me esta volviendo loco, pero en fin vale la pena porque a golpes se aprende).-

PD: re-edite mensaje para informar que ya pude hacerlo funcionar en mi userform, quedo impecable.-

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

Logroastur, muchas gracias por tu comentario.

ST, igualmente, aprecio mucho tu intervención. Fíjate que lo primero que intenté fue lo que indicas, pero no tuve mucho éxito :( así que decidí usar una variable pública tipo Boolean (Actualizar) para activar - desactivar la recursividad. De acuerdo con las pruebas que hice, pues igualmente me preocupaba mucho la recursividad, ésta se detiene al descargar el userform. Esto fue lo que usé para comprobarlo:

Sub Hora()
If Actualizar Then
frmReloj.Reloj = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
[COLOR="blue"]Debug.Print Time[/COLOR]
End If
End Sub[/CODE]

y haciendo lo mismo desactivando las líneas de verificación de la variable "Actualizar":

[CODE]Sub Hora()
[COLOR="green"]Rem If Actualizar Then[/COLOR]
frmReloj.Reloj = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
[COLOR="blue"]Debug.Print Time[/COLOR]
[COLOR="green"]Rem End If[/COLOR]
End Sub[/CODE]

En el segundo caso se puede ver cláramente en la ventana inmediato como la recursividad continúa, pero en el primero se detiene una vez descargado el userform.

De pronto estoy totalmente perdido, pero creo que una vez descargado el userform se detiene el ciclo del ontime. Claro está, mientras el userform está cargado, la recursividad se mantiene para ir actualizando la hora cada segundo... no me gusta mucho la idea de tener una macro ejecutándose cada segundo mientras el userform esté cargado, pero no encontré otro forma de hacerlo :D.

Una vez más, muy contento con tu presencia acá ST y espero me ayudes acá a darle mejor forma a esto.

Ernesto, lo que tienes que hacer para añadir el reloj a tu userform es añadirle a éste una etiqueta y llamarla "Reloj". Luego usas el mismo código que copié al inicio, pero cambiando el nombre del userform por el tuyo e incorporando el código al que ya tienes... revisa el adjunto... el formato que le des a la etiqueta ya depende de cómo quieras mostrar el reloj.

El código en el módulo quedaría así:

Abrirr el formulario:

[CODE]Public Actualizar As Boolean
Sub Reloj()
'Carga el userform
[COLOR="red"]Facturacion[/COLOR].Show
End Sub
Sub Hora()
'Actualiza la etiqueta llamada Reloj cada segundo
If Actualizar Then
[COLOR="red"]Facturacion[/COLOR].Reloj = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
End If
End Sub[/CODE]

y en el useform deberás incorporar esto a lo que ya tienes (si ya tienes códigos en el evento initialize y en el evento query_close, entonces añade las líneas a los códigos que ya tienes):

[CODE]Private Sub UserForm_Initialize()
Actualizar = True
Reloj = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
'..... más código
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Actualizar = False
'..... más código
End Sub[/CODE]

Adjunto el archivo con un userform llamado "Facturacion" y al que le he añadido una etiqueta (sin tocar sus propiedades) llamada "Reloj"

Copia de Reloj.zip

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

ok gracias Ernesto,solo para comentar que:

1.-la forma en que 'construyo' maurico la macro para el reloj es otra forma de usar la recirsividad y detenerla(es decir ya probando de nuevo verifique que efectivamente el bucle infinito si se detiene)

2.-para comentar/reafirmar que el metodo/forma/manera que la ayuda nos sugiere para detener la recursividad o llamadas a macro por la misma macro,con el cual se crea un bucle/ciclo infinito de código 'corriendo' como loco una y otra vez sin cesar ,se detine con una plabrita clave: schedule:=False

3.-en el caso de mi reloj(que no subí) puse el ejemplo de como detener el 'multicitado y ahora famoso 'bucle infinito'

para el ejemplo de Mauricio y si se deseara emplear esta 'otra tecnica' podria sustituirse por algo como esto:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    'Actualizar = False
    Application.OnTime Now + TimeValue("00:00:01"), "Hora",[b]schedule:=False[/b]
End Sub

con lo cual 'obviamente' la variable publica utilizada en el modulo1 (Public Actualizar As Boolean) ya no seria necesaria

tampoco lo seria la instruccion If..end if,por lo que esa parte podria quedar así:

Sub [b]Hora[/b]()
    'If Actualizar Then
        frmReloj.Reloj = Format(Now, "dddd dd/mm/yyyy hh:mm:ss")
        Application.OnTime Now + TimeValue("00:00:01"), "[b]Hora[/b]" 'la macro se llama a si misma
    'End If
End Sub

con ello tenemos una opcion 'diferente' parael empleo de la recursividad :)

paralelemate comentaba con maurico el posible uso del reloj,ya que si le adicionamos un boton para parar la hora,otro para continuar o uno para insertar en la celda,pues podriamos tener un reloj mas 'funcional',en fin que son cosas de la 'empleabilidad' del recurso creado...ya dependera de cada uno explotarlo como mejor lo desee . :rolleyes:

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

ST, ¡fantástico! muchas gracias por tu aporte. Como te mencioné antes, yo estuve tratando por eso lados guiándome por la ayuda de Excel pero sólo me encontré con errores... he probado de la forma que indicas y funciona perfectamente.

Una vez más compañero, muy contento de compartir contigo.

Buen dia perdonen la pregunta para que la variable pueda tomar el valor del Format(Now, "dddd dd/mm/yyyy hh:mm:ss"), debo activar alguna referencia.

Hola squevarag, creo que no hace falta activar ninguna referencia... ¿estás teniendo algún problema con ese formato?

En todo caso puedes cambiar el formato, yo he usado eso sólo porque sí :D, porque se ve 'bonito', pero igual podrías usar Format(Now, "dd/mm/yyyy hh:mm:ss") o incluso sólo usar Now o sólo Time o no sé, depende un poco de lo que quieras.

bueno, igual subo nuevamente el archivo con la indicación de ST... subo el label en el userform sin mayores 'atractivos' y usando simplemente Now sin el format.

Este es el código en el userform:

Private Sub UserForm_Initialize()
Reloj = Now
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.OnTime Now + TimeValue("00:00:01"), "Hora", schedule:=False
End Sub[/CODE]

y este en un módulo:

[CODE]Sub Reloj()
Facturacion.Show
End Sub
Private Sub Hora()
Facturacion.Reloj = Now
Application.OnTime Now + TimeValue("00:00:01"), "Hora"
End Sub[/CODE]

la idea, más que tener un reloj es la poder incorporar en cualquier userform ya diseñado la fecha y la hora, que era la inquietud original de Ernesto. Creo que este método es bastante sencillo y funcional, sólo se necesitan unos pocas líneas de código y una etiqueta (label) en el userform y listo.

Para hacer un reloj como tal, como menciona ST, serie conveniente usar algunos botones que le den más funcionalidad como bien indica él.

Copia de Copia de Reloj.zip

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

Te comento que yo lo pude adaptar perfecto con lo primero que pasaste; ahora mi pregunta es la siguiente que diferencia hay entre el primero y el ultimo; algun tipo de mejoria? Lo unico que me dio gracia es que con el tipo de letra que le pusiste de entrada el dia de hoy lo escribe asi: Miúrcoles ja ja ja... en lo demas perfecto.-

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

Uff, y yo acá peleando con este tema, jajaja.

ST, en algunos casos con el archivo que he subido produce error... no sé exactamente qué pueda ser... incluso, estoy seguro que cuando estuve haciendo pruebas había intentado algo como lo que indicas pero me produjo error. No sé como reproducir este error porque parece que se produce en algún momento específico que no he podido identificar... creo que por eso finalmente había optado por la opción de usar la variable "Actualizar"... prueba el archivo y ejecuta la macro y cierra el userform varias veces... en algún momento (no puedo decir cuando) produce error.

El error se produce en:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
[COLOR="red"]Application.OnTime Now + TimeValue("00:00:01"), "Hora", schedule:=False[/COLOR] 'Error 104: Error en el método OnTime
End Sub[/CODE]

¿Seré yo el único que se está encontrando con este error? ¿He aplicado bien en el archivo tus sugerencias ST?

Share this post


Link to post
Share on other sites

Re: Reloj actualizable en userform

Hola Ernesto

Te comento que yo lo pude adaptar perfecto con lo primero que pasaste; ahora mi pregunta es la siguiente que diferencia hay entre el primero y el ultimo; algun tipo de mejoria? Lo unico que me dio gracia es que con el tipo de letra que le pusiste de entrada el dia de hoy lo escribe asi: Miúrcoles ja ja ja... en lo demas perfecto.-

Pues me alegra que ya tengas montado tu userform con el reloj y la fecha :D y curioso lo del "Miúrcoles" jajajaja, en todo caso como viste puedes cambiarle el formato en format(now, "dddd dd/mm/yyyy hh:mm:ss") algo así como se hace en el formato de celda.

ese error te salto con el ultimo que armaste; a Mi tambien me aparecio...en fin el primero no da problemas hasta el momento.-

Gracias por tomarte el tiempo de probar los archivos y por la retroalimentación. Efectivamente me refiero al último archivo, en el que he quitado la variable "Actualizar" para usar el schedule:=False... yo intuyo que el error tiene que ver algo con la misma ejecución del código.. pero supongo que si el primero te ha funcionado bien pues lo dejes así, jajajaj, "si no está dañada para qué arreglarlo" como diría nuestro amigo Julibaga :D, aunque todo es suceptible de ser mejorado y en esas estamos y gracias a los valiosos aportes de ST.

Igual no sé si te sirva de algo y ya pensando en tu userform, de pronto si te es útil se puede tener el reloj que se actualice cada minuto, no cada segundo, así no tendrás una macro ejecutándose 60 veces en un minuto sino sólo 1 vez cada minuto... no sé si esto vaya a afectar en algo a tu trabajo, lo mejor seria que hicieras unas pruebas ya con tu userform trabajando a ver si notas algún cambio o algún problema o no sé. Volviendo al código inicial, para actualizar el reloj cada minuto y no cada segundo, se podría probar algo así:

en el userform:

Private Sub UserForm_Initialize()
Actualizar = True
Reloj = Format(Now, "[COLOR="blue"]dddd dd/mm/yyyy hh:mm am/pm[/COLOR]")
Application.OnTime Now + TimeValue("[COLOR="blue"]00:01[/COLOR]"), "Hora"
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Actualizar = False
End Sub[/CODE]

en el módulo:

[CODE]Public Actualizar As Boolean
Sub Reloj()
Facturacion.Show
End Sub
Sub Hora()
If Actualizar Then
Facturacion.Reloj = Format(Now, "[COLOR="blue"]dddd dd/mm/yyyy hh:mm am/pm[/COLOR]")
Application.OnTime Now + TimeValue("[COLOR="blue"]00:01[/COLOR]"), "Hora"
End If
End Sub[/CODE]

bueno, no más por dejar acá algunas otras ideas que además creo que pueden ayudar a entender un poco más el código por si se necesitara modificar en algún sentido, que me parece que este tema puede ser de interés para muchas personas.

Adjunto otro archivo más :D con este nuevo código.

Copia de Copia de Reloj (2).zip

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  



  • Si estás experimentando errores al acceder al foro, te recomendamos que modifiques la contraseña desde aquí (haciendo clic en el enlace "¿Olvidaste tu contraseña?").

    Próximamente  habrá mejoras en la web y es necesario cambiar la contraseña para acceder a los nuevos contenidos.

    Disculpa las molestias.

  • Recently Browsing

    No registered users viewing this page.

  • Latest Best Answers

×
×
  • Create New...

Important Information

Privacy Policy