Screen Updating sur Userform, ignore état "false"

Bonjour,

J'ai essayé de mettre un Application.ScreenUpdating = False dans le code de mon userform pour éviter un effet clignottement de mon userform pendant 1/2s sur une sub, mais cela n'a rien changé. Et au débugage, il m'indique que Application.ScreenUpdating = vrai alors qu'il viens de passer (avec f8) la ligne "Application.ScreenUpdating = False". Néanmoins cela fige bien l'affichage de ma feuille excel...

Comment est-ce possible ? En creusant sur internet, j'ai l'impression que c'est utilisé uniquement pour les actions sur des cellules excel ; cela ne fonctionne pas pour des macros sur un userform ? Auquel cas y a-t-il des méthodes pour bloquer temporairement l'affichage d'un userform ?

Merci !

bonsoir,

oui, screenupdating n'a pas d'effet sur un userform, vous pouvez cacher ou minimaliser l'userform pour eviter le clignottement mais normallement, il ne se passe pas grand chose avec un userform, donc je ne comprends pas ce que vous essayez à éviter, une chose plutôt esthetique ? Vous avez un fichier exemplaire ?

Bonsoir,

qu'est ce qui fait que votre code avec le USF ouvert, ce dernier clignote ?
Avec un fichier il serait plus simple de répondre et d'adapter ce dernier pour un fonctionnement plus "propre" pour l'utilisateur.

@ bientôt

LouReeD

Bonsoir,

Bonsoir BsAlv ! En fait tout pareil, mais avec deux doigts j'écris moins vite ! Bien que vous, vous passiez par un traducteur !

Mais moi je rajoute toujours deux lignes... elles ne sont pas dans ma "signature"

@ bientôt

LouReeD

Je ne peux pas l'envoyer il est trop lourd (1,9Mo)...

C'est au changement de patient je fais appel un plein de sub en cascade pour tout vider, remplir des champs listviews, comme c'est un multipage je dois activer chacune etc...

Bonsoir,

je ne pense pas qu'il soit obligé de sélectionner chaque page du multipage pour travailler dedans, c'est un peu comme les feuille d'un classeur il n'est pas nécessaire d'activer une feuille pour "travailler" dedans avec VBA (sauf peut-être quelque rare cas)

Le VBA est un langage "objet" donc en ciblant le USF = ME, le multipage = MultiPage1, la page voulue = Page 3, le textBox12 = TextBox12, et sa valeur on doit pouvoir écrire : Me.Multipage1.Page3.TextBox12.Value = "LouReeD"

Et ceci sans avoir à faire clignoter le multipage. A savoir que ceci peut être remplacer par TextBox12 = "LouReeD"

@ bientôt

LouReeD

Re,

Pour le textbox en effet mais si je dit de remettre toutes les checkboxes à zero, cela engendrera l'évènement click sur les checkbox qui ne l'étaient pas, et un bug si la page du multipage n'est pas active.

D'après ce que je compris, l'évènement qui nécessite qu'un contrôle soit actif, va nécessiter que la page du multipage contenant ce contrôle soit active aussi...

Sauf erreur de ma part

Alors en utilisant un "interrupteur"...

Vous créez une variable "Public EnCours as Boolean". Puis au début du code de mise à zéro de tous les contrôles vous passezla variable EnCours à True, et en début de code d'événement de tous les contrôles concernés vous ajoutez cette ligne de code : If EnCours Then Exit Sub
Comme cela tant qu'on met à jour plus aucun code de contrôle ne sera lancé. A la fin du code d'initialisation vous passez la variable EnCours à False.

@ bientôt

LouReeD

Bonjour à tous,

ça, ça ne suffit pas ?

Load UserForm1
' ou UserForm1.Hide si déjà chargé
UserForm1.TextBox1.Text = "test"
' etc
' etc
UserForm1.Show

eric

Re,

@LouReed, le souci si je bloque les subs avec ce témoin c'est qu'ils ne s'exécuteront plus. J'ai besoin qu'ils s'exécutent (par exemple voir tous les contrôles un par un, dans chaque page, et les vider) mais je n'ai pas besoin que mon userform affiche tout cela (car je suppose que c'est bien l'affichage de toutes ces manoeuvres qui produit un effet "clignottement").

@eriiic, votre solution a le mérite d'effectivement supprimer cet effet clignottement, mais je trouve qu'on a l'impression que le userform redémarre... Pas idéal je trouve, après ce n'est que de l'expérience utilisateur, mais pas forcément anodin je trouve...

Il n'y a pas de méthode pour figer le userform puis le défiger ?

