Bonjour Laurent, Michel, Bernard, David, le Forum
Je viens un peux de surfer dans cette énorme encyclopédie vivante qu'est le Net...
Je suis toujours perplexe, quand je vois certaines procédures de Frédérique S, Denis M., Clément M, Patrick P. qui emploient systématiquement en fin de procédure "Set TheObject = Nothing"
Mais par contre j'ai aussi noté que Laurent Longre qui est quand même notre référence nationale (même sur les sites US) ne le fait pas. En prime il a carrément écrit ceci dans un post du MPFE :
"Tu n'as pas besoin d'affecter Nothing aux variables objets à la fin de la procédure, dans la mesure où ce sont des variables locales (détruites automatiquement à la fin de la procédure). " (1999/12/14)
Dans mes recherches j'ai aussi noté que nos amis Ti et STeph, présents dans ce Forum et qui sont eux aussi d'Excellentes références, ne remettent pas non-plus à Nothing les variables Objects locales.
Au niveau de la mémoire j'ai aussi trouvé ceci d'un certain Abdoul S. :
Au niveau de la gestion mémoire : quand tu utilises Set, la variable ne contient pas une "copie" de l'objet, mais simplement une référence à celui-ci. Tant que tu n'utilises pas le mot-clé New (affectation d'une nouvelle instance de classe à une variable), la mémoire consommée par cette variable objet restera assez réduite. Si la variable est locale à la procédure (comme l'est apparemment MesSh dans ta macro), elle est de toute
façon détruite à la fin de cette procédure et la mémoire qui lui était allouée est automatiquement libérée. La libération explicite de cette mémoire, par Set Mavariable = Nothing, s'impose surtout dans le cadre de grosses macros avec des variables objets de niveau module et/ou qui réfèrent à des instances de classes. (1998/01/23)
Par ailleurs, une récapitulation intéressante pour vider la mémoire (toujours du Grand Chef à 3 plumes... LL)
Vider une variable objet : Set MOnObjet = Nothing
Vider un tableau : Erase MonTableau
Vider une chaîne de caractères : MaChaîne = ""
Décharger un UserForm de la mémoire vive : Unload MonUserForm
Libérer *toute* la mémoire allouée par la macro : instruction End
(interrompt également le programme)
+ éviter si possible de manipuler trop souvent PageSetup, HPageBreaks
etc: presque tout ce qui touche à la configuration de l'impression sous
VBA génère des problèmes de mémoire non désallouée. (2000-11-16)
Et ici une petite démo toujours de LL :
Dim XL As Excel.Application
Sub OuvreXL()
Set XL = New Excel.Application
End Sub
Sub QuitteXL()
XL.Quit
Set XL = Nothing
End Sub
Sub Exemple()
If XL Is Nothing Then OuvreXL
MsgBox XL.WorksheetFunction.TInv(0.5, 19)
If MsgBox("Continuer à utiliser les fonctions XL ?", vbYesNo) = _
vbNo Then QuitteXL
End Sub
LL comments :
Si les fonctions d'Excel doivent être périodiquement rappelées par ta
macro, il vaut mieux laisser l'instance d'Excel ouverte en permanence,
et ne la refermer que quand ta macro n'en a plus besoin.
Avantage : comme Excel est déjà ouvert, la fonction est appelée plus
vite. Inconvénient: l'instance d'Excel ouverte consomme des ressources
en mémoire vive.
Ce qui laisse bien entendre aussi l'utilisation du Set TheObject = Nothing est important dans le cas de Variables Publiques.
Ensuite j'ai aussi passé un moment sur le site de Chip Pearson (Excellent site pour ceux qui parlent anglais
Chip Pearson)
Je n'ai pas vraiment trouvé d'explication pour ce sujet précis, mais par contre j'ai trouvé ceci qui selon toute vraisemblance pourrait être une cause de mauvaise optimisation dans le style de "Variable Object Collection" que Michel décrit plus haut....
Don't Use The New Keyword In A Dim Statement
"ne pas utiliser l'instruction New dans une déclaration de Dim"
C'est à dire de
ne pas utiliser ceci :
Dim MyCollection As New Collection
En effet Chip, indique que ceci est la méthode "Auto-Instancing". Elle va systématiquement générer en Run-Time une compilation de codes cachés et ceci à chaque fois que l'on fera appel à la Variable pendant la procédure... Contrairement à ce que l'on pourrait penser (et bien que çà sauve du texte à taper pour le développeur !) par cette méthode "Auto-Instancing" l'objet "MyCollection" n'est pas créé par la Déclaration Dim. L'objet est généré
De plus il dit qu'à aucun moment on ne pourra déterminer si cette Variable est en fait vide ou non !
En d'autres termes l'instruction "New" agit plus comme un ordre de compilation et pas une instruction "d'action" pour VBA.
Ce que Chip conseille à la place :
Dim MyCollection As Collection
Set MyCollection = New Collection
C'est çà qui est bien quand on participe à un Forum comme celui-ci, on se remet tous les jours en question et c'est uniquement comme ceci que l'on apprend !!!
Pour conclure (sorry pour ce long fil, mais il ne représente même pas le temps que j'ai passé pour cette question !!) donc j'ai finalement testé la procédure que j'avais mise dans l'autre fil de discussion qui a déclenché la question de Laurent :
Macro d'origine
Sub TxtLineCountMethodOne()
Dim FSO As Object, TXT As Object
Dim Chemin As String, Fichier As String
Dim Nbr As Long
Chemin = ThisWorkbook.Path & "\"
Fichier = "Daily-2004-03-26.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TXT = FSO.OpenTextFile(Chemin & Fichier, 8, False)
Nbr = TXT.Line - 1
MsgBox "le Fichier " & Fichier & " contient " & Nbr & " lignes "
TXT.Close
Set FSO = Nothing
Set TXT = Nothing
End Sub
Et la je regarde si FSO "est encore vivant" !!!
Macro TEST
Dim Chemin As String, Fichier As String
Sub TxtLineCountMethodOne()
Dim FSO As Object, TXT As Object
Dim Nbr As Long
Chemin = ThisWorkbook.Path & "\"
Fichier = "Daily-2004-03-26.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TXT = FSO.OpenTextFile(Chemin & Fichier, 8, False)
Nbr = TXT.Line - 1
MsgBox "le Fichier " & Fichier & " contient " & Nbr & " lignes "
TXT.Close
Testing
End Sub
Sub Testing()
Set TXT = FSO.OpenTextFile(Chemin & Fichier, 8, False)
Nbr = TXT.Line - 1
MsgBox "le Fichier " & Fichier & " contient " & Nbr & " lignes "
TXT.Close
End Sub
J'ai immédiatement une erreur 424 "Objet Requis" ce qui laisse bien la confirmation que mon Object FSO n'existe plus ! (La fenêtre Variables Locales confirme la même chose)
Donc Laurent ne change pas tout !
Bon Dimanche à Tous et Toutes (moi par contre j'ai des procédures à modifier... surtout pour le Dim Toto As New Collection lol)
@+Thierry