não é possível selecionar outra pasta de trabalho quando a pasta de trabalho habilitada para macro está aberta
Pergunta
Eu tenho uma pasta de trabalho habilitada para macro que usa código para definir um cronômetro - este é um livro compartilhado e muitas vezes as pessoas estão no livro e saem de suas mesas, etc.Está configurado para salvar e fechar após 30 minutos de inatividade.Essa função parece funcionar bem, mas o problema que estou enfrentando é que quando tenho outras pastas de trabalho abertas não consigo selecioná-las, clicando no bloco (Windows 7) ou por alt+tab, a única maneira de movê-las é ctrl +mudança.Se fosse apenas eu usando a pasta de trabalho, isso não seria um problema - alguém sabe por que isso está acontecendo?Código postado abaixo:
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
Solução 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
Metade da minha batalha é perceber o que as pessoas querem dizer com "este" ou "aquele" módulo - este código pode ser um pouco excessivo, mas parece funcionar.Agradeço por dedicar seu tempo para ajudar e me colocar no caminho certo!
Outras dicas
Para começar, não sei bem por que você está tendo esse comportamento, mas continue lendo.EU suspeito tem algo a ver com o seu ocupado-espera loop (aquele com o DoEvents
), mas isso é apenas um palpite.Alguém pode ter uma explicação (melhor).
De qualquer forma, talvez usando Application.OnTime
é uma abordagem melhor.Você pode agendar uma operação para acontecer em um determinado horário ou intervalo e há a opção de cancelar e substituir uma operação previamente agendada.Você precisará dessa facilidade no Workbook_SheetChange
manipulador de eventos.
Resumindo, você pode fazer o seguinte:
- Adicione uma nova rotina para salvar e sair da pasta de trabalho, vamos chamá-la:
SaveWorkbookAndExit
.Isso será chamado porOnTime
mais tarde. Substitua o conteúdo do seu
Workbook_SheetChange
manipulador de eventos da seguinte maneira:Application.OnTime Now + TimeValue("00:30:00"), _ "SaveWorkbookAndExit", _ Schedule:=False
Isso basicamente programa a rotina
SaveWorkbookAndExit
ser chamado daqui a 30 minutos.Observe oSchedule:=False
- significa que um procedimento previamente definido deve ser apagado/cancelado, o que é muito importante.- Adicione também o mesmo código acima ao seu
Workbook_Open
manipulador de eventos. Ao contrário do acima, observe que você deve definirSchedule:=True
aqui!
E é isso.Quando a pasta de trabalho é aberta, um novo SaveWorkbookAndExit
operação está agendada.Então, toda vez que você entrar Workbook_SheetChange
, a operação previamente agendada será cancelada e uma nova será agendada em seu lugar.
Não testei nada disso, mas espero que você tenha entendido.Por favor, deixe-me saber se precisar que eu explique algo mais.