XL 2010 Timer évenementiel Excel VBA

pleasewait

XLDnaute Nouveau
Bonjour,
Je cherche conseil pour créer un timer événementiel sous Excel 2010 VBA (appel à lib Windows ???)
J'ai testé le code proposé par Microsoft pour les timer sur l'aide en ligne :
Dim PauseTime, Start, Finish, TotalTime
If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then
PauseTime = 5 ' Set duration.
Start = Timer ' Set start time.
Do While Timer < Start + PauseTime
DoEvents ' Yield to other processes.
Loop
Finish = Timer ' Set end time.
TotalTime = Finish - Start ' Calculate total time.
MsgBox "Paused for " & TotalTime & " seconds"
Else
End
End If

Cela ne répond pas du tout à ce que je veux faire (évidemment) :
  • Timer événementiel
  • CPU ok
Avez-vous des idées ?

Bonne soirée à tous.
 
Solution
Suffit de reprendre le code que j'ai déjà indiqué et ajouter le lancement à l'ouverture du classeur et l'arrêt à sa fermeture. Tout ça pour en arriver là ! :cool:

Et adapter la constante Private Const TimerDurationInSeconds = 60 * 3 'Timer toutes les 3 minutes

Dudu2

XLDnaute Barbatruc
Bonjour,

Pour palier ce problème de Call Back procédure du Timer obligatoirement en Module, j'ai fait une version de la Classe_Timer qui créé elle-même le Module et les fonctions dont elle a besoin pour le Call Back de son Timer.

Ça simplifie grandement l'utilisation avec la petite contrainte d'autoriser l'accès au projet VBA dans la sécurité des Macros et d'inclure la bibliothèque "Microsoft Visual Basic for Applications Extensibility 5.3 Library" dans les References VBA.

La Classe_Timer possède une méthode Initialize et un méthode QueryClose qui gèrent la création / suppression du Module relatif au Call Back de son Timer et qui sont à appeler dans le UserForm au début et à la fin comme leurs noms l'indiquent (voir exemple du fichier).

Le plus dur a été de récupérer l'adresse de la procédure de Call Back, ce qu'un petit tour de passe-passe a permis de réaliser.
 

Pièces jointes

  • VBA Évènements périodiques sur UserForm V2.xlsm
    46.1 KB · Affichages: 3
Dernière édition:

pleasewait

XLDnaute Nouveau
Bonjour,

En vous lisant et en lisant le code lié aux timers événementiels, je me rends compte que j'ai beaucoup trop de lacunes en programmation vba Excel et appel aux routines Windows pour faire un reverse facile.
Merci encore d'avoir donné cet os à ronger, cela va occuper mes longues soirées d'hiver à venir pour comprendre ...
Patience et longueur de temps ... 😉
 

Dudu2

XLDnaute Barbatruc
Bonjour,

J'ai republié le dernier fichier ci-dessus pour un détail de déclaration de LongPtr -> Long en non-VBA7 qui ne concerne que peu de gens à ce jour.

Maintenant, il y a un point technique que je vérifierai quand j'aurai un peu de temps.
Si comme le dit @Dranreb dans son post #15 tout à fait abscons (pour moi en tous cas) , l'utilisation d'un RaiseEvent ne remet pas l'exécution de call back Timer dans un contexte sous contrôle d'Excel, ce dont je doute, ça ne sert à rien de passer par une classe et gérer un évènement. Il suffirait alors d'appeler une fonction au retour du Timer sans plus de formalités. Je ferai donc à l'occasion des tests pour tenter de différencier par plantage VBA les 2 cas de figures.
 

pleasewait

XLDnaute Nouveau
Bonjour,

J'ai republié le dernier fichier ci-dessus pour un détail de déclaration de LongPtr -> Long en non-VBA7 qui ne concerne que peu de gens à ce jour.

Maintenant, il y a un point technique que je vérifierai quand j'aurai un peu de temps.
Si comme le dit @Dranreb dans son post #15 tout à fait abscons (pour moi en tous cas) , l'utilisation d'un RaiseEvent ne remet pas l'exécution de call back Timer dans un contexte sous contrôle d'Excel, ce dont je doute, ça ne sert à rien de passer par une classe et gérer un évènement. Il suffirait alors d'appeler une fonction au retour du Timer sans plus de formalités. Je ferai donc à l'occasion des tests pour tenter de différencier par plantage VBA les 2 cas de figures.
Bonjour,

