Saltar al contenido

Macro para cerrar libro oculto después de un tiempo inactivo


Recommended Posts

Hace 4 horas, jose lopez contreras dijo:

macro para cerrar un libro abierto pero oculto (Solo se ve el userform) después de un tiempo inactivo, encontré varios en la red pero solo funcionan cuando el libro esta visible. Anexo uno de ellos.

ya me parecía conocido ese código, está basado (precisamente) en cambios de selección de celda(s) de cualquier hoja en el libro, que es lo que hace esta parte de la propuesta que omites (en el módulo de código del ThisWorkbook):

Private Sub Workbook_SheetSelectionChange( _
            ByVal Sh As Object, ByVal Target As Range)
  Permanecer = True
End Sub

luego entonces, al estar oculto tu libro (obviamente) NO es posible (para el usuario) seleccionar nada en él, a menos que encuentres la forma de que tu código haga cambios en tu libro oculto (se entiende ?)

tip: el evento '_change' dispara después el evento '_selectionchange', lo que podría darte una salida a este embrollo (?)

dale una repasada el cuarto mensaje de esta añeja conversación

saludos,
hector.

Enlace a comentario
Compartir con otras webs

En 27/4/2019 at 13:37 , Héctor Miguel dijo:

a menos que encuentres la forma de que tu código haga cambios en tu libro oculto (se entiende ?)

@Héctor Miguel buenos días mira ya leí, leí y leí todo lo que me comentaste y eh realizado muchas pruebas y cambios pero nada me funciona, cambie la instrucción base 

Private Sub Workbook_SheetSelectionChange( _
            ByVal Sh As Object, ByVal Target As Range)
  Permanecer = True
End Sub

' POR ESTA
 
Private Sub Workbook_SheetnChange( _
            ByVal Sh As Object, ByVal Target As Range)
  Permanecer = True
End Sub

Coloque esta instrucción en el Userform principal (menu) y tampoco

Private Sub UserForm_Initialize()
Worksheets("Menu").Select
    Range("A1").Select
End Sub

Private Sub UserForm_Activate()
Worksheets("Menu").Select
    Range("A1").Select
End Sub

Podrás darme un empujoncito por favor. Anexo lo que llevo.

https://mega.nz/#!TMYBQaTZ!EIlXxja2Rug1ZByhS92qhS8Y_2kLlfPBZ24egSsdBz4

Enlace a comentario
Compartir con otras webs

Hace 5 horas, jose lopez contreras dijo:

Anexo lo que llevo

es interesante tu proyecto, pero no creo poder dedicarle el tiempo suficiente para analizarlo...
- 14 hojas (+ sus fórmulas y módulos de código)
- 9 formularios (+ sus controles y códigos)
- 8 módulos de código estándar)
(posiblemente más en la realidad ?)

de seguro alguna instrucción "pasada por alto" (en cualquier lugar) no me deje "ver" sus implicaciones en otras instrucciones (p.ej.)
- en instrucciones como Workbooks.Open mezcladas con ActiveWorkbook, ActiveCell, etc. (en otros procedimientos) puede resultar complicado de rastrear "a cual" libro/hoja/celda pretendes afectar (?)

en resumen, si NO ES el usuario quien va a ingresar datos en las celdas de las hojas en el libro con las macros (?)...

1) cambia de evento en el módulo de código del libro, en lugar de:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  Permanecer = True
End Sub

usa este:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Permanecer = True
End Sub

2) encuentra la(s) manera(s), forma(s), línea(s), momento(s) en que alguno de tus códigos "haga cambios" en cualquier celda de cualquier hoja del libro con tus procesos, puedes usar una simple instrucción "general" (p.ej.)

op1: OJO: esta instrucción falla si NO hay (al menos) alguna celda con datos en la hoja activa 
cells.find(empty).clear

op2: puedes establecer una hoja y celda fijas para una instrucción (similar a la anterior)
worksheets("hojax").range("z50") = now

el truco es que la instrucción la realice en (alg)un "momento clave", (alg)una línea en (alg)un procedimiento de tu código (se entiende ?)

saludos,
hector.

Enlace a comentario
Compartir con otras webs

En 30/4/2019 at 15:01 , Héctor Miguel dijo:

es interesante tu proyecto, pero no creo poder dedicarle el tiempo suficiente para analizarlo...
- 14 hojas (+ sus fórmulas y módulos de código)
- 9 formularios (+ sus controles y códigos)
- 8 módulos de código estándar)
(posiblemente más en la realidad ?)

de seguro alguna instrucción "pasada por alto" (en cualquier lugar) no me deje "ver" sus implicaciones en otras instrucciones (p.ej.)

