Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Mise en oeuvre du chronomètre (suite)

4 réponses
Avatar
COQUITO
En fait je m'aperçois que j'appelle 2 fois ma macro Calcul_Data : une fois
par le menu et une fois par le UserForm_Activate.
Donc, cela ne va pas du tout.

J'ai donc modifié ainsi : ma troisième commande de menu appelle la petite
procédure que tu me conseillais "Ouvrir_Formulaire", logée dans mon module
B_Controles
Et UserForm_Activate appelle Calcul_Data

Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub

Je n'ai plus le message d'erreur 400 "Feuille déjà affichée ; affichage
modal impossible" mais le chrono ne se déclenche pas.

Je ne m'en sors pas.

Merci d'avance pour ton aide précieuse.

4 réponses

Avatar
michdenis
Bonjour,

Modifie la procédure comme suit : ajoute une ligne de code

Lorsque tu lanceras la procédure, elle s'arrêtera sur la commande "Stop"
utilise la touche F8 pour exécuter pas à pas le reste de la macro.

Ceci te permettra de voir si le chronomètre est effectivement en opération
et fonctionne durant l'exécution de la macro Calcul_Data

Je dois dire que je n'ai jamais utilisé ce chronomètre ou d'autre forme de
chronomètre pendant qu'une macro s'exécute. Il est "très possible"que l'exécution
de la macro nuise à l'exécution du code du chronomètre ! Excel n'est pas
une application multi tread (Est-ce possible de faire tourner en mémoire
un processus pendant que le processeur s'active à exécuter une macro dans
un autre en simultanée ?). Personnellement j'en doute ! L'autre alternative
est d'ajouter des lignes de code à divers endroit dans le code de ta macro
"Calcul Data". La ligne de code est la commande:
Doevents
À chaque fois que ton programme exécutera "DoEvents", ta macro donnera
la main à Windows et ce dernier exécutera les actions en attente dont la mise
à jour du chronomètre). Comme le chrono affiche les dixièmes de seconde, il
faudrait un nombre important de "DoEvents" pour permettre le rafraîchissement
du chrono lors du déroulement de ta macro. Si la chose t'intéresse, fais des tests...

Perso, je ne connais pas d'autre moyen de réaliser ce que tu tentes de faire !

'----------------------------
Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Stop '<<=====Ligne ajoutée
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub
'----------------------------



"COQUITO" a écrit dans le message de groupe de discussion :

En fait je m'aperçois que j'appelle 2 fois ma macro Calcul_Data : une fois
par le menu et une fois par le UserForm_Activate.
Donc, cela ne va pas du tout.

J'ai donc modifié ainsi : ma troisième commande de menu appelle la petite
procédure que tu me conseillais "Ouvrir_Formulaire", logée dans mon module
B_Controles
Et UserForm_Activate appelle Calcul_Data

Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub

Je n'ai plus le message d'erreur 400 "Feuille déjà affichée ; affichage
modal impossible" mais le chrono ne se déclenche pas.

Je ne m'en sors pas.

Merci d'avance pour ton aide précieuse.
Avatar
LE TROLL
Bonjour,

Le TIMER

La procédure du timer doit englober le code de traitement de la routine
voulue (macro).

sub timer1...
macro à temporiser
end sub

Au début
dim compteur as long
timer1.value = ' vitesse en 1000e/s, ne pas descendre sous 50e/s.
timer1.enabledúlse

---------------

Au lancement
compteur = 10 ' supposons
timer1.enabled = true ' c'est parti !

sub timer1()
' la macro, son code ici s'exécute
compteur = compteur - 1 ' à chaque passage
if compteur < 1 then timer1.enabled = false ' fin de procédure timer
End sub

Nota bene, tu peux aussi prendre une variable globale qui va être actionné
depuis un autre procédure de ta macro, et dont on teste l'état dans la
procédure du timer et si x = action, par exemple pour larêter avant la fin,
tu a un bouton <stop>, tu lui assigne la variable globale
dim stopper as boolean
stopper = false
Si tu cliques sur ton bouton, dans sa procédure tu fais : stopper = true
Et dans la procédure du timer tu auras mis
if stopper = true then timer1.enabled = false

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"michdenis" a écrit dans le message de
news:
Bonjour,

Modifie la procédure comme suit : ajoute une ligne de code

Lorsque tu lanceras la procédure, elle s'arrêtera sur la commande "Stop"
utilise la touche F8 pour exécuter pas à pas le reste de la macro.

Ceci te permettra de voir si le chronomètre est effectivement en opération
et fonctionne durant l'exécution de la macro Calcul_Data

