Dave se demande s’il peut forcer la fermeture d’un classeur après un certain temps, à condition qu’il ne soit pas actuellement utilisé. Dans son bureau, les gens ouvrent les classeurs qui se trouvent sur le serveur et oublient ensuite qu’ils sont ouverts. Lorsque cela se produit, personne d’autre ne peut les modifier, il souhaite donc forcer la fermeture des classeurs s’ils sont laissés sans surveillance pendant 60 minutes.

Il est possible de le faire à l’aide de macros, mais vous ne voudrez peut-être pas vraiment le faire du point de vue de l’entreprise ou de l’utilisateur. Par exemple, disons qu’un utilisateur a trois classeurs ouverts sur son système, afin que des comparaisons puissent être faites entre eux. Il est possible d’être « ligoté »

avec deux des classeurs pendant un certain temps, le troisième étant celui qui déclenche un arrêt. Le VBA d’Excel n’est pas terriblement discriminant: lorsqu’un classeur est fermé, c’est généralement celui qui a le focus à l’heure actuelle.

De plus, que faites-vous des modifications non enregistrées lors de la fermeture? Si vous les enregistrez, vous rencontrez un problème selon lequel l’utilisateur n’avait peut-être pas l’intention de les enregistrer. Si vous ne les enregistrez pas, le problème inverse se produit: il y avait peut-être beaucoup de données à enregistrer. Vous ne pouvez pas demander à la procédure de clôture si les informations doivent être sauvegardées; cela garderait le classeur lié aussi sûrement que le garderait ouvert (et inutilisé).

Une solution possible consiste simplement à partager le classeur. Si vous activez le partage (comme indiqué dans d’autres ExcelTips), plusieurs personnes peuvent ouvrir le même classeur en même temps. Si l’une de ces personnes le laisse ouvert, personne d’autre n’est gêné car il peut toujours l’ouvrir et, éventuellement, apporter des modifications au classeur.

Si vous décidez d’emprunter la voie basée sur les macros, la solution est plutôt simple. Vous avez besoin d’une sorte de structure de minuterie (facilement implémentée grâce à l’utilisation de la méthode OnTime) et d’un moyen de vérifier si quelqu’un fait quelque chose dans le classeur.

Pour commencer, ajoutez le code suivant à un module de macro standard. Notez qu’il y a trois routines à ajouter:

Dim DownTime As Date

Sub SetTimer()

DownTime = Now + TimeValue("01:00:00")

Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=True End Sub
Sub StopTimer()

On Error Resume Next     Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=False  End Sub
Sub ShutDown()

Application.DisplayAlerts = False     With ThisWorkbook         .Saved = True         .Close     End With End Sub

Ces trois routines sont assez simples. Les deux premiers allument respectivement la minuterie et l’éteignent. Notez que ces routines utilisent la variable DownTime, qui est déclarée en dehors de l’une des routines. De cette manière, son contenu peut être utilisé dans plusieurs routines.

La troisième routine, ShutDown, est celle qui ferme réellement le classeur. Il n’est appelé que si la méthode OnTime expire, au bout d’une heure. Il ferme le classeur sans enregistrer les modifications éventuellement apportées.

Les routines suivantes (il y en a quatre) doivent être ajoutées à l’objet ThisWorkbook. Ouvrez l’éditeur VBA et double-cliquez sur l’objet ThisWorkbook dans l’explorateur de projet. Dans la fenêtre de code qu’Excel ouvre, placez ces routines:

Private Sub Workbook_Open()

Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Call StopTimer     Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _   ByVal Target As Excel.Range)

Call StopTimer     Call SetTimer End Sub

Les deux premières routines sont déclenchées lorsque le classeur est ouvert et lorsqu’il est fermé; ils démarrent la minuterie et l’éteignent. Les deux autres routines sont exécutées automatiquement chaque fois qu’une feuille de calcul est recalculée ou chaque fois que quelqu’un effectue une sélection dans le classeur. Les deux sont de bons indicateurs que quelqu’un utilise le classeur (il n’est pas ouvert de manière inactive). Ils arrêtent la minuterie puis la redémarrent, de sorte que le compte à rebours d’une heure recommence.

Il y a un inconvénient à utiliser un ensemble de macros comme celles-ci: vous éliminez efficacement la capacité d’annulation d’Excel. Lorsqu’une macro est exécutée, la pile d’annulation est automatiquement effacée par Excel. Étant donné que les macros sont en cours d’exécution avec chaque modification apportée dans le classeur, les modifications de la personne ne peuvent pas être annulées. (Il n’y a aucun moyen de contourner cet inconvénient.)

_Note: _

Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.

lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur].

ExcelTips est votre source pour une formation Microsoft Excel rentable.

Cette astuce (2281) s’applique à Microsoft Excel 97, 2000, 2002 et 2003. Vous pouvez trouver une version de cette astuce pour l’interface ruban d’Excel (Excel 2007 et versions ultérieures) ici:

link: / excelribbon-Forcing_a_Workbook_to_Close_after_Inactivity [Forcer la fermeture d’un classeur après l’inactivité].