Les UserForms et la mémoire
Bonjour,
On connaît tous les instructions Show et Load qui chargent un formulaire en mémoire et l'instruction Unload pour le décharger.
Cependant, certaines instructions chargent implicitement le formulaire en mémoire sans qu'on ne s'en aperçoive. Et si un code est placé dans l'évènement "Initialise", il sera exécuté lors de la 1ère instruction. L'évènement "Activate", quant à lui, ne sera pas appelé.
Pour exemple, l'instruction suivante, qui extrait le contenu du "Label1" du formulaire "UserForm1"
a$ = UserForm1.Label1.Caption
Charge le formulaire en mémoire. Il y restera tant qu'un "Unload" n'aura pas été effectué (explicite ou via un QueryClose).
Selon l'application et le nombre de formulaires utilisés, la mémoire peut, à un certain moment, être bien occupée.
Ce n'est pas un problème en soi ; la mémoire sera vidée, de toute façon, à la fermeture du classeur.
Cependant, il faudra être vigilant sur l'exécution du code placé dans l'évènement "Initialise" (si code présent).
En reprenant l'exemple :
a$ = UserForm1.Label1.Caption ' 1er appel au formulaire ; il est chargé en mémoire et l'Initialise est exécuté
...
Plus loin dans l'application
...
UserForm1.Show ' Affiche le Formulaire. Seul l'évènement "Activate" est exécuté.
Pour que le code d'initialisation soit réexécuté, il faudra le décharger de la mémoire avant (Unload UserForm1 avant le Show).
Un autre souci peut également survenir :
Si l'on souhaite enregistrer en "Dur" des données dans un formulaire, pour les récupérer à la prochaine ouverture du classeur, une erreur 91 "Variable objet ou variable de bloc With non définie" sera générée si celui-ci est en mémoire.
Il faudra s'assurer qu'il est bien déchargé avant d'exécuter l'instruction.
(L'usage d'un formulaire dédié, pour stocker des informations peut s'avérer très utile (Paramètres, dernières saisies, données diverses, etc.))
Dans le classeur joint, vous trouverez plusieurs macros explicatives sur le maniement des formulaires.
Exécutez le code en mode "Pas à Pas" en commençant par la procédure Test1.
J'espère que cela vous sera utile, surtout si vous débutez en VBA.
Eric
Ps : Pensez à débloquer le classeur après téléchargement.
Excellente présentation Eric, c'est d'ailleurs pour cela que j'apprécie particulièrement l'instruction With New UserformX qui explicite l'instanciation. En plus le Unload est implicite à la fin du bloc With.
De plus, on peut aussi souvent .Hide l'UserForm et le réafficher plutôt que de le décharger/recharger en mémoire.
Pour référer à ma bible encore une fois UserForm1.Show – Rubberduck News
Bonsoir Saboh12617,
J'utilise aussi, dans certaines de mes applis, l'instruction With New UserformX
Je voulais rester simple pour bien démontrer le principe (surtout pour les débutants).
En tout cas Merci