Fermeture automatique du fichier Excel sur VBA

Bonjour à tous !

je reviens vers vous car je ne retrouve pas la solution à mon problème sur internet, ou du moins pas celle qu'il me faut.

J'ai un fichier Excel qui est mis sur un réseau et utilisé par plusieurs personnes. Donc forcément, il n'y a qu'une personne qui pourra le modifier en même temps (les autres en lecture seule).

Le soucis avec cela c'est que si une personne qui est en écriture laisse le fichier ouvert dans sa session, Les autres utilisateurs ne pourront pas le modifier. On perd donc un temps fou à chercher quel PC a été utilisé par la personne en écriture pour fermer le fichier, ou l'ordi si sa session est fermée.

Ma question donc est de savoir s'il y a un moyen d'implanter une fermeture automatique de l'excel après quelques minutes d'inactivité (j'entends par inactivité : pas de clic, de changement de feuille, de scrolling ou de mouvement de la souris quand l'excel est selectionné. Le but est de ne pas déranger l'utilisateur en fermant le fichier s'il ne fait que regarder l'excel sans modifier quoique ce soit) et aussi si l'utilisateur met en veille, ferme sa session ou alors une mise veille automatique du PC.

J'espère avoir été bien clair ^^

Merci pour vos réponse !

Bonjour Hoosp le forum

et si tu mets ton fichier en fichier partagé? cela ne réglerait pas ton problème?

a+

Papou

Bonjour paritec !

Merci pour ta réponse, mais certaines restrictions m'empèchent de faire cela, et je ne peux pas déplacer ce fichier ailleurs.

C'est surtout que mon Excel contient une horloge, qui fait pour je ne sais quelle raison, bugger le fichier pour les utilisateurs en lecture seule. Je suis donc obligé de l'arrêter l'horloge.

Si tu as besoin de plus d'informations, dis le moi !

a+

Bonjour Hoosp le forum

non tu n'as pas a changé ton fichier de place il suffit tout simplement de le partager, comme cela il pourra être ouvert par deux trois personnes en même temps et ces trois personnes pourront travailler sur le fichier et sans problèmes.

mais ton histoire d'horloge c'est quoi??? je ne comprends pas ce qui peut poser un souci en terme de temps!!

par contre les feuilles de ton classeurs ne pourront pas être verrouillées, mais tout ce qui est macro etc tout fonctionnera parfaitement

enfin je pense mais sans avoir le fichier ni savoir le traitement que tu en attends c'est pas facile de t'aider

a+

Papou

enfin je pense mais sans avoir le fichier ni savoir le traitement que tu en attends c'est pas facile de t'aider

Je veux bien le partager, mais je n'ai techniquement pas l'autorisation par soucis de confidentialité

par contre les feuilles de ton classeurs ne pourront pas être verrouillées

aie ! cela me posera un probleme car j'ai fait en sorte que toutes les feuilles de l'Excel soient protégées. Le seul moyen de venir les modifier c'est via les macros que j'ai mis à disposition sur un ruban personnalisé (qui viennent donc déprotéger la feuille, executer le code, et reprotéger la feuille). En effet, certains des utilisateurs sont des débutants de base donc j'ai tout fait pour rendre cela intuitif.

Et sachant que deux utilisateurs peuvent entrer la même donnée si je le laisse en partagé, cela risquera de créer des doublons :/

a+

Il est possible de programmer la fermeture du fichier, après un certain temps passé dessus ou bien à partir d'une certaine heure.


Private Sub Workbook_Open()
'A 12h00, lancement de la procedure fermeture
Application.OnTime TimeValue("12:00:00"), "fermeture"
End Sub
Sub fermeture()
'Message d'alerte
MsgBox "Le fichier va se fermer automatiquement"
'Sauvegarde du fichier
ActiveWorkbook.Save
'Fermeture du fichier
ActiveWorkbook.Close
End Sub

Merci melch pour ta réponse, malheureusement, j'ai déjà vu cette solution sur internet et elle ne répond pas à ma question, dans le sens où ton code ne prend pas en compte l'activité de l'utilisateur. il va juste se contenter de fermer l'Excel à un certain moment, en présence d'un utilisateur actif ou non.

Re Hoops le forum

voilà une macro du regretté "Ti" Thierry Pourtier

à toi de jouer

a+

Papou

 Option Explicit
        Option Private Module
        'Ti
        'Delai est le temps d'inactivité maxi en minutes
        Const Delai = 1

        Sub Programmation()
        Dim Heure As Date
          Heure = Now + TimeValue("00:" & Delai & ":00")
          ThisWorkbook.Names.Add Name:="ChronoTime", RefersTo:=Heure
          ThisWorkbook.Names.Add Name:="Chrono", RefersTo:=0
          Application.OnTime Heure, "Interruption"
        End Sub

        Private Sub Interruption()
          With ThisWorkbook
            If .Sheets(1).Evaluate("Chrono") = 0 Then
              .Save
              .Close
            Else
              Programmation
            End If
          End With
        End Sub

        Sub SupprimeInterruption()
        Dim Heure As Date
         On Error Resume Next
        Heure = ThisWorkbook.Sheets(1).Evaluate("ChronoTime")
         Application.OnTime Heure, "Interruption", schedule:=False
        End Sub

        dans ThisWorkbook
        Option Explicit
        Private Sub Workbook_BeforeClose(Cancel As Boolean)
         SupprimeInterruption
        End Sub

        Private Sub Workbook_Open()
          Programmation
        End Sub

        Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
          ThisWorkbook.Names("Chrono").Value = 1
        End Sub

Bonjour Partitec !

Merci à toi et à Thierry Pourtier pour ce code !

J'ai modifié le terme :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)

par :

Private Sub Worksheet_Change(ByVal Target As Range)

Que j'ai mis dans chaque feuille, de telle sorte à ce qu'à chaque fois qu'une macro change la valeur d'une cellule, le timer se remet à 0.

Mais quand j'essaie de comprendre le code, je t'avoue que j'ai du mal à comprendre cette ligne de code :

ThisWorkbook.Names.Add Name:="ChronoTime", RefersTo:=Heure

Que fait elle ? C'est une variable ?

J'ai regardé le tuto sur msdn mais j'ai pas trop trop saisi ^^

Si tu peux m'éclairer, ca serait génial !

Merci encore !

Bonjour Hoosp le forum

c'est très simple tu génères un nom et tu lui donnes une valeur et après c'est cette valeur que tu compares

essayes de tester dans un classeur vierge cette macro ci-dessous STP, tu vas te rendre compte, que tu vas ajouter un Nom qui aura la valeur 222.

Tu vas regarder dans Formules / Gestionnaires de Noms, là tu vas retrouver ton Nom ChronoTime avec la valeur 222

Bon weekend

Papou

option explicit
sub test
dim heure&
heure= 222
ThisWorkbook.Names.Add Name:="ChronoTime", RefersTo:=Heure
end sub

Bonjour Paritec !

En effet je comprends maintenant ! Merci ^^

Mais du coup une autre question me vient à l'esprit : Pourquoi utiliser des noms comme tu l'as fait au lieu de déclarer des variables globales (inter-Sub) ?

Bon Weekend !

Re Bonjour Hoops le forum

car là, la variable est enregistrée, même si tu as un bug sur la macro, la valeur est mémorisée

a+

Papou

Rechercher des sujets similaires à "fermeture automatique fichier vba"