VBA Excel : Dysfonction UserForm après 6 sec.
Résolu/Fermé
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
-
8 juil. 2010 à 23:08
EGM - 28 juil. 2010 à 09:43
EGM - 28 juil. 2010 à 09:43
A voir également:
- Userform repaint
- Liste déroulante excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
- Mise en forme conditionnelle excel - Guide
10 réponses
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
949
11 juil. 2010 à 18:42
11 juil. 2010 à 18:42
Salut le forum
Il y aurait peut-être une solution avec DoEvents.
Mytå
Il y aurait peut-être une solution avec DoEvents.
DoEvents passe la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de traiter les événements de sa file d'attente
Mytå
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
11 juil. 2010 à 20:03
11 juil. 2010 à 20:03
Merci à tous,
la solution de Mytå fonctionne bien, j'ai placé le DoEvents dans la boucle juste avant de modifier le contrôle:
La macro retrouve sa vélocité normale.
Je met le poste en résolu
Patrice
la solution de Mytå fonctionne bien, j'ai placé le DoEvents dans la boucle juste avant de modifier le contrôle:
For Each wsh In wbkCible.Worksheets DoEvents frmStatus.lblStatus.Caption = wsh.Name frmStatus.Repaint ....
La macro retrouve sa vélocité normale.
Je met le poste en résolu
Patrice
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
949
11 juil. 2010 à 21:36
11 juil. 2010 à 21:36
Re le forum
Au plaisir de t'aider de nouveau sur une prochaine discussion.
Mytå
Au plaisir de t'aider de nouveau sur une prochaine discussion.
Mytå
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 708
8 juil. 2010 à 23:32
8 juil. 2010 à 23:32
bonjour
Cela m'a l'air d'un phénomène bien connu pour un affichage dans une boucle longue.
Lorsque tu modifies ton intitulé (lblStatus), essaies de rajouter :
Cela force l'affichage qui devrait mieux fonctionner.
Cela m'a l'air d'un phénomène bien connu pour un affichage dans une boucle longue.
Lorsque tu modifies ton intitulé (lblStatus), essaies de rajouter :
lblStatus.Repaint
Cela force l'affichage qui devrait mieux fonctionner.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
8 juil. 2010 à 23:52
8 juil. 2010 à 23:52
Bonjour gbinforme
la ré-actualisation de l'affichage du formulaire est déjà présente dans le code : frmStatus.Repaint
lorsque j'essaye de l'appliquer à l'intitulé (frmStatus.lblStatus.Repaint) j'ai une erreur de compilation « Membre de méthode ou de données introuvable » puisque la méthode ne s'applique pas aux Intitulés (label).
la ré-actualisation de l'affichage du formulaire est déjà présente dans le code : frmStatus.Repaint
lorsque j'essaye de l'appliquer à l'intitulé (frmStatus.lblStatus.Repaint) j'ai une erreur de compilation « Membre de méthode ou de données introuvable » puisque la méthode ne s'applique pas aux Intitulés (label).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 708
9 juil. 2010 à 08:45
9 juil. 2010 à 08:45
bonjour
Utilises plutôt une textbox pour afficher car effectivement un intitulé n'ai pas fait pour cela.
C'est effectivement sur la userform qu'il faut appliquer la fonction et si tu ne veux pas qu'elle ralentisse trop le processus, il ne faut modifier le contenu qu'au bout de plusieurs secondes (20-30) car l'affichage prend beaucoup de temps par rapport aux calculs.
Utilises plutôt une textbox pour afficher car effectivement un intitulé n'ai pas fait pour cela.
C'est effectivement sur la userform qu'il faut appliquer la fonction et si tu ne veux pas qu'elle ralentisse trop le processus, il ne faut modifier le contenu qu'au bout de plusieurs secondes (20-30) car l'affichage prend beaucoup de temps par rapport aux calculs.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
9 juil. 2010 à 10:36
9 juil. 2010 à 10:36
Bonjour gbinforme, merci de ta réponse.
J'ai essayé de remplacer le Label par un TextBox mais ça ne change rien !
Par contre j'ai exploré la piste de mettre plusieurs .Repaint dans la boucle même si le contenu du UserForm ne change pas.
En plaçant un .Repaint dans la boucle Cell, ça fonctionne mais, bien sur, la durée de la macro devient excessivement longue !
En compromis, j'ai essayé d'utiliser la fonction Timer pour faire un rafraichissement toutes les secondes mais ça ne fonctionne pas, la fréquence n'est pas suffisante.
J'ai placé un compteur dans la boucle Cell et j'ai fait plusieurs essais avec une fréquence de rafraichissement de plus en plus grande: c'est pas satisfaisant.
Curieusement, j'ai trouvé un compromis acceptable en effectuant un .Repaint à chaque début de ligne (alors qu'avec la méthode précédente il en fallait plusieurs par ligne !) :
For Each cell In wsh.UsedRange
If cell.Column = 1 Then frmStatus.Repaint
...
Next
Cela ne résout pas le problème mais simplement, ça évite qu'il se produise.
J'avais déjà constaté un phénomène similaire avec Application.StatusBar
lors de l'exploration de gros fichier : au bout d'un certain temps, l'affichage se fige, il n'est plus mis à jour à chaque changement alors que la macro continue de fonctionner.
Je pense qu'un processus extérieur à Excel reprend la main et ne la restitue pas correctement
Il y probablement une solution en utilisant l'API windows, mais je n'ai rien trouvé à ce sujet.
Patrice
J'ai essayé de remplacer le Label par un TextBox mais ça ne change rien !
Par contre j'ai exploré la piste de mettre plusieurs .Repaint dans la boucle même si le contenu du UserForm ne change pas.
En plaçant un .Repaint dans la boucle Cell, ça fonctionne mais, bien sur, la durée de la macro devient excessivement longue !
En compromis, j'ai essayé d'utiliser la fonction Timer pour faire un rafraichissement toutes les secondes mais ça ne fonctionne pas, la fréquence n'est pas suffisante.
J'ai placé un compteur dans la boucle Cell et j'ai fait plusieurs essais avec une fréquence de rafraichissement de plus en plus grande: c'est pas satisfaisant.
Curieusement, j'ai trouvé un compromis acceptable en effectuant un .Repaint à chaque début de ligne (alors qu'avec la méthode précédente il en fallait plusieurs par ligne !) :
For Each cell In wsh.UsedRange
If cell.Column = 1 Then frmStatus.Repaint
...
Next
Cela ne résout pas le problème mais simplement, ça évite qu'il se produise.
J'avais déjà constaté un phénomène similaire avec Application.StatusBar
lors de l'exploration de gros fichier : au bout d'un certain temps, l'affichage se fige, il n'est plus mis à jour à chaque changement alors que la macro continue de fonctionner.
Je pense qu'un processus extérieur à Excel reprend la main et ne la restitue pas correctement
Il y probablement une solution en utilisant l'API windows, mais je n'ai rien trouvé à ce sujet.
Patrice
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
10 juil. 2010 à 15:28
10 juil. 2010 à 15:28
Je remonte, entre temps j''ai essayé d'ajouter :
et dans la boucle ou se trouve le frmStatus.Repaint :
Mais ça ne change rien.
Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
et dans la boucle ou se trouve le frmStatus.Repaint :
UpdateWindow Application.hwnd
Mais ça ne change rien.
Le Pingou
Messages postés
12187
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
14 novembre 2024
1 449
10 juil. 2010 à 16:41
10 juil. 2010 à 16:41
Bonjour,
Juste au passage, j'ai utilisé le code qui suit pour afficher un message de patience (nom de la UserForm) dans une procédure assez longue pour l'envoi de courriel et cela marche bien.
Le code :
Juste au passage, j'ai utilisé le code qui suit pour afficher un message de patience (nom de la UserForm) dans une procédure assez longue pour l'envoi de courriel et cela marche bien.
Le code :
Application.Cursor = xlWait 'affiche le sablier Patience.Show vbModeless 'affiche la UserForm mais continu le traitement Patience.Repaint 'raffraichit le contenu affiché sinon on a une boite blanche vide ` **** ` Ici ma procédure de traitement [ClientAdresseCourriel clofpro, clsage, nbli, clbcmde, connecte] `**** Workbooks(clsage).Close ` ferme le classeur d'adresse à traiter Unload Patience ' fermer la UserForm Application.Cursor = xlDefault 'remet le curseur par défaut
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 708
10 juil. 2010 à 18:24
10 juil. 2010 à 18:24
Bonjour Le Pingou,
Je suppose que dans ta procédure tu modifies le contenu de "patience" et que tu vois le résultat ?
J'ai créé à peu près le même procédé pour générer une application internet HTML qui comporte de nombreuses pages (que je liste au fur et à mesure) à partir d'une base de données et cela fonctionne comme prévu.
Aussi je suis surpris que Patrice rencontre ce problème avec le repaint qui se met en grève.
Je suppose que dans ta procédure tu modifies le contenu de "patience" et que tu vois le résultat ?
J'ai créé à peu près le même procédé pour générer une application internet HTML qui comporte de nombreuses pages (que je liste au fur et à mesure) à partir d'une base de données et cela fonctionne comme prévu.
Aussi je suis surpris que Patrice rencontre ce problème avec le repaint qui se met en grève.
Le Pingou
Messages postés
12187
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
14 novembre 2024
1 449
10 juil. 2010 à 21:38
10 juil. 2010 à 21:38
Bonsoir gbinforme,
Oui c'est bien comme cela.
Mon intervention était juste pour montrer ma solution, qui en regardant bien est la même, sauf l'utilisation de la constante [vbModeless].
Bon dimanche.
Oui c'est bien comme cela.
Mon intervention était juste pour montrer ma solution, qui en regardant bien est la même, sauf l'utilisation de la constante [vbModeless].
Bon dimanche.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
11 juil. 2010 à 02:51
11 juil. 2010 à 02:51
Bonjour Le Pingou et gbinforme,
Merci de vous intéresser à mon problème.
J'ai déclaré mon UserForm non modal avec VBE en mettant directement ShowModal sur False, or j'ai vu en utilisant l'explorateur d'objet que ShowModal n'apparait pas dans les propriétés du UserForm (c'est la seule qui manque), le doute s'est donc installé et j'ai suivi le conseil de Le Pingou :
j'ai essayé frmStatus.Show vbModeless pour être plus sur, mais le problème persiste.
Quelques précisions :
- dans la boucle qui créé le problème, la fréquence de rafraichissement est très légèrement supérieure à une seconde (mise en grève à la 6ème ou à la 7ème feuille).
- j'utilise ce même UserForm dans d'autres procédures du module et il fonctionne très bien, mais la fréquence de rafraichissement est plus élevée (0,5 à 0.7 secondes).
- dans la boucle lorsque j'ajoute un Repaint à chaque ligne explorée (sans changement du userform) le userform fonctionne correctement mais le temps d'exécution ...
- je suis convaincu que la taille du fichier exploré influe sur le comportement de l'affichage de l'application, mais ce n'est qu'une conviction.
- le fichier exploré n'est pas vraiment énorme : 9 Mo contenant principalement des données, des formules et quelques graphiques Excel (moins d'une quinzaine), aucun objet extérieur, aucune image, des milliers de liens hypertextes mais tous à destination de cellules internes au fichier.
Cordialement
Patrice
Merci de vous intéresser à mon problème.
J'ai déclaré mon UserForm non modal avec VBE en mettant directement ShowModal sur False, or j'ai vu en utilisant l'explorateur d'objet que ShowModal n'apparait pas dans les propriétés du UserForm (c'est la seule qui manque), le doute s'est donc installé et j'ai suivi le conseil de Le Pingou :
j'ai essayé frmStatus.Show vbModeless pour être plus sur, mais le problème persiste.
Quelques précisions :
- dans la boucle qui créé le problème, la fréquence de rafraichissement est très légèrement supérieure à une seconde (mise en grève à la 6ème ou à la 7ème feuille).
- j'utilise ce même UserForm dans d'autres procédures du module et il fonctionne très bien, mais la fréquence de rafraichissement est plus élevée (0,5 à 0.7 secondes).
- dans la boucle lorsque j'ajoute un Repaint à chaque ligne explorée (sans changement du userform) le userform fonctionne correctement mais le temps d'exécution ...
- je suis convaincu que la taille du fichier exploré influe sur le comportement de l'affichage de l'application, mais ce n'est qu'une conviction.
- le fichier exploré n'est pas vraiment énorme : 9 Mo contenant principalement des données, des formules et quelques graphiques Excel (moins d'une quinzaine), aucun objet extérieur, aucune image, des milliers de liens hypertextes mais tous à destination de cellules internes au fichier.
Cordialement
Patrice
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 708
11 juil. 2010 à 08:26
11 juil. 2010 à 08:26
bonjour à tous,
La durée entre 2 repaint n'a, à mon avis, pas beaucoup d'importance mais il me semble qu'il n'est utile de l'utiliser que lorsque la valeur à afficher change.
Il me semble que la durée "utile" soit plutôt supérieure à 10-15 secondes car en deçà, l'on ralenti la macro et la réaction de l'utilisateur n'est pas de l'ordre de la seconde : seul Usain Bolt fait plus de 10 m dans ce temps !
La taille du fichier n'est pas seule en cause car elle a de l'importance surtout en fonction de la mémoire disponible : s'il en manque et qu'il faille recourir au swap, le temps grimpe.
As-tu inhibé le rafraichissement écran ?
Essaies de mettre un repaint toutes les 10 lignes pour voir.
La durée entre 2 repaint n'a, à mon avis, pas beaucoup d'importance mais il me semble qu'il n'est utile de l'utiliser que lorsque la valeur à afficher change.
Il me semble que la durée "utile" soit plutôt supérieure à 10-15 secondes car en deçà, l'on ralenti la macro et la réaction de l'utilisateur n'est pas de l'ordre de la seconde : seul Usain Bolt fait plus de 10 m dans ce temps !
La taille du fichier n'est pas seule en cause car elle a de l'importance surtout en fonction de la mémoire disponible : s'il en manque et qu'il faille recourir au swap, le temps grimpe.
As-tu inhibé le rafraichissement écran ?
Essaies de mettre un repaint toutes les 10 lignes pour voir.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
11 juil. 2010 à 11:42
11 juil. 2010 à 11:42
Bonjour gbinforme,
j'ai essayé de rafraichir toutes les 10, 5, 2 lignes mais ce n'est pas suffisant, ça ne fonctionne qu'avec 1 ligne (ou moins), de plus les Repaint à chaque ligne sont effectués alors que la valeur ne change pas (elle change à chaque feuille uniquement).
Au début du code j'ai un
La quantité de mémoire est largement suffisante pour éviter le swap.
j'ai essayé de rafraichir toutes les 10, 5, 2 lignes mais ce n'est pas suffisant, ça ne fonctionne qu'avec 1 ligne (ou moins), de plus les Repaint à chaque ligne sont effectués alors que la valeur ne change pas (elle change à chaque feuille uniquement).
Au début du code j'ai un
Application.ScreenUpdating = False
La quantité de mémoire est largement suffisante pour éviter le swap.
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 708
11 juil. 2010 à 16:00
11 juil. 2010 à 16:00
re bonjour,
Je ne vois pas l'intérêt du repaint si tu ne changes pas de valeur, à moins de ralentir la macro.
Pour que l'utilisateur voit que cela fonctionne, il faut que les valeurs affichées changent sinon rien ne se passe : ton problème ne viendrait-il pas de là ?
Je ne vois pas l'intérêt du repaint si tu ne changes pas de valeur, à moins de ralentir la macro.
Pour que l'utilisateur voit que cela fonctionne, il faut que les valeurs affichées changent sinon rien ne se passe : ton problème ne viendrait-il pas de là ?
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
11 juil. 2010 à 17:57
11 juil. 2010 à 17:57
Re bonjour
Si je ne met pas ce Repaint, sans intérêt théorique, le Userform se met en grève au bout de 6 secondes !
C'est là qu'est mon problème.
Cordialement
Patrice
Si je ne met pas ce Repaint, sans intérêt théorique, le Userform se met en grève au bout de 6 secondes !
C'est là qu'est mon problème.
Cordialement
Patrice