No se puede seleccionar otro libro cuando se abre un libro habilitado para macros.

StackOverflow https://stackoverflow.com//questions/25071193

  •  26-12-2019
  •  | 
  •  

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
¿Fue útil?

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:

  1. Agregue una nueva rutina para guardar y salir del libro, llamémosla: SaveWorkbookAndExit.Esto será llamado por OnTime más tarde.
  2. 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 la Schedule:=False -- significa que se debe borrar/cancelar un procedimiento previamente establecido, lo cual es muy importante.

  3. 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 configurar Schedule:=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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top