Euh ... j'ai pas tout bien compris ... 🤣🤣🤣 mais vous avez sans doute raison ... ;)

Moi, je cherche juste un faire un timer ('tout bête'...) pour lancer une tâche cycliquement dans un classeur Excel mais ça n'a pas l'air si simple à faire du tout. Ce dont je ne me doutais pas au départ.

Merci pour votre aide en tout cas.
 

Dudu2

XLDnaute Barbatruc
Moi, je cherche juste un faire un timer ('tout bête'...) pour lancer une tâche cycliquement dans un classeur Excel
Dans ce cas, inutile d'agiter tout ce bazar de gestion d'évènement dans un UserForm (pour ce qui est de ce montage).

A condition que la résolution du Timer soit >= 1 seconde, tu places ça dans un module et tu fais ton traitement là où c'est indiqué.
VB:
Option Explicit

Private RunTime As Variant
Private Const TimerDurationInSeconds = 5

Sub StartTimer()
    RunTime = Now + TimeValue(Format(Int(TimerDurationInSeconds / 3600), "00") & ":" & _
                              Format(Int((TimerDurationInSeconds - Int(TimerDurationInSeconds / 3600) * 3600) / 60), "00") & ":" & _
                              Format(TimerDurationInSeconds Mod 60, "00"))
 
    Application.OnTime EarliestTime:=RunTime, Procedure:="RunTimer", Schedule:=True
End Sub

Sub StopTimer()
    On Error Resume Next
    Application.OnTime EarliestTime:=RunTime, Procedure:="RunTimer", Schedule:=False
    On Error GoTo 0
End Sub

Sub RunTimer()
    'Ici faire le traitement cyclique
    'MsgBox "RunTimer"
 
    'Relancer le Timer
    Call StartTimer
End Sub

Ce code tu peux l'appeler d'où tu veux.
 
Dernière édition:

pleasewait

XLDnaute Nouveau
Bonjour,

Pour palier ce problème de Call Back procédure du Timer obligatoirement en Module, j'ai fait une version de la Classe_Timer qui créé elle-même le Module et les fonctions dont elle a besoin pour le Call Back de son Timer.

Ça simplifie grandement l'utilisation avec la petite contrainte d'autoriser l'accès au projet VBA dans la sécurité des Macros et d'inclure la bibliothèque "Microsoft Visual Basic for Applications Extensibility 5.3 Library" dans les References VBA.

La Classe_Timer possède une méthode Initialize et un méthode QueryClose qui gèrent la création / suppression du Module relatif au Call Back de son Timer et qui sont à appeler dans le UserForm au début et à la fin comme leurs noms l'indiquent (voir exemple du fichier).

Le plus dur a été de récupérer l'adresse de la procédure de Call Back, ce qu'un petit tour de passe-passe a permis de réaliser.
Le classeur Evénement périodique.xlsm de la discussion #16 a l'air plus ... décortiquable ...

En avant toute !!!

Merci.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Moi, je cherche juste un faire un timer ('tout bête'...) pour lancer une tâche cycliquement dans un classeur
Oui mais vous ne dites jamais si c'est un traitement cyclique dans un module standard ou dans un module objet, or c'est totalement différent, puisque la procédure exécutée à la base par le Timer doit impérativement être dans un module standard. Mais attention, c'est souvent dans cette sorte de module qu'on travaille avec Excel, or, rappel: un timer exécutant des méthodes d'Excel est potentiellement dangereux. Pour des animations de contrôles dans un UserForm, pas de problème. Pour l'avoir dans un module objet tel qu'un UserForm il faut donc soit qu'elle en invoque une méthode, soit qu'elle y déclenche un évènement. C'est cette seconde solution que permet mon type d'objet Rythmeur très facile d'emploi sans la moindre adaptation nécessaire ailleurs que là où on veut l'utiliser. Juste prendre comme ils sont le module de classe Rythmeur (avec commentaires d'aide à l'emploi d'un objet de ce type) et le module standard d'intendance interne XRythmeur.
son post #15 tout à fait abscons (pour moi en tous cas)
Qu'est-ce qui est abscons la dedans ? Excel n'a rien à voir avec les évènements. Il utilise simplement comme tout le monde le même arsenal de base pour des évènements d'objets à lui, c'est tout.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
J'ai des doutes sur le fait qu'un Call Back de SetTimer qui, je l'ai expérimenté, peut faire exploser Excel sous certaines conditions ait le même effet qu'un RaiseEvent qui flag dans Excel le déclenchement d'un évènement.
Qu'est-ce qui est abscons la dedans ?
Ce n'est pas la même chose et je n'ai pas compris ton explication qui dit que c'est la même chose ou en tous cas, que les effets sont les mêmes.
Mais rien de grave, je ferai des tests à l'occasion pour différencier les 2 cas.
 

