No se puede seleccionar otro libro cuando se abre un libro habilitado para macros.
Pregunta
Tengo un libro habilitado para macros que usa código para configurar un temporizador; este es un libro compartido y, a menudo, las personas estarán en el libro y abandonarán su escritorio, etc.Está configurado para guardarse y cerrarse después de 30 minutos de inactividad.Esa función parece funcionar bien, pero el problema que tengo es que cuando tengo otros libros abiertos no puedo seleccionarlos, ya sea haciendo clic en el mosaico (Windows 7) o con alt+tab, la única forma de moverme es Ctrl. +cambio.Si solo fuera yo quien usara el libro de trabajo, eso no sería un problema. ¿Alguien sabe por qué sucede esto?Código publicado a continuación:
Private Sub Workbook_Open()
StartTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
StartTimer
End Sub
Const idleTime = 1800 'seconds
Dim Start
Sub StartTimer()
Start = Timer
Do While Timer < Start + idleTime
DoEvents
Loop
Application.DisplayAlerts = False
ActiveWorkbook.Close True
Application.DisplayAlerts = True
End Sub
Solución 2
Thank you again for the reply, I couldn't quite figure you where I was supposed to put what as I am new to this as I had said. I did find a solution, or so it seems:
In the "This Workbook" module I put:
Option Explicit
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
ResetTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
and in the "user" module (i right click and add module), I used:
Public CloseDownTime As Variant
Public Sub ResetTimer()
On Error Resume Next
If Not IsEmpty(CloseDownTime) Then Application.OnTime EarliestTime:=CloseDownTime, Procedure:="CloseDownFile", Schedule:=False
CloseDownTime = Now + TimeValue("00:00:30") ' hh:mm:ss
Application.OnTime CloseDownTime, "CloseDownFile"
End Sub
Public Sub CloseDownFile()
On Error Resume Next
Application.StatusBar = "Inactive File Closed: " & ThisWorkbook.Name
ThisWorkbook.Close SaveChanges:=True
End Sub
La mitad de mi batalla se está dando cuenta de lo que la gente quiere decir con "esto" o "ese" módulo, este código puede ser un poco excesivo, pero parece funcionar.¡Agradezco que te tomes el tiempo para ayudarme y llevarme a la pista correcta!
Otros consejos
Para empezar, no estoy del todo seguro de por qué tienes ese comportamiento, pero sigue leyendo.I sospechar tiene algo que ver con tu espera ocupada bucle (el que tiene el DoEvents
), pero eso es sólo una corazonada.Alguien más podría tener una (mejor) explicación.
De todos modos, tal vez usando Application.OnTime
es un mejor enfoque.Puede programar una operación para que se realice en un momento o intervalo determinado y existe la opción de cancelar y reemplazar una operación previamente programada.Necesitará esa instalación en el Workbook_SheetChange
controlador de eventos.
En resumen, puedes hacer lo siguiente:
- Agregue una nueva rutina para guardar y salir del libro, llamémosla:
SaveWorkbookAndExit
.Esto será llamado porOnTime
más tarde. Reemplace el contenido de su
Workbook_SheetChange
controlador de eventos de la siguiente manera:Application.OnTime Now + TimeValue("00:30:00"), _ "SaveWorkbookAndExit", _ Schedule:=False
Esto básicamente programa la rutina.
SaveWorkbookAndExit
Me llamarán dentro de 30 minutos.Observe laSchedule:=False
-- significa que se debe borrar/cancelar un procedimiento previamente establecido, lo cual es muy importante.- También agregue el mismo código que el anterior a su
Workbook_Open
controlador de eventos. Sin embargo, a diferencia de lo anterior, tenga en cuenta que debe configurarSchedule:=True
¡aquí dentro!
Y eso es.Cuando se abre el libro, aparece un nuevo SaveWorkbookAndExit
La operación está programada.Luego, cada vez que entras Workbook_SheetChange
, se cancelará la operación previamente programada y se programará una nueva en su lugar.
No he probado nada de esto, pero espero que entiendas la idea.Por favor, avíseme si necesita que le explique algo más.