Je dois dire que je n'ai jamais utilisé ce chronomètre ou d'autre forme de
chronomètre pendant qu'une macro s'exécute. Il est "très possible"que
l'exécution
de la macro nuise à l'exécution du code du chronomètre ! Excel n'est pas
une application multi tread (Est-ce possible de faire tourner en mémoire
un processus pendant que le processeur s'active à exécuter une macro dans
un autre en simultanée ?). Personnellement j'en doute ! L'autre
alternative
est d'ajouter des lignes de code à divers endroit dans le code de ta macro
"Calcul Data". La ligne de code est la commande:
Doevents
À chaque fois que ton programme exécutera "DoEvents", ta macro donnera
la main à Windows et ce dernier exécutera les actions en attente dont la
mise
à jour du chronomètre). Comme le chrono affiche les dixièmes de seconde,
il
faudrait un nombre important de "DoEvents" pour permettre le
rafraîchissement
du chrono lors du déroulement de ta macro. Si la chose t'intéresse, fais
des tests...

Perso, je ne connais pas d'autre moyen de réaliser ce que tu tentes de
faire !

'----------------------------
Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Stop '<<=====Ligne ajoutée
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub
'----------------------------



"COQUITO" a écrit dans le message de groupe de
discussion :

En fait je m'aperçois que j'appelle 2 fois ma macro Calcul_Data : une fois
par le menu et une fois par le UserForm_Activate.
Donc, cela ne va pas du tout.

J'ai donc modifié ainsi : ma troisième commande de menu appelle la petite
procédure que tu me conseillais "Ouvrir_Formulaire", logée dans mon module
B_Controles
Et UserForm_Activate appelle Calcul_Data

Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub

Je n'ai plus le message d'erreur 400 "Feuille déjà affichée ; affichage
modal impossible" mais le chrono ne se déclenche pas.

Je ne m'en sors pas.

Merci d'avance pour ton aide précieuse.

Avatar
COQUITO
Bonsoir,

Je pense que tu as vu juste en disant que l'exécution de la macro nuit
probablement à l'exécution du code du chronomètre.

En effet, j'ai constaté que lorsque ma macro a fini de s'exécuter, le
chronomètre démarre !!
Evidemment, ce n'est pas du tout ce que je voudrais.
En tout cas, merci une fois encore d'avoir cherché une solution.
Bonne soirée.

"michdenis" a écrit dans le message de
news:
Bonjour,

Modifie la procédure comme suit : ajoute une ligne de code

Lorsque tu lanceras la procédure, elle s'arrêtera sur la commande "Stop"
utilise la touche F8 pour exécuter pas à pas le reste de la macro.

Ceci te permettra de voir si le chronomètre est effectivement en opération
et fonctionne durant l'exécution de la macro Calcul_Data

Je dois dire que je n'ai jamais utilisé ce chronomètre ou d'autre forme de
chronomètre pendant qu'une macro s'exécute. Il est "très possible"que
l'exécution
de la macro nuise à l'exécution du code du chronomètre ! Excel n'est pas
une application multi tread (Est-ce possible de faire tourner en mémoire
un processus pendant que le processeur s'active à exécuter une macro dans
un autre en simultanée ?). Personnellement j'en doute ! L'autre
alternative
est d'ajouter des lignes de code à divers endroit dans le code de ta macro
"Calcul Data". La ligne de code est la commande:
Doevents
À chaque fois que ton programme exécutera "DoEvents", ta macro donnera
la main à Windows et ce dernier exécutera les actions en attente dont la
mise
à jour du chronomètre). Comme le chrono affiche les dixièmes de seconde,
il
faudrait un nombre important de "DoEvents" pour permettre le
rafraîchissement
du chrono lors du déroulement de ta macro. Si la chose t'intéresse, fais
des tests...

Perso, je ne connais pas d'autre moyen de réaliser ce que tu tentes de
faire !

'----------------------------
Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Stop '<<=====Ligne ajoutée
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub
'----------------------------



"COQUITO" a écrit dans le message de groupe de
discussion :

En fait je m'aperçois que j'appelle 2 fois ma macro Calcul_Data : une fois
par le menu et une fois par le UserForm_Activate.
Donc, cela ne va pas du tout.

J'ai donc modifié ainsi : ma troisième commande de menu appelle la petite
procédure que tu me conseillais "Ouvrir_Formulaire", logée dans mon module
B_Controles
Et UserForm_Activate appelle Calcul_Data

Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub

