OnTime en VBA

Résolu
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 21 avril 2006 à 07:15
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 23 avril 2006 à 10:43
Bonjour à Tous !

J'ai un programme en VBA Excel 2003 à faire pour mon boulot, sachant que les utilisateurs ne connaissent rien en informatique, pour me la péter, j'ai mis un OnTime toutes les secondes qui affiche l'heure dans un Label de mon UserForm :

Sub AfficheHeure()

CowBoy = Now + TimeValue("00:00:01")

DateN = Format(Date, "dddd dd mmmm yyyy")
HeureN = Format(Time, "hh:mm:ss")

frmSaisie.lblDateHeure.Caption = DateN & " " & HeureN

Application.OnTime CowBoy, "AfficheHeure", , True

End Sub

Sub ArreteHeure()

On Error Resume Next
Application.OnTime CowBoy, "AfficheHeure", , False

End Sub

Ma 1ere question est "pourquoi lorsque ma procédure ArreteHeure s'execute, le code continue quand même ?

2nde question : "cette fonctionnalité est obsolète, c'est plus pour faire style, maintenant ce que je souhaiterai savoir c'est si ça utilise beaucoup les ressources du PC et la mémoire (sachant que le PC, c'est pas une flêche) ?

Merci et bonne matinée !

Mortalino

13 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 13:43
Je vine de faire un test en déclarant la variable CowBoy en global et le stop marche bien. Je te met le code :

avec ca ArreteHeure se stop bien.

'--------------------------------------------------------------------------------------------
Private CowBoy As Date

Sub AfficheHeure()

CowBoy = Now + TimeValue("00:00:01")

DateN = Format(Date, "dddd dd mmmm yyyy")
HeureN = Format(Time, "hh:mm:ss")

frmSaisie.lblDateHeure.Caption = DateN & " " & HeureN

Application.OnTime CowBoy, "AfficheHeure", , True

End Sub

Sub ArreteHeure()

On Error Resume Next
Application.OnTime CowBoy, "AfficheHeure", , False

End Sub
'----------------------------------------------------------------------------

Bonne fin de journée (et tres tres bon week end)

D'oh! Nuts!
Mmmmm...
DONUTS
3
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
22 avril 2006 à 22:30
Salut 647037 mortalino, salut =727152 Polack77,

en fait, comme le dit Polack77, la portée d'une variable locale d'une procédure est : la procédure (et sa durée de vie aussi).
Je rajoute: la portée d'une variable de niveau module (tout bloc de code en dehors d'une procédure ou d'une fonction, et de préférence au début du module [ici, un module est un panneau de code, donc module standard (*.bas), module de classe (*.cls) ou formulaire (*.frm)]) est : le module si elle est privée, le projet si elle publique, les projets si elle est globale (d'autres instructions peuvent contredire cela, par exemple : option private module).

Conseil : en règle générale, en POO, on n'utilise des variables globales (ou publiques) que lorsque c'est strictement nécessaire. En effet, le principal inconvénient de ces variables est qu'on ne sait jamais qui a écrit dedans, quand, ou si la valeur a changé ou non.

Maintenant, au niveau de l'utilisation que tu fais de la méthode OnTime, je souhaite te faire prendre conscience d'un fait important (à mes yeux, en tout cas).
Sais-tu exactement ce qu'il se passe lorsque tu décharges ton formulaire, sans arrêter la programmation de la tâche? Si tu veux le savoir, lances ton formulaire, mets l'heure en route, et fermes-le. Ensuite, va dans le code, et mets un point d'arrêt dans la procédure AfficheHeure, et observes (tu va reconnaître quelque chose que tu as sûrement déjà vu).

Tu vas peut-être me répondre qu'il n'y a pas de risque, car tu exécute AfficheHeure dans le UserForm_Initialize (ou Workbook_Open), et que tu exécutes ArreteHeure dans le UserForm_Terminate (ou Workbook_BeforeClose)! Le problème est que tu n'es pas sûr que ArreteHeure a bien fait son travail, et ce, à cause du On Error Resume Next.


