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

Dranreb

XLDnaute Barbatruc
Bonsoir.
Voyez le module XRythmeur de ce classeur.
Il est organisé de façon à permettre l'utilisation d'objets Rythmeur dans des modules objets (UserForm principalement) mais toutes les pièces nécessaires y figurent.

Édition: Je viens de relire votre 1er poste et je vois que vous chercher justement un timer évènementiel. Un Rythmeur en est précisément un, très simple d'emploi. Son évènement et ses méthodes sont documentées dans le module de classe Rythmeur. Ce dernier est en principe le seul à utiliser les procédures du module standard XRythmeur dont je parlais plus haut.
 

Pièces jointes

  • Progression.xlsm
    250.3 KB · Affichages: 21
Dernière édition:

pleasewait

XLDnaute Nouveau
Bonsoir.
Voyez le module XRythmeur de ce classeur.
Il est organisé de façon à permettre l'utilisation d'objets Rythmeur dans des modules objets (UserForm principalement) mais toutes les pièces nécessaires y figurent.

Édition: Je viens de relire votre 1er poste et je vois que vous chercher justement un timer évènementiel. Un Rythmeur en est précisément un, très simple d'emploi. Son évènement et ses méthodes sont documentées dans le module de classe Rythmeur. Ce dernier est en principe le seul à utiliser les procédures du module standard XRythmeur dont je parlais plus haut.
Bonsoir Dranreb,

C'est exactement ce que je cherchais ... mais en 10 fois mieux ...
A moi de bosser maintenant pour comprendre tout ça ... ou en tout cas ... ce que je dois comprendre pour en exploiter l'essentiel.
Merci.
 

pleasewait

XLDnaute Nouveau
Bonsoir.
Voyez le module XRythmeur de ce classeur.
Il est organisé de façon à permettre l'utilisation d'objets Rythmeur dans des modules objets (UserForm principalement) mais toutes les pièces nécessaires y figurent.

Édition: Je viens de relire votre 1er poste et je vois que vous chercher justement un timer évènementiel. Un Rythmeur en est précisément un, très simple d'emploi. Son évènement et ses méthodes sont documentées dans le module de classe Rythmeur. Ce dernier est en principe le seul à utiliser les procédures du module standard XRythmeur dont je parlais plus haut.
Bonjour cher maître,

J'adore l'animation de la feuille "Démo ShapeGlissant".
C'est génial.
Ça a un côté "stupido" mais j'adore.
 

Dranreb

XLDnaute Barbatruc
Non. Je m'était déjà heurté à cette impossibilité d'obtenir l'AddressOf d'une méthode.
C'est un peu normal: ce serait un coup à pouvoir l'exécuter sans que l'exemplaire auquel elle doit s'appliquer soit défini ! C'est d'ailleurs précisément pour ça que dans mon Progression.xlsm je passe par des modules standards qui les détiennent dans des collections ou des tableaux.
 

Dudu2

XLDnaute Barbatruc
Oui j'ai bien compris.
J'ai quand même essayé d'utiliser un AddressOf après l'instanciation de la classe pour obtenir une adresse de procédure (selon ce principe) mais c'est pareil, même quand la classe est définie, l'AddressOf plante de la même façon du fait que c'est une méthode de classe instanciée ou pas.

Sans doute parce que c'est un truc que VBA résout à la compilation, à un moment où évidemment la classe n'est que déclarative. Mais enfin ils auraient pu faire un effort et résoudre à l'exécution. Quand on appelle une méthode de classe VBA sait bien en trouver l'adresse.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Par contre, j'ai une question sur ton système de Rythmeur.
Lorsque le Timer arrive à échéance, tu déclenches l'évènement.
Est-ce que tu laisses tourner le Timer ou le Kill pour le faire relancer par la fonction de gestion de l'évènement ?
Parce que si le Timer tourne plus vite que le traitement par la fonction de gestion de l'évènement ça peut faire des nœuds non ?
Ou bien tu as mis en place un système de régulation ?
 

Dranreb

XLDnaute Barbatruc
Instancier un nombre quelquonque de variables du type d'objet ne change rien à ce que celle concernée ne serait pas définie.
Le Timer est arrêté sur demande de l'objet Rythmeur ou en cas d'incident à l'appel de la méthode qui déclenche son évènement, pour quelque raison que ce soit. Il n'est pas tué en dehors de ces deux cas.

Édition (longue) : Pour ce qui est du AddressOf, le problème n'est pas du coté de la méthode. Celle ci pourrait être retrouvée sans problème car elle est unique dans toute la programmation. On dit qu'elle est attachée au type d'objet, donc à la classe. Le problème c'est du coté de ses variables Private et de ses propriétés, lesquelles sont au contraire attachées à l'exemplaire. Leurs adresses sont en effet définies par rapport à celle attribuée à la variable objet lors de son Set. C'est pourquoi une méthode ne peut jamais être invoquée par une autre voie qu'étant qualifiée de cette expression objet. C'est même pour qu'on s'en rappelle chaque fois qu'on en parle, qu'une procédure Public dans un module de classe doit être appelée une méthode. Comme dans l'acception ordinaire du mot, elle ne peut s'appliquer toujours qu'à à un sujet, un produit, une chose en cours de fabrication etc. bien définie parmis d'autres possibles à l'instant où elle est mise en œuvre.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour,

Je suis revenu sur cette affaire d'AddressOf en essayant des trucs trouvés sur Internet sans succès.
Et même essayé un Application.Run "<nom méthode de classe>" (qui ne m'aurait servi à rien !) mais rien n'y fait.

Il faut absolument sortir en Module la procédure déclenchée par le Timer, et ça oblige à des contorsions un peu lourdes.

Edit: On pourrait d'ailleurs s'amuser à créer les modules et procédures en question sur l'appel d'une fonction d'initialisation de la Classe (déjà en place dans le code-ci-dessous pour définir les addresses de call back timer) et les supprimer en fermeture du UserForm.
 

Pièces jointes

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

Dudu2

XLDnaute Barbatruc
On peut aussi se demander pourquoi déclencher un évènement plutôt qu'utiliser directement le call back du Timer. En fait le code du call back du Timer s'exécute indépendamment de l'activité d'Excel et peut gravement entrer en conflit avec elle. Le fait de déclencher un évènement ramène (?) l'activité déclenchée dans le contexte Excel.
 

Dranreb

XLDnaute Barbatruc
Pour rendre la programmation de service indépendante de celle d'utilisations applicatives.
Effectivement dès qu'on touche aux cellules il y a des risque de plantage sévère à utiliser un timer. Pour les Shape ça a l'air d'aller (voir le ShapeGlissant qui en utilise un), pour des contrôles d'UserForm c'est sans danger.
 

Dranreb

XLDnaute Barbatruc
Le fait de déclencher un évènement ramène (?) l'activité déclenchée dans le contexte Excel.
Absolument pas. C'est purement VBA, simplement aussi employé par la programmation de la bibliothèque Excel, de l'application hôte, cette dernière ayant en plus le pouvoir d'installer des composants représentant ses entités, et de définir des objets assumés à défaut de spécification pour certaines méthodes et propriétés, c'est tout.
 

Statistiques des forums

Discussions
312 322
Messages
2 087 275
Membres
103 504
dernier inscrit
Marie28