Quand doit-Excel VBA variable d'être tués ou Rien?
J'ai enseigné moi-même VBA Excel cours des deux dernières années, et j'ai dans l'idée qu'il est parfois nécessaire de disposer de variables à la fin d'un segment de code. Par exemple, je l'ai vu faire dans ce peu adapté à partir de Ron de Bruin du code pour le transfert de Excel au format HTML:
Function SaveContentToHTML (Rng as Range)
Dim FileForHTMLStorage As Object
Dim TextStreamOfHTML As Object
Dim TemporaryFileLocation As String
Dim TemporaryWorkbook As Workbook
...
TemporaryWorkbook.Close savechanges:=False
Kill TemporaryFileLocation
Set TextStreamOfHTML = Nothing
Set FileForHTMLStorage = Nothing
Set TemporaryWorkbook = Nothing
End Function
J'ai fait quelques recherches sur ce et a trouvé très peu au-delà de la façon de le faire, et dans un post sur le forum une déclaration qu'aucune des variables locales doivent être effacée, depuis qu'ils cessent d'exister à End Sub
. Je devine, basé sur le code ci-dessus, qui peut ne pas être vrai à End Function
, ou dans d'autres circonstances, je n'ai pas rencontré.
Donc, ma question se résume à ceci:
- Est là, quelque part sur le web qui explique le pourquoi et quand une variable de nettoyage, et je n'ai pas trouvé?
Et si non quelqu'un peut ici s'il vous plaît expliquer...
- Quand est variable de nettoyage pour Excel VBA est nécessaire et quand il ne l'est pas?
- Et plus précisément... Sont spécifiques variable utilise (les variables publiques?
Fonction des variables définies par l'?) qui restent chargés en mémoire pour plus
que les subs faire, et à cet effet, pourrait causer des problèmes si je ne fais pas le ménage
après moi-même?
Vous devez vous connecter pour publier un commentaire.
VB6/VBA utilise approche déterministe à destoying objets. Chaque objet stocke le nombre de références à elle-même. Lorsque le nombre atteint zéro, l'objet est détruit.
Les variables d'objet sont garantis d'être nettoyé (à
Nothing
) quand ils sont hors de portée, ce diminue les compteurs de référence dans leurs objets respectifs. Aucune action manuelle nécessaire.Il y a seulement deux cas où vous souhaitez explicite de nettoyage:
Lorsque vous souhaitez qu'un objet soit détruit avant sa variable est hors de portée (par exemple, la procédure va prendre du temps pour s'exécuter, et l'objet est titulaire d'une ressource, si vous voulez détruire l'objet, dès que possible, à la libération de la ressource).
Lorsque vous avez une référence circulaire entre deux objets ou plus.
Si
objectA
stocke les références àobjectB
, etobjectB
stocke une référence àobjectA
, les deux objets ne sera jamais détruit, à moins que vous frein de la chaîne par la définition explicite deobjectA.ReferenceToB = Nothing
ouobjectB.ReferenceToA = Nothing
.L'extrait de code de vous montrer, c'est mal. Pas de nettoyage manuel est nécessaire. Il est même dangereux de faire un nettoyage manuel, car elle vous donne une faux sentiment de plus le code est correct.
Si vous avez une variable à une classe de niveau, il sera nettoyé/détruits lors de l'instance de classe est détruite. Vous pouvez le détruire plus tôt si vous le souhaitez (voir le point
1.
).Si vous avez une variable à un niveau de module, il sera nettoyé/détruits lors de vos sorties de programme (ou, dans le cas de VBA, lorsque le projet VBA est remise à zéro). Vous pouvez le détruire plus tôt si vous le souhaitez (voir le point
1.
).Niveau d'accès d'une variable (public vs privé) n'a pas d'incidence sur sa durée de vie.
End
tag (terminer)? Ou prend-elle fin lorsque le projet réinitialise? J'ai essayé de tester cette théorie par la mise en valeur d'une variable publique qui s'éteignit dans un autre module, mais la variable n'est jamais apparu dans la fenêtre variables locales, donc je ne pouvais pas observer quand il a chuté.Nothing
.VBA utilise un garbage collector qui est mis en œuvre par comptage de référence.
Il peut y avoir plusieurs références à un objet donné (par exemple,
Dim aw = ActiveWorkbook
crée une nouvelle référence au Classeur Actif), de sorte que le garbage collector seulement nettoie un objet lorsqu'il est clair qu'il n'y a pas d'autres références. Réglage de Rien est une façon explicite de décrémenter le compteur de référence. Le comte est implicitement décrémenté lorsque vous quittez le champ d'application.À strictement parler, dans moderne versions d'Excel (2010+) pour Rien n'est pas nécessaire, mais il y avait des problèmes avec les anciennes versions d'Excel (pour lequel la solution a été de définir explicitement)
J'ai au moins une situation où les données ne sont pas automatiquement nettoyé, ce qui conduirait à terme à la "Mémoire" des erreurs.
Dans un UserForm, j'ai eu:
Quand UserForm a été détruit (après
Unload Me
) la mémoire allouée pour les données chargées dans lemainPicture
n'a pas été effectuée. J'ai dû ajouter une explicitedans l'événement terminate.