VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

avaya

XLDnaute Nouveau
Bonjour à tous,


J'avais trouvé une méthode sur le net pour que l'utilisateur ne puisse pas supprimer certaines feuilles d'un classeur Excel.

Voici ce que j'avais trouvé:

Code:
‘IN every sheet module:


Private Sub Worksheet_Deactivate()
ThisWorkbook.Protect , True
Application.OnTime Now, “UnprotectBook”
End Sub

'In a normal module:


Sub UnprotectBook()
ThisWorkbook.Unprotect
End Sub

Works in any Excel version!

J'ai copié tout ça et ça fonctionnait très bien dans mes classeurs jusqu'à ce que je crée une macro dans un classeur externe qui ouvre/ferme ces derniers.
Pendant la macro, à la fin, je ne sais pas trop quand mais les classeurs qui ont été fermés par la macro se réouvrent tout seuls.
J'ai compris que ça venait du fait qu'avant de fermer ces classeurs il faut désactiver Application.OnTime.

J'ai notamment lu et tenté de bidouiller en fonction de ces deux discussions:
https://www.excel-downloads.com/threads/stop-chrono-je-bloque.230117/
https://www.excel-downloads.com/thr...n-classeur-se-reouvre-automatiquement.222842/

Mais je n'arrive pas à écrire cette désactivation...

Mon essai:

Code:
‘IN every sheet module:


Private Sub Worksheet_Deactivate()
ThisWorkbook.Protect , True
DateNow = Now
Application.OnTime DateNow, "UnprotectBook"


'In a normal module:

Sub UnprotectBook()
ThisWorkbook.Unprotect
End Sub
End Sub


'In ThisWorkbook:

Public DateNow As Date

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime DateNow, "UnprotectBook", Schedule:=False
End Sub

Est-ce que quelqu'un pourrait m'aider, s'il vous plaît?

Merci d'avance,


avaya
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Bonjour,

Gestion des événements - On Time

Exemple

Code:
Dim temps
Sub majHeure()
  ThisWorkbook.Sheets("feuil1").[A1] = Now
  temps = Now + TimeValue("00:00:1")
  Application.OnTime temps, "majHeure"
End Sub

Sub auto_open()
   majHeure
End Sub

Sub auto_close()
   On Error Resume Next
   Application.OnTime temps, Procedure:="majHeure", Schedule:=False
End Sub

JB
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Bonjour avaya,

Je ne comprend pas pourquoi tu enlèves la protection du classeur, encore moins avec Ontime
Protéger le classeur empêchera de supprimer les feuilles, et puis c'est tout, non ?

edit : Bonjour Boisgontier :)
 

avaya

XLDnaute Nouveau
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Bonjour à vous deux,

Merci pour votre réactivité!

J'ai utilisé ce code parce que je voudrais que l'utilisateur puisse ajouter, déplacer des feuilles... sans avoir à mettre un mot de passe. La seule action que je souhaite prévenir c'est la suppression de certaines feuilles (pas toutes) du classeur.

Le code que j'avais trouvé se situe dans ce lien:
Lien supprimé

Il faut regarder dans les commentaires (Jan Karel Pieterse).


edit:
J'ai regardé les procédures de BoisGontier mais très honnêtement, comme je ne suis pas au top niveau, j'ai du mal à projeter ses exemples sur ma situation. Surtout qu'en général, ses application.OnTime se terminent après un temps donné alors que je souhaite qu'elles se terminent à la fermeture du classeur.

J'espère que vous pourrez un chouilla plus m'aider.
Sinon, je me tournerai vers une protection du classeur entier avec les inconvénients que ça a.

Merci encore


avaya
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Re,

Je ne sais pas désolé, à part que Ontime n'est pas très stable et que si je peux m'en passer...
Peut-être désactiver les évènements avant d'ouvrir/fermer les fichiers par macro, voir si ça n'a pas d'impact sur tes traitements