Así es Hector, tiene mucho mas, pero realmente todo movimiento en sus formularios, formulas, códigos, módulos y controles al final terminan en el menú principal en el cual coloque en Private Sub UserForm_Initialize() la instrucción que anexo. Toda esta instrucción la ejecuta perfecto, es decir selecciona la hoja menú, escribe en la celda A1 la palabra "Prueba" y deja seleccionada la celda A1,  pero depues de todo esto no se ejecuta la instrucción de cerrar automáticamente. Seguí tus recomendaciones pero sucede lo mismo. Como diría el Chavo del 8 "Me doy". Ahí queda por si alguien se anima a dar una solución. Mil gracias Hector hasta pronto.

Private Sub UserForm_Initialize()
Worksheets("Menu").Select 'selecciona la hoja menu
Range("A1").Value = "Prueba" 'en la celda A1 escribo la palabra Prueba
Range("A1").Select 'finalmente selecciono la celda A1
End Sub

 

Enlace a comentario
Compartir con otras webs

Hace 2 horas, jose lopez contreras dijo:

en Private Sub UserForm_Initialize() ... selecciona la hoja menú, escribe en la celda A1 la palabra "Prueba" y deja seleccionada la celda A1,  pero depues de todo esto no se ejecuta la instrucción de cerrar automáticamente

está bien modificar valores en celdas de cualquier hoja de tu libro al "inicializar" el formulario, la cuestión es que, después de ese "movimiento", transcurrido el "lapso" que establezcas para cada "monitoreo", SI NO SE REALIZA ningún otro cambio (valor o selección de celda), es lógico que se detecte inactividad y el proceso pida cerrarse (?)

Enlace a comentario
Compartir con otras webs

Hace 13 minutos , Héctor Miguel dijo:

está bien modificar valores en celdas de cualquier hoja de tu libro al "inicializar" el formulario, la cuestión es que, después de ese "movimiento", transcurrido el "lapso" que establezcas para cada "monitoreo", SI NO SE REALIZA ningún otro cambio (valor o selección de celda), es lógico que se detecte inactividad y el proceso pida cerrarse (?)

Pues como te comente después del tiempo de inactividad programada transcurrido y sin hacer cambios en ninguna celda, hoja o formulario, el proceso lanza el msg que se cerrara en cierto tiempo, pues hasta ahí llega y nunca se cierra. Espero me hayas entendido.

Enlace a comentario
Compartir con otras webs

Hace 9 horas, jose lopez contreras dijo:

después del tiempo de inactividad programada transcurrido y sin hacer cambios en ninguna celda, hoja o formulario, el proceso lanza el msg que se cerrara en cierto tiempo, pues hasta ahí llega y nunca se cierra

como te comenté anteriormente...

analizar 1,600 líneas de código en tal volumen de objetos (más lo que hayas "rasurado" a tu muestra por considerarlo prescindible), no es tarea de "espérame un ratito"

pudiera haber lineas "perdidas" (supresión de errores, inhabilitado de eventos y alertas, etc.) que harían tardado descubrir cualquier causa del comportamiento que reportas

en el adjunto va una prueba de que sí funcionan los procedimientos ofrecidos (obviamente con muchos menos objetos y no más de 70 líneas de código)

las modificaciones principales son las siguientes:

  • el procedimiento del mensaje inicial comienza ocultando la ventana de excel
  • la visibilidad de excel se restablece en el procedimiento de chequeo (en el caso de cerrar el libro)
  • en el evento '_open' del libro se muestra un formulario (como última instrucción, despues de inicializar la rutina de monitoreo)
  • se cambia el evento Workbook_SheetSelectionChange por el Workbook_SheetChange (como fue sugerido previamente)
  • la constante para el tiempo de reinicio del monitoreo (lapso) va en un minuto (pruebas rápidas, después la ajustas a tu conveniencia)

con respecto del formulario:

  • NO lleva ningún control (no se que necesites hacer en cada uno de los tuyos)
  • para "simular" que TUS CODIGOS (en algún momento) modifiquen celdas en cualquiera de las hojas, se agrega una instrucción para que "paseando" el ratón por la esquina inferior derecha se deposite el tiempo actual en la celda [A1] de una hoja
  • esta acción puede ser "machacante" (según los pases que hagas con el ratón por esa esquina), el MsgBox lo puedes eliminar después y...
  • "aquí es donde..." te toca a ti, establecer que controles y de que formularios realicen esta acción (?)
  • al cerrar el formulario, se debe proveer una salida "similar" a lo que hace el procedimiento de cierre (checarActividad), esto es...
  • restablecer la visibilidad de excel y cerrar el libro (después decides si se guardan o no los cambios)

este orden ES IMPORTANTE, o corres el riesgo de dejar una instancia OCULTA de excel con ese libro "en uso"

