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

doEvents et barre de progression

6 réponses
Avatar
Syl
Bonjour!

J'ai une macro assez longue qui met jusqu'=E0 une minute pour
s'ex=E9cuter, pour faire patienter l'utilisateur j'utilise une barre de
progression (celle de John Walkenback) je ne la met pas dans le post
car celle-ci est plut=F4t bien connue.

Mon probl=E8me c'est que cette barre bien qu'elle fonctionne tr=E8s bien,

augmente le temps de la macro du double. Ce qui fait que ma macro
plut=F4t que de durer une minute dure pr=E8s de deux minutes.
Concr=E8tement la barre de progression arrive =E0 100% apr=E8s une minute
et ensuite le code s'ex=E9cute pendant la minute qui suit.

C'est comme si la fonction "doEvents" ne donnait pas assez de temps au
code pour s'ex=E9cuter. Dans l'aide de Excel il est aussi fait mention
du "Contr=F4le Timer" pour cette t=E2che.

Quelqu'un aurait une solution.=20


Merci.

6 réponses

Avatar
michdenis
Bonjour Syl,

Pourquoi ne pas publier ta macro ici ?


Salutations!


"Syl" a écrit dans le message de news:
Bonjour!

J'ai une macro assez longue qui met jusqu'à une minute pour
s'exécuter, pour faire patienter l'utilisateur j'utilise une barre de
progression (celle de John Walkenback) je ne la met pas dans le post
car celle-ci est plutôt bien connue.

Mon problème c'est que cette barre bien qu'elle fonctionne très bien,

augmente le temps de la macro du double. Ce qui fait que ma macro
plutôt que de durer une minute dure près de deux minutes.
Concrètement la barre de progression arrive à 100% après une minute
et ensuite le code s'exécute pendant la minute qui suit.

C'est comme si la fonction "doEvents" ne donnait pas assez de temps au
code pour s'exécuter. Dans l'aide de Excel il est aussi fait mention
du "Contrôle Timer" pour cette tâche.

Quelqu'un aurait une solution.


Merci.
Avatar
Syl
Bonjour!

Voici ma macro...

Sub Main()

'Lancé sur activation de frmSprogression
'Calcule le pourcentage du travail de comparaison qui est complété
Dim PctDone As Single
Dim PauseTime, Start, Finish, TotalTime

PauseTime = 3 ' Définit la durée.
Start = Timer ' Définit l'heure de début.
Do While Timer < Start + PauseTime
DoEvents ' Donne le contrôle à d'autres processus, permet le
rafraichissement de la barre
PctDone = (Timer - Start) / PauseTime
Call UpdateProgress(PctDone)
Loop
Unload frmProgression

End Sub

Sub UpdateProgress(Pct)
'Ajuste la largeur de la bande rouge du formulaire progression
With frmProgression
.FrameProgress.Caption = Format(Pct, "0%")
.LabelProgress.Width = Pct * (.FrameProgress.Width - 10)
.Repaint
End With
End Sub

Merci!
Avatar
michdenis
Bonjour Syl,

Tu aurais avantage à définir le type de tes variables... cela devrait te faire gagner
du temps ...

Dim PctDone As Single
Dim PauseTime As Integer, Start As Single

Deuxièmement, en début de macro as-tu désactivé les macros événementielles par :
Application.EnableEvents = False
Macro
Application.EnableEvents = True

Troisièmement, tu peux aussi désactiver le calcul automatique ....
Application.Calculation = xlCalculationManual
et à la fin :
Application.Calculation = xlCalculationAutomatic



Salutations!





"Syl" a écrit dans le message de news:
Bonjour!

Voici ma macro...

Sub Main()

'Lancé sur activation de frmSprogression
'Calcule le pourcentage du travail de comparaison qui est complété
Dim PctDone As Single
Dim PauseTime, Start, Finish, TotalTime

PauseTime = 3 ' Définit la durée.
Start = Timer ' Définit l'heure de début.
Do While Timer < Start + PauseTime
DoEvents ' Donne le contrôle à d'autres processus, permet le
rafraichissement de la barre
PctDone = (Timer - Start) / PauseTime
Call UpdateProgress(PctDone)
Loop
Unload frmProgression

End Sub

Sub UpdateProgress(Pct)
'Ajuste la largeur de la bande rouge du formulaire progression
With frmProgression
.FrameProgress.Caption = Format(Pct, "0%")
.LabelProgress.Width = Pct * (.FrameProgress.Width - 10)
.Repaint
End With
End Sub

Merci!
Avatar
Syl
Bonjour Mich.

J'ai appliqué tes suggestions qui sont fort intéressantes mais sans
succès. J'ai fait un test, c'est à dire que j'ai mis un arrêt dans
le code sur l'instruction "Loop", ensuite j'ai lancé l'application au
point d'arrêt j'ai maintenu la touche F8 enfoncée pour suivre
l'exécution à vitesse assez élevée. Le constat est que si la durée
de la progression est ajustée à 20 sec par exemple, soit "PauseTime =
20", pendant ce temps seule cette boucle s'exécute et une fois le
délais passé la procédure initiale se termine. Donc la procédure
initiale qui fait appel à "Main" et la procédure "Main" s'exécutent
séquentiellement et non simultanément.


???

Merci de ton aide.
Avatar
Michel Pierron
Bonjour Syl;
M'est avis que l'instruction DoEvents serait mieux optimisée en étant placée
en fin de boucle plutôt qu'en début, mais j'ai des doutes quant à
l'imbrication judicieuse de tes procédures.
Pour quoi est-il nécessaire de définir la durée alors que cette dernière
devrait être implicitement donnée par la durée de traitement de la macro
principale ?

MP

"Syl" a écrit dans le message de news:

Bonjour!

Voici ma macro...

Sub Main()

'Lancé sur activation de frmSprogression
'Calcule le pourcentage du travail de comparaison qui est complété
Dim PctDone As Single
Dim PauseTime, Start, Finish, TotalTime

PauseTime = 3 ' Définit la durée.
Start = Timer ' Définit l'heure de début.
Do While Timer < Start + PauseTime
DoEvents ' Donne le contrôle à d'autres processus, permet le
rafraichissement de la barre
PctDone = (Timer - Start) / PauseTime
Call UpdateProgress(PctDone)
Loop
Unload frmProgression

End Sub

Sub UpdateProgress(Pct)
'Ajuste la largeur de la bande rouge du formulaire progression
With frmProgression
.FrameProgress.Caption = Format(Pct, "0%")
.LabelProgress.Width = Pct * (.FrameProgress.Width - 10)
.Repaint
End With
End Sub

Merci!
Avatar
Syl
Bonjour!

Effectivement c'est l'imbrication qui faisait défaut, en insérant la
procédure principale au bon endroit dans "Sub Main()" le problème
s'est corrigé.


Merci!