não é possível selecionar outra pasta de trabalho quando a pasta de trabalho habilitada para macro está aberta

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

  •  26-12-2019
  •  | 
  •  

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
Foi útil?

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:

  1. Adicione uma nova rotina para salvar e sair da pasta de trabalho, vamos chamá-la: SaveWorkbookAndExit.Isso será chamado por OnTime mais tarde.
  2. 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 o Schedule:=False - significa que um procedimento previamente definido deve ser apagado/cancelado, o que é muito importante.

  3. Adicione também o mesmo código acima ao seu Workbook_Open manipulador de eventos. Ao contrário do acima, observe que você deve definir Schedule:=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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top