si esto sucede, no será fácil localizar esa instancia perdida, hasta que reinicies el equipo (y algunos procesos de recuperación de archivos)

o... que eches mano de alguna "puerta trasera" (como localizar aplicaciones ocultas y terminar su proceso desde otras aplicaciones)

como verás, las modificaciones a los mismos procedimientos sugeridos hace 15 años son mínimas (solo por el formulario y la aplicación oculta)

si cualquier duda (o información adicional)... comentas ?

saludos,
hector.

cerrar inactivo.zip

Enlace a comentario
Compartir con otras webs

Hace 9 horas, Héctor Miguel dijo:

en el adjunto va una prueba de que sí funcionan los procedimientos ofrecidos (obviamente con muchos menos objetos y no más de 70 líneas de código)

Amigo deja te comento que tu anexo hace lo mismo que mi caso, es decir se oculta la ventana de excel y surge el userform, después de un minuto salta el MsgBox de aviso del cierre y llevo una hora esperando que se cierre y nada. Al pasar el puntero por la esquina inferior derecha salta MsgBox "Sigo trabajando" y se reinicia el conteo de 1 minuto y sigue igual a lo ya comentado. Anexo pantallasos. Saludos

Pantallasos

Enlace a comentario
Compartir con otras webs

Hace 46 minutos , Leopoldo Blancas dijo:

Yo probé el archivo que subió @Héctor Miguel y si se cierra automáticamente.

Yo lo estoy probando en una maquina Con windows 10 pro x64 bits y office profesional plus 2016 x 32 bits y la verdad que no se cierra automáticamente, tu que estas utilizando amigo. intentare en otra maquina. Saludos

Enlace a comentario
Compartir con otras webs

Hace 1 minuto , jose lopez contreras dijo:

Pues esta raro la verdad en esta maquina me han sucedido algunas cosas raras, la llevare a que le den una rameada como dicen acá en México, gracias 

Cuando pasan cosas Raras es por Virus y otros Bichos.... Y si eso no responde Formatearla.

Enlace a comentario
Compartir con otras webs

Hace 2 horas, jose lopez contreras dijo:

en esta maquina me han sucedido algunas cosas raras, la llevare a que le den una rameada

y... si no fuera "la maquina" ?

pudiera ser "el archivo" (algún exceso) ?

Enlace a comentario
Compartir con otras webs

  • abre excel (libro1 en blanco)
  • localiza y abre cualquiera de los dos libros manteniendo pulsada la tecla {shift} (NO eventos de apertura)
  • abre el editor de vba (Alt + F11)
  • busca si en herramientas > referencias ... aparece alguna marcada como FALTA:xxx o MISSING:xxx

comenta también cuales aparecen marcadas (todas)

saludos,
hector.

Enlace a comentario
Compartir con otras webs

Hace 14 horas, Héctor Miguel dijo:
  • abre excel (libro1 en blanco)
  • localiza y abre cualquiera de los dos libros manteniendo pulsada la tecla {shift} (NO eventos de apertura)
  • abre el editor de vba (Alt + F11)
  • busca si en herramientas > referencias ... aparece alguna marcada como FALTA:xxx o MISSING:xxx

comenta también cuales aparecen marcadas (todas)

Seguí tus recomendaciones y no hay ninguna que diga FALTA:xxx o MISSING:xxx, anexo referencias marcadas. Espero comentario

Rferencias marcadas

Enlace a comentario
Compartir con otras webs

Hace 11 horas, jose lopez contreras dijo:

no hay ninguna que diga FALTA:xxx o MISSING:xxx, anexo referencias marcadas

primero, gracias a @Leopoldo Blancas por las pruebas verificando el funcionamiento de la muestra ;)

segundo, tratando de descartar a "la máquina", pudiera ser que tu office/excel 2016...

  • no está completa o correctamente instalado
  • no tiene instaladas actualizaciones
  • alguna actualización no terminó "exitosamente"

a reserva de que confirmes/corrijas lo anterior...

saludos,
hector.

Enlace a comentario
Compartir con otras webs

En 4/5/2019 at 20:12 , Héctor Miguel dijo:

segundo, tratando de descartar a "la máquina", pudiera ser que tu office/excel 2016...

  • no está completa o correctamente instalado
  • no tiene instaladas actualizaciones
  • alguna actualización no terminó "exitosamente"

a reserva de que confirmes/corrijas lo anterior...

Amigo te comento, desinstale totalmente office y lo instale nuevamente bajado de la pagina oficial lo active y actualice, pero no paso nada sigue todo igual. pregunta tu anexo funcionara en una pc con win 7, por que es lo único que tengo a la mano aparte de mi pc para poder hacer la prueba haber si se cierra automáticamente

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.