Edit : sinon ta désactivation de ontime semble correcte, sauf que s'il n'y a rien à désactiver, ça plante, d'où le On error resume next dans le code que t'a proposé Boisgontier
 
Dernière édition:

avaya

XLDnaute Nouveau
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Re,


Oui j'avais essayé avec le On error resume next (j'ai oublié de le préciser), mais les fichiers continuaient de s'ouvrir tout seuls...

Du coup, comme ça donnait rien en faisant des recherches en français, j'ai essayé en anglais et je suis tombée sur ça:
VBA Stopping a Timer - Microsoft Community

The problem is that you are closing and then re-opening the workbook, which causes VBA to stop running and reset its global variables. Normally, you would get a message prompt asking whether to save and close the workbook before re-opening it. But you have DisplayAlerts = False, so no message is displayed and Excel takes the default action, which is to save, close and re-open the file without notifying you.

This causes RunWhen to get initialized to 0. Then, by calculation, you set RunWhen to Now+"00:00:10". This is not the same time value that was used previously by StartTimer to initialize the timer. Therefore, OnTime can't find the timer to stop it. Since OnTime is an application method, it will get executed as long as Excel is open, regardless of whether the workbook that initiated the timer is open. Excel will open it if necessary. The only way to stop a timer whose start time is unknown is to stop Excel.

If you put a debug statement at the very beginning of StartTimer,

Debug.Print "StartTimer: " & Format(RunWhen, "hh:mm:ss")

you'll see in the Immediate window (CTRL G to view the window) that RunWhen is 00:00:00 when StartTimer is executed. The time that was used to initialize the timer no longer exists.

On ne peut pas utiliser OnTime lorsque les classeurs (qui ont du OnTime dans leur code) sont ouverts -> fermés -> réouverts via une macro externe!!!

J'ai toujours l'impression d'attirer toutes les exceptions du monde en VBA...

Bref, comme tu l'as dit, mieux vaut ne pas utiliser OnTime.

Je vais donc de ce pas protéger mes classeurs...


Merci encore à vous deux!


avaya
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Bonjour à tous

La fonction Ontime, n'est pas toujours simple à mettre en place.

Voici un exemple qui fonctionne, à voir si c'est adaptable à ton cas. Mais il faut toujours mettre le OnTime en Schedule à false avant de fermer le classeur.
 

Pièces jointes

  • TCD_Actualise_05_Secondes.xlsm
    22.1 KB · Affichages: 47

MJ13

XLDnaute Barbatruc
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Re, Bonjour Bruno

Sinon, j'en ai retrouvé un autre de 2009 :eek:.
 

Pièces jointes

  • OnTime_MJ.zip
    8 KB · Affichages: 44
  • OnTime_MJ.zip
    8 KB · Affichages: 42
  • OnTime_MJ.zip
    8 KB · Affichages: 40

eriiic

XLDnaute Barbatruc
Re : VBA Application.OnTime Now : Classeurs s'ouvrent tout seuls

Bonjour,

J'ai l'impression que tu n'étais pas loin.
Ce qui me gêne c'est :
'In ThisWorkbook:
Public DateNow As Date
ThisWorkbook est un module de classe, les autres modules ne voit pas cette variable et vice-versa. Il faut la déclarer dans un module Standard.
Si tu avais mis 'Option Explicit' tu aurais été alerté... C'est mieux de le cocher dans les options pour l'avoir d'office dans tous les modules


IN every sheet module:
Private Sub Worksheet_Deactivate()
ThisWorkbook.Protect , True
Application.OnTime Now, “UnprotectBook”
End Sub
Mais si tu utilises la même variable pour plusieurs feuilles ça ne va pas le faire, seul le dernier lancement sera annulé. Si tu en as 3 en cours il faut tous les annuler.
eric
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 083
Membres
103 458
dernier inscrit
Vulgaris workshop