Set et Nothing

Jibse

XLDnaute Nouveau
Bonjour,

Lorsque l'on utilise l'instruction Set pour attribuer une référence d'objet à une variable, est-il toujours utile de mettre :

Set MaVariable = Nothing

à la fin de la procédure ?

On dit que ça libère des ressources système et mémoire, mais souvent je ne vois pas cette ligne dans les codes des MVP.

Merci.
 

Kotov

XLDnaute Impliqué
Re : Set et Nothing

Bonjour,

En ce qui me concerne, c'est une habitude que j'ai prise. Je libère les grosses variables via "Nothing" et les gros tableaux de données via "Erase".
Je ne suis pas certain que ce soit réellement nécessaire pour les petites plages de cellules (Range), en revanche, je le fais systématiquement pour les objets volumineux.

Si j'essaie de toujours indiquer cette "libération de mémoire" sur les réponses que j'apporte sur ce forum, il peut m'arriver d'oublier, notamment dans le cas d'une réponse partielle.
Ça doit aussi arriver au MVP.

Bonne journée
Kotov
 
Dernière édition:

ngogoisidore

XLDnaute Occasionnel
Re : Set et Nothing

Bonjour à tous,

Je ne suis pas bien sur que "ré-initialiser" les variables que l'on définit par set, en fin de procédure ne soit vraiment nécessaire (à mon humble avis).

en effet :

- quand on définit une variable dans vba, vba demande au système d'exploitation un espace mémoire dont la taille dépend du type de variable. Cet espace mémoire (complètement identifé) est censé être relaché par vba, lorsque le programme s'arrête et/ou lorsque l'on sort d'Excel. Le risque est que vba/Excel "oublie" de demander au système d'exploitation de relacher la mémoire ou que le système d'exploitation le fasse mal. C'était surtout vrai dans les premières versions de vba et de windows (mac os, devait mieux se débrouiller dès le départ). Quand on "reset" la variable à nothing, en fait on ne libère pas la mémoire, on affecte la valeur 0 au pointeur vers l'objet que la variable représentait.

- les variables définies par set sont donc des pointeurs, c'est à dire, plus ou moins des "longs entiers" qui portent le type de la variable et l'adresse d'une zone de mémoire qui contient réellement les données. En général, ce qui prend de la place en mémoire, c'est l'objet pointé (par exemple le range A1:L12) et, cet objet, la plupart du temps n'est pas géré par le développeur vba mais par Excel lui même.

- Par contre, bien qu'Excel soit censé créer toute variable "objet" (affectée par set) avec la valeur Nothing par défaut, je trouve qu'il n'est pas mauvais de les initialiser soit même. D'abord, c'est une règle de base de développement et ensuite, ça permet de savoir à coup sur, ce qu'il y a dans la variable avant toute opération sur cette variable et d'éventuellemnt se servir de cette valeur dans son code. ex : quand on veut faire une union de range par une boucle, dans la première boucle, on ne fait qu'affecter la variable touslesranges avec le premier range et dans les suivants on lui affecte l'union du range suivant avec la valeur intermédiaire de touslesranges.

Si touslesranges = nothing alors touslesranges = range_i, sinon, touslesranges = union(touslesranges, range_i)

car la fonction union génère une erreur, si on lui affecte en paramètre un range null ou égal à nothing.

En conclusion, c'est plus "propre" (ça prouve que l'on a controle les variables que l'on utilise) de ré-initialiser à Nothing les variables (set), mais ça ne relache pas la mémoire. Par contre, toute variable ou objet complexes créés par le développeur, comme les arrays ou les listes ou les dictionnaires devraient être détruites (et non mises à zéro). Bien que, une fois de plus, c'est censé être fait de toutes façons par Excel en fin d'éxécution, mais là, comme c'est le développeur qui alloue des gros espaces mémoires, c'est plus sur et aussi plus propre de le faire soit même.

Voilà, tout ça, c'est sans prétention, c'est juste mon avis et ma façon de faire :eek:.

@+

Et, au fait, je suis nouveau sur le forum, et je le trouve vraiment utile et sympathique.

Merci à tous les participants.
 

Discussions similaires

Statistiques des forums

Discussions
312 428
Messages
2 088 334
Membres
103 820
dernier inscrit
andre.l.desjardins@gmail.