QUESTION POUR EXPERTS !!!!!

Résolu
cs_Le routier Messages postés 16 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 19 mai 2006 - 28 févr. 2006 à 17:57
cs_Le routier Messages postés 16 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 19 mai 2006 - 1 mars 2006 à 09:27
Pendant l'exécution d'une macro très longue, j'affiche une userform contenant un WindowsMediaPlayer (qui diffuse une image GIF patientez en mouvement)
.
Jusque là tout va bien sauf que ma macro "bouffe" toute la RAM (je pense) et mon fichier ne s'affiche en mouvement que lorsqu'elle s'arrête (Msgbox ou autres interruptions ...)

Quelqu'un(e) aurrait LA solution miracle?

voici mon code :

Sub Regroupement_Macro

With UserForm1
.Show (0) 'l'afiche en non modal pour permettre l'exe du reste de la macro
.WindowsMediaPlayer1.Controls.Play
End With

application.run "MACRO 1" ' )
application.run "MACRO 2" ' ) => Mes différentes macro
application.run "MACRO 3" ' )

UserForm1.Hide

End sub

PS je suis en VBA

MERCI D'AVANCE A TOUS et BONNE SOIREE !!!

Les routiers sont sympas !!!

11 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 mars 2006 à 00:02
Pour les DoEvents, la solution consiste à ne donner la main au système que toutes les X itérations.
Par exemples, tous les 500

If VariableBoucle / 500 = Int(VariableBoucle / 500)) Then DoEvents

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
3
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
28 févr. 2006 à 18:11
Salut,
Essais de mettre quelques DoEvents dans ton code cela va permettre à ton proc de respirer un peu


0
Utilisateur anonyme
28 févr. 2006 à 18:12
Salut,

Tu as penser a mettre un DoEvents dans dans boucle ? (pour laisser la main aux autre fonctions et dont la lecture de ton gif)

Kenji
<hr size="2" width="100%">
Merci de cliquer sur "Réponse acceptée" si une réponse vous convient.
0
cs_Le routier Messages postés 16 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 19 mai 2006
28 févr. 2006 à 18:21
Ouais, j'y ai pensé, et c'est vrai que c'est une solution. Le seul pb c'est que c'est un code super long avec un max de boucle et que déjà il met pas loin de 5 minutes à le faire alors avec des DoEvents partout ça ralentit trop ....

Mais merci qd même et si vous avez d'autres propositions ...

Les routiers sont sympas !!!
0

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

Posez votre question
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
28 févr. 2006 à 18:33
Après je vois que les threads. Execute la lecture de ton gif dans un thread à part.
Mais je ne sais pas trop si vba supporte l'utilisation de plusieurs threads.
Ou essais l'api Sleep mais qui reviens au meme que DoEvent...

0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
28 févr. 2006 à 20:37
Salut,

Willi, l'api Sleep n'est en aucun cas la même chose que doevents.

DoEvents redonne la main au système et permet ainsi (s'il est bien employé) que d'autres processus se déroulent.
Sleep, GELE le prog et ne redonne la main à aucun autre processus.

Une belle image animée c'est sympa pour faire patienter mais, surtout en VBA, faut peut-être éviter les fioritures quand on a un code qui met déjà 5mn pour s'exécuter.

Une petite question, si tu ne lances pas wmp, l'exécution de ta macro dure toujours 5mn ?

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
28 févr. 2006 à 21:04
Bonsoir à tous....

Je ne suis pas "expert".
N'ayant pas VB5, VB6, VB.Net...etc
J'utilise betement le VBS.
En VBS, il n'y a pas de ProgressBar, donc, via WMI, j'affiche une fenetre "Veuillez patentier !!!!', sans bouffer du RAM

fic = "c:\test.txt"
' ################## AFFICHER UNE FENETRE D'INFORMATION
strComputer = "."
Set objWMIService = GetObject("Winmgmts:\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_DesktopMonitor")
For Each objItem in colItems
intHorizontal = objItem.ScreenWidth
intVertical = objItem.ScreenHeight
Next
Set objExplorer = CreateObject("InternetExplorer.Application")
objExplorer.Navigate "about:blank"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Left = (intHorizontal - 800) / 2
objExplorer.Top = (intVertical - 100) / 2
objExplorer.Width = 500
objExplorer.Height = 180
objExplorer.Visible = 1
objExplorer.Document.Body.Style.Cursor = "wait"
objExplorer.Document.Title = fic & " - " & Now
objExplorer.Document.Body.InnerHTML = "
Création du fichier
""" &_
fic & """
en cours , merci de patienter.
"

' ################## FERMER LA FENETRE
objExplorer.Document.Body.Style.Cursor = "default"
objExplorer.Quit
Set objExplorer = Nothing
Set objWMIService = Nothing
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
28 févr. 2006 à 21:20
CanisLupus oui c'est vrai que Sleep gèle l'appli pendant un certain temps. Merci d'avoir rectifié.
Comme tu dis il est maintenant possible de wmp ralentisse l'execution de sa macro mais à vérifier.
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
28 févr. 2006 à 22:01
LE routier < Tu crains que des DoEvents ne ralentisse ta macro !! En fait, ce n'est pas le DoEvents (un seul par boucle suffit hein ! Pas la peine d'en mettre 12 derrière chaque instruction d ela boucle, je le rappelle au passage) qui va ralentir ta macro, c'est ce que Windows va devoir faire à cause du DoEvents, comme assumer WMP !! Si tu veux que ta macro soit aussi rapide que possible, comme Canis Lupus le dit, faut éviter les fioriture :
1- Un petit message "Veuillez patienter, cela va être long ............." sur une userform,
2- Un Dovents tout de même dans les boucles car sinon, si l'utilisateur joue du Alt+Tab pdt ta macro de 5minutes, et qu'il revient sur ton appli, il aura un joli carré tout blanc à la place.
3- Essaye d'optimiser tes macros ... il y a peut-être moyen de grapiller des dizaines de secondes d'execution.
4- Utiliser une machine 8 x µProc avec 16Go de RAM

Christophe R
0
cs_etniqs Messages postés 201 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 10 mai 2016
1 mars 2006 à 09:14
Dans la solution statique mais pas trop, j'utilise un userform (Waitbox) avec un label.caption d'information différent à chaque étape (un compteur de lignes,...) il suffit d'avoir :

Waitbox.Show vbModeless en tête de puit
et Waitbox.Repaint après chaque changement de caption

coïto ergo sum
0
cs_Le routier Messages postés 16 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 19 mai 2006
1 mars 2006 à 09:27
Merci pour toutes ces infos ...

Pour répondre à 169075 CanisLupus c'est vrai que si je ne lance pas WMP la macro gagne 1 peu de temps ...


Et je crois que je vais suivre vos conseils et mettre seulement une petite userform "patientez" avec 1 ou 2 DoEvents avec l'astuce de =2204 jack (que je ne conaissait pas !!) ... Etant donné que c'est pour un projet professionnel c'était juste pour faire joli et le rendre plus PRO.... mais bon tant pis ... je préfère gagner en efficacité qu'en "Fioritures" ....


Encore merci à tous d'avoir user de votre temps et bonne journée !!!!!*

Tschuss !!!

Les routiers sont sympas !!!
0
Rejoignez-nous