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
.
@+
Et, au fait, je suis nouveau sur le forum, et je le trouve vraiment utile et sympathique.
Merci à tous les participants.