impossible de sélectionner un autre classeur lorsque le classeur activé par les macros est ouvert

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

  •  26-12-2019
  •  | 
  •  

Question

J'ai un classeur compatible avec les macros qui utilise du code pour régler une minuterie - il s'agit d'un livre partagé et souvent les gens seront dans le livre et quitteront leur bureau, etc.Il est configuré pour enregistrer et se fermer après 30 minutes d'inactivité.Cette fonction semble fonctionner correctement mais le problème que je rencontre est que lorsque d'autres classeurs sont ouverts, je ne peux pas les sélectionner, ni en cliquant sur la vignette (Windows 7), ni en appuyant sur alt+tab, la seule façon de me déplacer est ctrl. +changement.Si c'était juste moi qui utilisais le classeur, ce ne serait pas un problème - est-ce que quelqu'un sait pourquoi cela se produit ?Code posté ci-dessous :

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
Était-ce utile?

La solution 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 moitié de ma bataille réalisait ce que les gens veulent dire par "ceci" ou "ce" module - ce code pourrait être un peu excessif mais il semble fonctionner.J'apprécie que vous preniez le temps de vous aider et de me procurer sur la bonne voie!

Autres conseils

Pour commencer, je ne sais pas vraiment pourquoi vous obtenez ce comportement, mais continuez à lire.je suspect ça a quelque chose à voir avec ton occupé-attendre boucle (celle avec le DoEvents), mais ce n'est qu'une intuition.Quelqu'un d'autre pourrait avoir une (meilleure) explication.

Quoi qu'il en soit, peut-être en utilisant Application.OnTime est une meilleure approche.Vous pouvez planifier une opération à une certaine heure ou à un certain intervalle et il existe une option pour annuler et remplacer une opération précédemment planifiée.Vous aurez besoin de cette installation dans le Workbook_SheetChange gestionnaire d'événements.

En bref, vous pouvez faire ce qui suit :

  1. Ajoutez une nouvelle routine pour enregistrer et quitter le classeur, appelons-la : SaveWorkbookAndExit.Celui-ci sera appelé par OnTime plus tard.
  2. Remplacez le contenu de votre Workbook_SheetChange gestionnaire d'événements comme suit :

    Application.OnTime Now + TimeValue("00:30:00"), _
                       "SaveWorkbookAndExit", _
                       Schedule:=False
    

    Cela planifie essentiellement la routine SaveWorkbookAndExit être appelé dans 30 minutes.Remarquez le Schedule:=False -- cela signifie qu'une procédure préalablement définie doit être effacée/annulée, ce qui est très important.

  3. Ajoutez également le même code que ci-dessus à votre Workbook_Open gestionnaire d'événements. Contrairement à ci-dessus, notez que vous devez définir Schedule:=True ici!

Et c'est tout.Lorsque le classeur est ouvert, un nouveau SaveWorkbookAndExit l’opération est programmée.Ensuite, chaque fois que vous entrez Workbook_SheetChange, l'opération précédemment programmée sera annulée et une nouvelle sera programmée à sa place.

Je n'ai rien testé de tout cela, mais j'espère que vous comprenez l'idée.S'il vous plaît laissez-moi savoir si vous avez besoin que j'explique quelque chose davantage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top