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