Retour à la FAQ


isabelle a écrit :
Laurent, peut-tu me dire s'il est toujour nécessaire de mettre Load UserForm1 avant la commande
UserForm1.Show, j'ai les neuronnes emmêler je comprend pas très bien pourquoi il y a deux commandes


REPONSE DE LAURENT.

Quand on ouvre un classeur qui comporte un UserForm, celui-ci n'est pas
chargé en mémoire. C'est à dire qu'il n'existe tout simplement pas, il
est seulement décrit dans un module.

Pour qu'il puisse être affiché, il faut que VBA le charge en mémoire.
Pour cela, plusieurs moyens:

1) Utiliser une instruction quelconque sur ce UserForm (même s'il n'est
pas affiché), par exemple UserForm1.Label1 = "Toto". Du moment que le
UserForm est invoqué dans le code, VBA le construit et le charge en
mémoire. Sa construction est implicite.

2) UserForm1.Show, pour le charger en mémoire et l'afficher en même temps.

3) Load UserForm1, pour simplement le charger sans l'afficher
(construction explicite). Si plus tard tu utilises la méthode Show,
comme il existe déjà en mémoire son affichage sera très rapide.

L'instruction Unload fait l'inverse: elle sert à supprimer le UserForm
déjà chargé, en libérant du même coup la mémoire qu'il utilisait. Lors
de son prochain chargement, il sera reconstruit et donc tous ses
contrôles seront réinitialisés à leur valeur d'origine (cad tels qu'ils
ont été définis lors de leur conception). Le prochain UserForm1.Show
affichera une boîte de dialogue toute neuve. Alors que UserForm1.Hide ne
fait que masquer le UserForm, sans le décharger de la mémoire, et donc
sans réinitialiser ses contrôles.

Donc, tout dépend de ce que tu veux faire :

- Si tu veux qu'à chaque nouvel affichage du UserForm celui-ci soit
remis dans son état d'origine, il faut mettre un 'Unload UserForm1'
(tu peux d'ailleurs le mettre dans la procédure du UserForm associée au
bouton "OK" ou "Annuler").

- Si tu veux qu'il conserve son apparence et ses contrôles tels qu'ils
ont été modifiés par l'utilisateur (ou par macro), il ne faut *surtout
pas* utiliser l'instruction Unload. Et il faut masquer le UserForm par
la méthode Hide.

A noter aussi que le chargement en mémoire du UserForm (qu'il soit
implicite ou explicite par l'instruction Load) déclenche sa procédure
UserForm_Initialize. Celle-ci n'est exécutée que lors du chargement du
UserForm, pas à chacun de ses affichages. La procédure UserForm_Activate
se déclenche au contraire à chacun des affichages de la boîte de dialogue.

Et voilà. Encore un chapitre du bouquin que je n'écrirai jamais, bientôt
perdu quelque-part dans les limbes du cyberspace. C'est la vie. :-)

Laurent

 


[top]