Hola buenas un saludo previo a todos y deseandoles que pasen una hermoza navidad y prospero año nuevo, necesito una ayuda con respecto a mi proyecto en el que estoy trabajando ya tengo todo casi listo solo me falta un ultimo dtalle el cual no soy capaz de resolverlo.
tengo un libro de excel 2007 en el cual en la hoja1 he colocado en tres celdas "B6","B20" y "B34" mensajes para que excel los lea en voz alta y he programado un emulador de un timer con Application.Ontime para que excel los lea cada 5 minutos, es decir primero se ubica en la celda "B6" y lee el mensaje en voz alta luego espera cinco minutos y se ubica en "B20" y hace lo mismo lo lee y espera 5 minutos mas por ultimo en "B34" y asi infinitamente hasta que le ordene detenerse y he aqui mi problema ya que cuando solo era un solo mensaje podia detener la ejecución automatica facilmente pero cuando lo incremente a tres mensajes me genera un error y no puedo detenerlo sin generar errores aqui les muestro todo el codigo que utilizo para un mejor entendimiento.
Dim Tiempo As Variant
Dim Ejecutando As Boolean
Sub Macro1()
UserForm1.Show
End Sub
Sub Macro2()
Call iniciarReloj
End Sub
Sub Macro3()
Call detenerReloj
End
End Sub
Sub programarMacro()
Tiempo = Now + TimeValue("00:05:00")
Application.OnTime Tiempo, "miMacro", , True
End Sub
Sub miMacro()
Sheets(1).Select
Range("B6").Select
TEXTO1 = ActiveCell.Text
If ActiveCell <> Empty Then
Application.Speech.Speak TEXTO1
End If
Call programarMacro2
End Sub
Sub programarMacro2()
Tiempo = Now + TimeValue("00:05:00")
Application.OnTime Tiempo, "miMacro2", , True
End Sub
Sub miMacro2()
Sheets(1).Select
Range("B20").Select
TEXTO1 = ActiveCell.Text
If ActiveCell <> Empty Then
Application.Speech.Speak TEXTO1
End If
Call programarMacro3
End Sub
Sub programarMacro3()
Tiempo = Now + TimeValue("00:05:00")
Application.OnTime Tiempo, "miMacro3", , True
End Sub
Sub miMacro3()
Sheets(1).Select
Range("B36").Select
TEXTO1 = ActiveCell.Text
If ActiveCell <> Empty Then
Application.Speech.Speak TEXTO1
End If
Call programarMacro
End Sub
Sub iniciarReloj()
Ejecutando = True
Call programarMacro
End Sub
Sub detenerReloj()
If Ejecutando = True Then
Ejecutando = False
Application.OnTime Tiempo, "miMacro", , False
End If
End Sub
aca en la macro detenerReloj() surge mi problema porque como ya habia dicho cuando se trata de un solo mensaje es facil detener la ejecucion consecutiva tal cual esta el codigo de la macro detenerReloj() pero como ahora son tres mensajes me genera un error
en la ejecucion espero me puedan ayudar para poder terminar la ejecucion consecutiva de estas macros, tambien cabe mencionar que a mi archivo de excel le inserte un userform en el cual tengo dos botones uno con iniciar y otro con detener y a cada uno le inserte un codigo para llamar a las macros iniciar reloj y detener reloj, muchas gracias y felices fiestas.
Prueba una solución más sencilla:
Un botón vinculado a la subrutina dentenerReloj()
Y pon lo siguiente:
Sub detenerReloj()
End
End Sub
La orden End así, tal cual, funciona como cuando presionas el botón de parar la macro. Utilízalo con cuidado, pues no finaliza variables ni objetos ni nada. Solo termina la ejecución donde esté.
Un saludo
eso no funciona ese codigo (END) solo cierra el formulario, pero aun con el formulario cerrado las macros siguen ejecutandose y el servicio de lectura en voz alta sigue ejecutandose...
En teoría la orden END sin nada más debería detener toda ejecución de código. ¿Podrías subir el archivo (o parte de él) para que podamos evaluarlo?
Un saludo
aca les proporciono una copia del archivo el cual esta elaborado en Excel 2007 y contiene firma digital local la cual tendran que descartarla para ejecutar las macros gracias
Ok es cierto que una vez se ha lanzado el evento ontime, solo se puede parar lanzando de nuevo el evento ontime con el parámetro schedule en false. Justo como tú haces en el botón "detener lectura"
Lo que ocurre es que tú mandas detener los 4 eventos ontime. El problema es que en cada momento solo hay un evento ontime lanzado (no lanzas los 4, uno a 10 segundos, otro a 20... sino que lanzas el primero, y cuando termina lanzas el siguiente)
Por lo tanto, cuando intentas cambiar el schedule a false de eventos ontime que no existen, Excel se queja.
Como es un error controlado y el código es muy sencillo, de solo unas líneas, yo pondría un ON ERROR RESUME NEXT en tu evento detenerReloj()
De esta manera, si lo detienes entre el texto 2º y el texto 3º, el primero dará error, continuará a la siguiente línea, el segundo dará error también, continuará, detendrá el tercero, y el cuarto volverá a dar error y seguirá hacia el end If. Todos los errores serán transparentes para el usuario.
Por cierto, yo llamaría a este procedimiento también en el evento deactivate del formulario. Así, al cerrarlo, también se detendrá la lectura.
Un saludo
ok Cron probare tu sugerencia y te comento gracias
Cron quedo perfecto funciono la linea de codigo que me sugeriste muchas gracias, como hago para calificar tu ayuda?? o darte estrellas o puntaje en este foro??
No hace falta. Con haber comentado que funcionó es suficiente. Gracias.