En attendant la méthode que je trouve la moins désagréable pour l'utilisateur est de mettre la propriété .top du multipage à -900 en début de sub et la remettre à 0 en fin de sub. Cela maintient le userform mais le multipage n'affiche pas toutes les actions qu'il subit. J'ajoute qu'il y a des .setfocus qui m'empêchent de le mettre en .visible = false.

Merci en tout cas

@LouReed, le souci si je bloque les subs avec ce témoin c'est qu'ils ne s'exécuteront plus !
Et bien oui ils seront stoppés lors de l'initialisation des différents contrôles et ceci par code VBA, donc ils n'ont pas à être exécutés. Une fois ceci terminé, la variable repasse à False et ainsi tous les contrôles retrouve leurs fonctionnement !

Maintenant je pourrais vous faire un fichier pour vous le monter, mais là manque de temps...
Soit vous simplifiez le vôtre pour le poster, soit vous faites une version "allégée" à partir du votre, ou bien encore vous essayez de mettre en place cet interrupteur pour voir son fonctionnement.

@ bientôt

LouReeD

Voici un fichier exemple :

lors d'un clic sur la liste box un msgbox s'affiche. Par le bouton de gauche on simule le début d'un code d'initialisation (par exemple), on bascule la variable interrupteur EnCours à TRUE, essayer de cliquer sur la liste, plus de message, bien que le code de surveillance du clic soit tout de même lancé, mais le "IF" permet de sortir de ce dernier afin d'inhiber le MsgBox. le bouton de droit simule l'arrêt du code d'initialisation et passe la variable EnCours à False, le clic sur la liste redonne accès au code du msgbox !

C'est le principe de ma proposition en plus de celle qui dit qu'on est vraiment pas obliger d'activer une page de multipage pour travailler sur ses contrôles, on n'est même pas obligé de cibler tous les "parents" de ces contrôles car ils font partis du premier parent qui est le USF, donc en page 6 de la multipage, frame 3, et textbox13, il suffit de cibler TextBox13, ou Me.Textbox13, ou plus précisément Me.Multipage1.Page6.Frame3.TextBox13 (en effet, il ne peut y avoir deux contrôles avec le même nom sous un USF que ces derniers soient de même type ou pas !).

@ bientôt

LouReeD

@LouReeD

Merci pour le fichier d'exemple mais vraiment je pense que j'ai bien compris : c'est un témoin qui permet de bloquer une procédure s'il est présent. Or dans mon cas je ne veux pas qu'elles se bloquent. Je veux simplement que le temps qu'elles s'exécutent, l'affichage du userform ne se mette pas à jour.

Et pour ce qui est du multipage, là aussi c'est particulier : lorsqu'on agit à distance sur un contrôle (par ex: changement de valeur d'un checkbox) il faut que le multipage soit sur la valeur de la page sur laquelle se trouve le contrôle.

Ainsi si j'ai 20 checkboxes par page et 7 pages, et que j'ai une sub qui réinitialise tout, je suis obligé de lui indiquer d'actionner toutes les pages, par ex comme ceci :

  For Each MesPages In MultiPage1.Pages
    MultiPage1.Value = Mid(MesPages.Name, 5) - 1
    For Each MesControles In MesPages.Controls
      Select Case TypeName(MesControles)
      Case "TextBox"
        MesControles.Value = ""
      Case "CheckBox"
        MesControles.Value = False
      Case "OptionButton"
        MesControles.Value = False
      Case "ListBox", "ComboBox"
        MesControles.ListIndex = -1
      End Select
    Next MesControles
  Next MesPages

Bonsoir,

Un fichier où on modifie les contrôles des différentes pages d'un multipages sans avoir à activer les pages une par une = tout est fait sans que le USF scintille.

16multipages.xlsm (18.86 Ko)

@ bientôt

LouReeD

Pour le multipage tu as raison, je pense que j'avais mis ce système en place pour l'écriture, le chargement des données patient : des textboxes se remplissent et afin que l'on sache si le texte est plus long que la textbox, je voulais faire apparaître le scrollbar, et donc mettre le setfocus. Et pour le setfocus la page doit être active. Et au final j'ai gardé inutilement ce système d'activation des pages même pour effacer.

Pour le clignottement, il faudrait que tu le vois, en effet l'effacement ne le produit pas, ça doit être plutôt toutes les phases d'écriture, et d'activation de toutes les pages 1 à 1.

Après avec mon bricolage je trouve que ça fait l'affaire donc inutile de te casser la tête pour moi c'est bon, même si je constate qu'il n'y a pas de méthode équivalente au screenupdating pour un userform.

Merci en tout cas :)

Bonjour

Bien reçu ! Merci à vous pour ce retour !

@ bientôt

LouReeD

Rechercher des sujets similaires à "screen updating userform ignore etat false"