Je n'ai plus le message d'erreur 400 "Feuille déjà affichée ; affichage
modal impossible" mais le chrono ne se déclenche pas.

Je ne m'en sors pas.

Merci d'avance pour ton aide précieuse.

Avatar
COQUITO
Bonsoir,

Merci de m'avoir répondu.
J'ai un peu de mal à comprendre la structure du code que tu me proposes, je
ne vois pas trop comment m'y prendre.

En tout cas, je ne veux pas de bouton car pour ce que je souhaite faire,
cela n'a pas de sens que l'utilisateur déclenche ou arrête le chrono
lui-même. Il faut que le chrono soit lancé en même temsp que la macro et
s'arrête lorsque la macro a fini de s'exécuter.
Il semble que cela aille au-delà des possibilités d'Excel.
Merci.

"LE TROLL" <le a écrit dans le message de
news:
Bonjour,

Le TIMER

La procédure du timer doit englober le code de traitement de la routine
voulue (macro).

sub timer1...
macro à temporiser
end sub

Au début
dim compteur as long
timer1.value = ' vitesse en 1000e/s, ne pas descendre sous 50e/s.
timer1.enabledúlse

---------------

Au lancement
compteur = 10 ' supposons
timer1.enabled = true ' c'est parti !

sub timer1()
' la macro, son code ici s'exécute
compteur = compteur - 1 ' à chaque passage
if compteur < 1 then timer1.enabled = false ' fin de procédure timer
End sub

Nota bene, tu peux aussi prendre une variable globale qui va être actionné
depuis un autre procédure de ta macro, et dont on teste l'état dans la
procédure du timer et si x = action, par exemple pour larêter avant la
fin, tu a un bouton <stop>, tu lui assigne la variable globale
dim stopper as boolean
stopper = false
Si tu cliques sur ton bouton, dans sa procédure tu fais : stopper = true
Et dans la procédure du timer tu auras mis
if stopper = true then timer1.enabled = false

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"michdenis" a écrit dans le message de
news:
Bonjour,

Modifie la procédure comme suit : ajoute une ligne de code

Lorsque tu lanceras la procédure, elle s'arrêtera sur la commande "Stop"
utilise la touche F8 pour exécuter pas à pas le reste de la macro.

Ceci te permettra de voir si le chronomètre est effectivement en
opération
et fonctionne durant l'exécution de la macro Calcul_Data

Je dois dire que je n'ai jamais utilisé ce chronomètre ou d'autre forme
de
chronomètre pendant qu'une macro s'exécute. Il est "très possible"que
l'exécution
de la macro nuise à l'exécution du code du chronomètre ! Excel n'est pas
une application multi tread (Est-ce possible de faire tourner en mémoire
un processus pendant que le processeur s'active à exécuter une macro dans
un autre en simultanée ?). Personnellement j'en doute ! L'autre
alternative
est d'ajouter des lignes de code à divers endroit dans le code de ta
macro
"Calcul Data". La ligne de code est la commande:
Doevents
À chaque fois que ton programme exécutera "DoEvents", ta macro donnera
la main à Windows et ce dernier exécutera les actions en attente dont la
mise
à jour du chronomètre). Comme le chrono affiche les dixièmes de seconde,
il
faudrait un nombre important de "DoEvents" pour permettre le
rafraîchissement
du chrono lors du déroulement de ta macro. Si la chose t'intéresse, fais
des tests...

Perso, je ne connais pas d'autre moyen de réaliser ce que tu tentes de
faire !

'----------------------------
Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Stop '<<=====Ligne ajoutée
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub
'----------------------------



"COQUITO" a écrit dans le message de groupe de
discussion :

En fait je m'aperçois que j'appelle 2 fois ma macro Calcul_Data : une
fois
par le menu et une fois par le UserForm_Activate.
Donc, cela ne va pas du tout.

J'ai donc modifié ainsi : ma troisième commande de menu appelle la petite
procédure que tu me conseillais "Ouvrir_Formulaire", logée dans mon
module
B_Controles
Et UserForm_Activate appelle Calcul_Data

Private Sub UserForm_Activate()
Me.Repaint
TimerOn 100
Call Calcul_Data 'Appel de la macro à exécuter
Me.Hide
TimerOff
Label1.Caption = "00:00:00"
Label2.Caption = "0"
Unload Me
End Sub

Je n'ai plus le message d'erreur 400 "Feuille déjà affichée ; affichage
modal impossible" mais le chrono ne se déclenche pas.

Je ne m'en sors pas.

Merci d'avance pour ton aide précieuse.