VBA Excel et UserForm, persistance en mémoire après Unload

Bonjour,

J’apprends le VBA depuis quelques mois, en grande partie grâce aux tutos trouvés sur Développez.net, et dans le but d’automatiser des tâches sous Excel.
Depuis peu j’utilise des UserForms.

Pour passer des informations à la procédure ou à la fonction qui appelle le UserForm, j’utilise la propriété Tag du UserForm.

Ce qui m’a étonné dans le tuto que j’ai trouvé sur les UserForm ( http://www.excel-pratique.com/fr/vba/controles.php ), c’est qu’il était conseillé de le détruire dès l’appui sur les boutons de validation ou d’annulation. Et pourtant, après ça, la propriété monUserForm.Tag est toujours accessible pour la procédure appelante. Ca m’a étonné, mais je suis programmeur débutant, et le nettoyage de la mémoire n’est pas le premier de mes soucis (j’ai tort, je sais), donc j’ai laissé tomber.

Là où ça m’embête, c’est que dans mes différents tests en cours d’écriture, j’ai pu accéder à monUserForm.Tag alors que normalement plus aucun code ne devait continuer à s’exécuter. Donc ça pourrait interférer avec les procédures lancées ultérieurement, en donnant une valeur à une variable qui ne devrait pas encore en avoir.

Du coup, je me rends compte qu’on peut régler le problème avec Set UserForm = NothingLà, UserForm.Tag semble vide, en tout cas ça renvoie un champ vide dans la console de débug.

Pourtant sur les différents tutos que j’ai lus sur UserForm, aucun ne dit qu’il faut détruire l’objet en le mettant à Nothing. Et même, sur le tuto VBA sur développez.net, il est dit qu’il ne faut pas finaliser, vu qu’on ne crée rien, c’est Excel qui s’en charge.

Alors, quelle est la bonne pratique?
Est-ce que ma question a un lien avec la portée de mes procédures (je précise que les événements au sein du UserForm sont déclarées en Private, les procédures appelantes en Public)?
It’s not a bug, it’s a feature?

Merci pour vos réponses!

NB: j’ai crossposté sur le forum de développez.net, mais je ne les connais pas là-bas, je sais pas quel sera l’accueil alors je mets ici aussi.

Bonjour,

En général quand j’utilise les Userforms dans Excel, j’ai une procédure publique (genre j’appuie sur le bouton sur ma feuille de calul) qui appelle “Userform.Show” et lance ainsi la procédure d’initialisation de mon userform (UserForm_Initialize()) . Dans “initialize”, je vais lire les paramètres d’initialisation dans une feuille de calcul qui est dédiée pour ça. Cette feuille de calcul me permet ainsi de jouer le rôle d’un fichier de config, parce que je peux faire varier mes paramètres dans le programme, et les sauvegarder dans cette feuille. On peut “cacher” cette feuille pour ne pas la modifier trop facilement à la main.

Pour fermer le Userform, j’utilise “Unload Me”. Mais j’avoue que comme toi je ne me suis jamais trop préoccupé de la gestion de la mêmoire, à part les “Set objet = nothing” en fin de procédure quand j’ai fini avec l’objet en question.

Et Set objet = nothing, tu le fais parce que tu as l’habitude d’autres langages, ou ce sont tes tutos/cours de VBA qui te l’ont appris?
En fait je suis très surpris que les différents tutos que j’ai lus l’abordent à peine, et ne disent si c’est important.

J’ai appris à coder en Pascal (ca fait quelques années).

J’ai appris le vba en regardant les exemples sur le net essentiellement.

J’utilise beaucoup l’instruction set pour affecter une feuille de calcul à une variable pour aller plus vite pour écrire quand je travaille sur la fameuse feuille.

Dim w as worksheet
Set w = thisworkbook.worksheet(“toto”)
w.cells(1,1)= 2
Set w=nothing

Merci pour tes réponses :smile:

J’ai modifié mon code pour détruire tout ce qui ne sert plus ; je vais essayer de m’y tenir à l’avenir!