Et là, en plus, je répond à ta question initiale : "pourquoi lorsque ma procédure ArreteHeure s'execute, le code continue quand même ?"
Enlèves le On Error Resume Next et VB te le dira! C'est pas parce qu'on ne comprend pas un message de VB que la solution de le nier (On Error Resume Next) est la bonne!
Dès le début, VB te signalait qu'il n'arrivait pas à "dé-programmer" la tâche "nommée" valeur de CowBoy (lis l'aide, et tu comprendras ce que j'entends par "nommée").
Et pour cause, il existait 2 variables déclarées implicitement en variant, une dans chacune de tes procédures (aucune ne voit l'autre, et aucune ne subsiste à la durée de vie de chaque procédure).

Enfin, pour le type de la déclaration de CowBoy, ne te prends pas la tête à le déclarer en Date, dans le prototype de OnTime, c'est un variant qui est attendu, ça limitera les cast.

C'était la minute (les 10 minutes) culture/confiture. Pour ceux qui ne connaissent pas, ça vient de : La culture, c'est comme la confiture, moins on en a, plus on l'étale :)

à+ vous deux,

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 10:42
Salut pour une fois c moi qui te file un coup de main (et ça ca me fait plaisir)
Je vien de faire des test et effectivement ca me fait pareil. Pour contourner le probléme peut tu te délarer une variable global Boolean Faire une fonction StartHeure qui passe cette variable à vrais mettre dans ta fonction ArreteHeure à faux et modif ta fonction de cette façon :
Sub AfficheHeure()
if BoolHeure then
CowBoy = Now + TimeValue("00:00:01")

DateN = Format(Date, "dddd dd mmmm yyyy")
HeureN = Format(Time, "hh:mm:ss")

frmSaisie.lblDateHeure.Caption = DateN & " " & HeureN

Application.OnTime CowBoy, "AfficheHeure", , True
end if
End Sub

Je fait des tests mais logiquement ça devrais aller.

D'oh! Nuts!
Mmmmm...
DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 10:46
Par contre au niveau ocupation de la machine tu peut le voir dans "Gestinaire des taches" (si tu à un Windows réssant) mais de toute facon ca ne dois vraiment pas être violant

D'oh! Nuts!
Mmmmm...
DONUTS
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 10:49
Je suis entrain de me demander ta variable CowBoy est crée en global ou en local car si pas crée en code elle est crée par le compilateur en local (juste pour la fonction) et est désalouer à la fin de cette fonction (dim CowBoy as date). C'est peut être pour ca que ton stop ne passe pas???

D'oh! Nuts!
Mmmmm...
DONUTS
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 avril 2006 à 11:15
Salut Polack et merci pour ton coup de main !
(je t'aurai bien aidé hier pour ton problème avec Word mais je voyais pas de soluce...)

Bref, pour le "cowboy", je l'ai meme pas déclarer.
(je m'y atèle)
Pout ton BoolHeure je vais effectivement le tester, sachant que cette procédure qui affiche la date et heure dans la Label s'exécute dès l'ouverture du classeur (car le UserForm s'affiche à l'ouverture)

Pour infos, j'ai Win XP donc je vérifierai la courbe de performance de l'UC, sachant que je viens de voir mon Admin réseau de ma société qui me dit que ça ne bouffe pas trop de ressources)

Je te tiens au courant et encore Merci (ça me fait plaisir aussi !)

Mortalino
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 11:59
Je suis entrain de me dire que c'est bien mieu si tu déclare tes
varaiables car si c'est le compilateur qui te les délares alors ce sont
des types Varian (et cas c'est lourd en mémoire).

D'oh! Nuts!
Mmmmm...
DONUTS
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 avril 2006 à 12:35
Ca y'est je l'ai déclarer en "Date".

J'ai adapté le type Boolean mais cela ne me change rien. Quand le UserForm se ferme, j'ai ma procédure d'arret qui s'exécute, le problème persite, c'est meme bizarre : apres avoir fermé le userform, (par Unload), je fais Alt F11 pour accéder a l'éditeur, je ne peux plus voir mon UserForm, quand je le fais s'afficher, entre 1 à 3 secondes, il affiche le module où sont stockés les procédures OnTime, et dans la barre bleue, en haut, le texte passe d'"Arret procédure" à "Exécution en cours", bien que je click sur le bouton STOP.

Qu'est ce que c'est !! Meme un virus tu peux l'arreter + facilement que ça...

Vraiment étrange.

Mortalino
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 13:37
Dans ta fonction tu lui dit de se re-lanser une second plus tard. Si tu utilise le boolean pour lui dire de ne plus se re-lanser elle contignue???? C'est tres etrange! je fait des tests pour voir ce que l'on peut faire. Tu à défini ta variable date en global ou dans une fonction? Pour déclarer une varible global tu la délar à l'exterieur de toute fonction (ou sub)
Pour déclarer une var globale :
Private NomVariable as TypeVariable (Accesible uniquement du module)
Public NomVariable as TypeVariable (Accesible dans tout le projet)

D'oh! Nuts!
Mmmmm...
DONUTS
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 avril 2006 à 13:54
Royal mon ami !

Ma variable était déclaré dans la même procédure, là en global c'est nickel (va savoir pourquoi ...)

Ben je te souhaite un bon WE à toi aussi et charge de revanche.

Mortalino
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 13:55
Vue que tu travail en temps réel méfi toi il est peut être possible que ta fonction AfficheHeure soit en cours d'exection quand tu fait ton stop et pour peut que se soit entre le momant ou tu défini CowBoy et ou tu fait ton ontime ta fonction ne vas pas se stoper (bas oui vue que tu fait ton ArreteHeure avant ton "Application.OnTime CowBoy, "AfficheHeure", , True") pour aviter ce probléme tu peut faire ça (à vrais dire je ne sait pas si c'est vraiment utile mais on ne sait jamais):

'--------------------------------------------------------------------------------------------
Private CowBoy As Date
Private FlagAfficheHeureEnCours as boolean

Sub AfficheHeure()

FlagAfficheHeureEnCours = true

CowBoy = Now + TimeValue("00:00:01")

DateN = Format(Date, "dddd dd mmmm yyyy")
HeureN = Format(Time, "hh:mm:ss")

frmSaisie.lblDateHeure.Caption = DateN & " " & HeureN

Application.OnTime CowBoy, "AfficheHeure", , True

FlagAfficheHeureEnCours = false

End Sub

Sub ArreteHeure()

do while FlagAfficheHeureEnCours
loop 'Ne sortira de cette boucle que quand FlagAfficheHeureEnCours sera à false (Attention ca rique d'ocuper ton pros!!!!)

On Error Resume Next
Application.OnTime CowBoy, "AfficheHeure", , False

End Sub
'----------------------------------------------------------------------------

D'oh! Nuts!
Mmmmm...
DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
21 avril 2006 à 13:57
Si tu défini une variable dans une procédure elle est détrute à la fin de cette procédure donc tu perd la valeur contenu.

D'oh! Nuts!
Mmmmm...
DONUTS
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 avril 2006 à 10:43
Salut rvblog,

Merci pour ta minute culture, et je confirme, que suivant comment le UserForm s'arrete, la tâche continue. Toutes tes précisions m'ont été utiles à la réalisation de ce OnTime, qui fonctionne royalement.

Tu as eu mon bien et je t'en remercie.

Mortalino
0
Rejoignez-nous