Comment utiliser application.ontime pour lancer une procédure qui n'est pas dans un module standard

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
petite découverte et astuce du jour

Comment utiliser application.ontime pour lancer une procédure

en différé qui n'est pas dans un module standard



d'aussi loin que je me souvienne on m'a toujours dit que ce n’était pas possible

et pourtant SI!!

en fait c'est un bug qui n'a jamais été résolu

prenons par exemple une sub publique dans le module thisworkbook

public sub Mamacro()
msgbox "coucou je suis dans le module ThisworkBook"
End Sub

et je souhaiterais l'appeler de n'importe ou en différé

par exemple à la fin d'une fonction dans un module classe ( comme ça on complique bien les choses)

si je fais
VB:
Application.OnTime Now + TimeValue("00:00:01"), "'" &  ThisWorkbook.Name & "'!" & Mamacro
evidemment ca ne fonctionnera pas
car dans ce cas présent on appelle la sub "Mamacro" comme si elle était dans un module standard

et si je précise le module
Code:
Application.OnTime Now + TimeValue("00:00:01"), "'" &  ThisWorkbook.Name & "'!ThisworkBook.Mamacro"
ça ne fonctionnera pas mieux

mais si on regarde bêtement le message d'erreur qui nous est renvoyé
on se rend compte que le chemin du classeur n'est pas bon
voici le message
"Impossible d'executer la Macro "'C:\User\Moi\Documents\monclasseur.xlsm'ThisworkBook.Mamacro'.il est possible quelle ne soit pas
disponible dans ce classeur ou que toutes les macros soient déactivées

mais kézako ça !!
mon classeur n'est pas dans mes documents
il y a donc bien un problème de reconnaissance du chemin du classeur

que cela Vous tienne
précisons le chemin un peu plus explicitement

Code:
Application.OnTime Now + TimeValue("00:00:01"), "'" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & "'!" & "Thisworkbook.Mamacro"

et voila ca fonctionne

ca fait plus de 20 ans que je fait du vb(a ) et j'ai toujours entendu et cru que ce n’était pas possible

alors qu'il suffisait de regarder attentivement le message pour comprendre


en espérant que ca vous serve
patrick
 
Dernière édition:
Re.. bah... il y a deux... ans... ça m'aurait bien aidé... mais j'avais plus urgent à traiter en tant que CP.... je n'ai pas creusé le sujet..
me suis dit "po grave ! next !"

à mettre de côté 🙂
 
Bonjour patrick, Oguruma, le forum

et si je précise le module
Code: Application.OnTime Now + TimeValue("00:00:01"), "'" & ThisWorkbook.Name & "'!ThisworkBook.Mamacro"ça ne fonctionnera pas mieux

@patricktoulon , bizarre ton problème, cette syntaxe fonctionne très bien chez moi ou que soit enregistré le classeur, je l'utilisai d'ailleurs déjà sur du Excel 97, que ce soit pour un module de feuille ou thisworkbook (jamais essayé dans un module de classe)
voici un lien de 2006 avec un appel sur un module de feuille d'un classeur sans module standard
https://excel-downloads.com/threads/rafraichir-une-feuille.62955/post-328377
Je crois que la première fois que j'ai publié cette syntaxe, c'était en 2004 avec onkey sur un module de navigation dans les classeurs volumineux. Une collaboration avec notre grand Thierry dans l'ancien forum XLD d'avant 2005.

Cordialement,
Bernard_XLD
 

Pièces jointes

Bonjour Bernard
oui mais il faut essayer ta ligne d'appel a partir d'une fonction dans un module classe
en tout cas ça mange pas de pain d'être plus explicite
au moins de suis tranquille 😉
 
et je fait même plus simple j'ajoute" full" 😉
VB:
Application.OnTime Now + 0.000005, "'" & ThisWorkbook.FullName & "'!" & "Thisworkbook.AddIndentEnvironnement"
il ne peut pas y avoir d'erreur
 
et je fait même plus simple j'ajoute" full" 😉
VB: Application.OnTime Now + 0.000005, "'" & ThisWorkbook.FullName & "'!" & "Thisworkbook.AddIndentEnvironnement"il ne peut pas y avoir d'erreur
C'est vrai que cela ne coute pas grand chose de faire un fullname au lieu d'un name pour avoir une syntaxe polyvalente sur tout type de module.
Bon à savoir pour les modules de classe.
 
Bonjour à tous,

Perso que ce soit dans ThisWorkbook ou une feuille de calcul j'utilise cette méthode classique avec le CodeName :
VB:
Function F()
Application.OnTime Now + TimeValue("00:00:01"), ThisWorkbook.CodeName & ".mamacro"
End Function