Dranreb

XLDnaute Barbatruc
Excel est usager d'évènements qui lui sont propres, pas acteur de leur mécanisme de fonctionnement.
Si je fais un RaiseEvent dans un de mes module de classe qui n'invoque aucune méthode d'Excel, et si coté utilisation la procédure de prise en charge de cet évènement non plus, Excel n'intervient en rien là dedans.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Tout comme je le fais moi, Excel fait un RaiseEvent pour décréter un de ses évènements à lui. Oui c'est probablement un service de Windows. Effectivement après ça Excel ne fait rien de plus, c'est une tâche système qui prend le relais pour aboutir à ma procédure de prise en charge.
 

pleasewait

XLDnaute Nouveau
Bonjour.

Oui mais vous ne dites jamais si c'est un traitement cyclique dans un module standard ou dans un module objet, or c'est totalement différent, puisque la procédure exécutée à la base par le Timer doit impérativement être dans un module standard. Mais attention, c'est souvent dans cette sorte de module qu'on travaille avec Excel, or, rappel: un timer exécutant des méthodes d'Excel est potentiellement dangereux. Pour des animations de contrôles dans un UserForm, pas de problème. Pour l'avoir dans un module objet tel qu'un UserForm il faut donc soit qu'elle en invoque une méthode, soit qu'elle y déclenche un évènement. C'est cette seconde solution que permet mon type d'objet Rythmeur très facile d'emploi sans la moindre adaptation nécessaire ailleurs que là où on veut l'utiliser. Juste prendre comme ils sont le module de classe Rythmeur (avec commentaires d'aide à l'emploi d'un objet de ce type) et le module standard d'intendance interne XRythmeur.
Qu'est-ce qui est abscons la dedans ? Excel n'a rien à voir avec les évènements. Il utilise simplement comme tout le monde le même arsenal de base pour des évènements d'objets à lui, c'est tout.
Bonjour,

Désolé si je n'ai pas été clair.

Mon idée est la suivante :

Pouvoir à l'ouverture d'un classeur (sur Event WorkBook_Open) lancer un timer

Sur évent fin du timer
  1. Lancer subroutine (call MaSubroutine() )
  2. Reset du timer
  3. Run du Timer reseté
  4. Si évent Fin du timer alors étape 1 (en boucle ...)
En boucle dans un module sans userform.
 

Dranreb

XLDnaute Barbatruc
Elle fait quoi votre MaSubroutine ?
ThisWorkbook est un module objet. Un objet Rythmeur y est donc utilisable.
Un objet Planification aussi.
Joignez un classeur montrant ce que vous voulez faire. Ce n'est pas clair.
Ce que vous indiquez comme ébauche de code me donne à penser que c'est plutôt du ressort d'une planification par Application.OnTime Now + TimeSerial(0, 0, 1), "MaSubroutine"
 

pleasewait

XLDnaute Nouveau
Elle fait quoi votre MaSubroutine ?
ThisWorkbook est un module objet. Un objet Rythmeur y est donc utilisable.
Un objet Planification aussi.
Joignez un classeur montrant ce que vous voulez faire. Ce n'est pas clair.
Ce que vous indiquez comme ébauche de code me donne à penser que c'est plutôt du ressort d'une planification par Application.OnTime.
La subroutine fait un simple ActiveWorkbook.SaveCopyAs.
C'est tout.

Donc je voudrais lancer cette subroutine cycliquement tous les n minutes ...

n étant paramétrable par un CustomProperties
 

Statistiques des forums

Discussions
312 325
Messages
2 087 307
Membres
103 513
dernier inscrit
adel.01.01.80.19