Sub Test()
Dim x
x = F 'appelle la fonction
End Sub
Pour tester j'ai renommé "MonThisWorkbook" le ThisWorkbook.

A+
 

Pièces jointes

Bonjour.
Personnellement j'utilise une classe Planification pour faire ça dans un module objet.
VB:
Rem. Cette classe permet d'exploiter un Application.Ontime dans des objets, via un évènement Échoit.
Option Explicit
Event Échoit() ' Évènement. Se produit à l'échéance du délai.
Private HOT As Date, Idt As Long
Public Sub PlanifierDans(ByVal Délai)
Rem. Méthode. Planifie l'évènement Échoit dans un délai indiquée.
'     Délai: Expression String de la forme "hh:mm:ss" ou bien un nombre de secondes.
'     Remarque: Une éventuelle planification préalable est annulée.
   If Engagé Then XPlanificateur.AnnulerPlanification Idt
   If VarType(Délai) = vbString Then HOT = Now + TimeValue(Délai) Else HOT = Now + TimeSerial(0, 0, Délai)
   Idt = XPlanificateur.IdtPlanificationLancée(Me)
   End Sub
Public Sub Annuler()
Rem. Méthode. Annule la dernière planification s'il en existe une.
   If Idt > 0 Then XPlanificateur.AnnulerPlanification Idt: Idt = 0
   End Sub
Public Function HeureOT() As Date
Rem. Propriété en lecture seule. Dernière heure de planification.
   HeureOT = HOT
   End Function
Public Function Engagé() As Boolean
Rem. Propriété en lecture seule. Condition planification lancée.
   Engagé = Idt > 0
   End Function
Public Sub Actionner()
Rem. Méthode. Déclenche l'évènement Échoit.
'     Son invocation par le module objet détenteur n'est pas pertinente.
'     Elle est réservée au dispositif de service XPlanificateur.OnTimeJoue, dont
'     l'exécution est planifiée par une invocation de la méthode PlanifierDans.
   Idt = 0: RaiseEvent Échoit
   End Sub
Elle utilise un module standard XPlanificateur :
VB:
Rem. Module de servive effecteur de tâches des objets Planification.
'    NE PAS UTILISER EN PROGRAMMATION APPLICATIVE.
Option Explicit
Private TPlanifications() As Planification, Idt As Long
Public Sub DéplanifierTout()
   Dim P As Long, M As Long
   On Error Resume Next: M = UBound(TPlanifications): If Err Then Exit Sub
   On Error GoTo 0
   For P = 1 To M: Idt = Idt Mod M + 1
      If Not TPlanifications(Idt) Is Nothing Then TPlanifications(Idt).Annuler
      Set TPlanifications(Idt) = Nothing: Next P
   End Sub
Public Function IdtPlanificationLancée(ByVal Source As Planification) As Long
   Dim P As Long, M As Long
   On Error Resume Next: M = UBound(TPlanifications): If Err Then ReDim TPlanifications(1 To 1): M = 1
   On Error GoTo 0
   For P = 1 To M: Idt = Idt Mod M + 1
      If TPlanifications(Idt) Is Nothing Then Exit For
      Next P
   If P > M Then ReDim Preserve TPlanifications(1 To P): Idt = P
   Set TPlanifications(Idt) = Source
   Application.OnTime Source.HeureOT, "'XPlanificateur.OnTimeJoue " & Idt & "'"
   IdtPlanificationLancée = Idt
   End Function
Public Sub AnnulerPlanification(ByVal Idt As Long)
   On Error Resume Next
   Application.OnTime TPlanifications(Idt).HeureOT, "'XPlanificateur.OnTimeJoue " & Idt & "'", Schedule:=False
   Set TPlanifications(Idt) = Nothing
   End Sub
Private Sub OnTimeJoue(ByVal Idt As Long)
   On Error Resume Next
   TPlanifications(Idt).Actionner
   Set TPlanifications(Idt) = Nothing
   End Sub
Exemple d'utilisation dans ThiWorkbook :
VB:
Option Explicit
Private WithEvents Pln As Planification
Public Sub AmorcerTâche()
   If Pln Is Nothing Then Set Pln = New Planification
   Pln.PlanifierDans 1
   End Sub
Private Sub Pln_Échoit()
   MsgBox "Tâche exécutée.", vbInformation, "ThisWorkbook.Pln_Échoit"
   End Sub
Il ne reste plus qu'à invoquer ThisWorkbook.AmorcerTâche de n'importe où où on veut que ça s'exécute une seconde plus tard.
Mais pas dans une fonction invoquée par une formule, car là Excel ignore un Application.OnTime, il faut s'arranger pour utiliser un Workbook_SheetCalculate.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour