OVH Cloud OVH Cloud

Li-bé-rez la mé-moire... utilisée par la fonction SPLIT

3 réponses
Avatar
Trirème
Bonjour et bons voeux aux contributeurs et lecteurs anonymes

Lorsqu'on utilise la fonction SPLIT en VBA, celle-ci génère un tableau à une
dimension (dixit l'aide d'Excel).
Je l'utilise comme ceci dans un test, à l'intérieur d'une boucle :
If Not (UBound(Split(n.Name, "Print_Area")) > 0
pour supprimer les noms de la feuille sauf la zone d'impression et sans
affecter de noms de variable à ce tableau.
Ma question : en sortie de boucle, comment libérer la mémoire qu'Excel
alloue à ce tableau ?

Toutes remarques, suggestions et critiques seront bienvenues.
A vous lire avec attention, merci.

Trirème

3 réponses

Avatar
michdenis
Bonjour Trirène,

| If Not (UBound(Split(n.Name, "Print_Area")) > 0

Il est vrai que la fonction split() retourne un tableau(array), mais
encore faut-il que l'information soit emmagasinée dans une
variable comme ceci :

Dim A as variant
a = Split(n.Name, "Print_Area")

Cependant, de la façon dont tu l'as utilisé, excel évalue de
façon ponctuelle le nombre d'éléments du tableau sans pour
autant créer un espace mémoire pour conserver cette information.
En conséquence, tu n'as pas de tableau à effacer....Cependant
cette façon de faire demande un temps d'exécution plus long si
tu dois répéter cette ligne de code à différent endroit de la procédure
pour un même élément séparateur comme : "Print_Area"



Salutations!


"Trirème" a écrit dans le message de news:
Bonjour et bons voeux aux contributeurs et lecteurs anonymes

Lorsqu'on utilise la fonction SPLIT en VBA, celle-ci génère un tableau à une
dimension (dixit l'aide d'Excel).
Je l'utilise comme ceci dans un test, à l'intérieur d'une boucle :
If Not (UBound(Split(n.Name, "Print_Area")) > 0
pour supprimer les noms de la feuille sauf la zone d'impression et sans
affecter de noms de variable à ce tableau.
Ma question : en sortie de boucle, comment libérer la mémoire qu'Excel
alloue à ce tableau ?

Toutes remarques, suggestions et critiques seront bienvenues.
A vous lire avec attention, merci.

Trirème
Avatar
anonymousA
Bonjour et meilleurs voeux.

la fonction split renvoie un tableau et occupe durant l'opération une
place mémoire pour stocker les résultats.
Pour s'en convaincre, il suffit d'écrire MsgBox VarPtr(Split(n.Name,
"Print_Area")) pour voir que l'adresse de la variable temporaire est
renvoyée.
Ceci dit, cette allocation est fugitive et n'a pas à ma connaissance
de conservation/réservation propre comme peuvent l'avoir des variables
déclarées explicitement ou implicitement.Il n'est donc pas
nécéssaire de l'effacer.

pour les infos sur varptr et ses amis, je te renvoie à
http://support.microsoft.com/kb/q199824/

A+
Avatar
Trirème
Merci à vous 2 pour vos réponses.

Bon, un temps de latence qui m'a permis d'investiguer plus finement.
Résultats : hallucinant !
Vous aurez compris que je piste l'allocation de mémoire à différentes étapes
d'une macro. Cette macro est une boucle de création d'environ 75 onglets et à
chaque itération, la mémoire utilisée (Application.StatusBar = "Mém utilisée
: " & Application.MemoryUsed) augmente légèrement (entre 12 et 20 ko).
La boucle sur les 'Name' dont je parlais précédemment utilisait 4 ko ou 8 ko
ou encore... 0 ko !!!. (Même si, comme suggéré par Michdenis j'affecte le
résultat à une variable suivi d'un éventuel SET a=NOTHING).
J'ai lancé plusieurs fois ma macro dans les mêmes conditions pour constater
que la MemoryUsed n'évolue pas de la même façon d'une exécution à l'autre à
différentes étapes de la boucle principale !!
Soit MemoryUsed est un nombre fantaisiste qui n'a rien à voir avec les
variables et alors on ne peut rien conclure, soit MemoryUsed est lié aux
variables et son évolution suit des règles obscures et... on ne peut rien
conclure.
Je précise que jusqu'ici je relevais les valeurs de MemoryUsed en mode pas à
pas.
Pour mon investigation de cet après-midi j'ai procédé autrement. J'ai
intégré à la macro un tableau, rempli automatiquement avec les différentes
valeurs successives de MemoryUsed, puis vidé sur une feuille vierge. Ce sont
ces feuilles que je compare entre elles.

C'est là que c'est halluciant. Les différentes exécutions de cette macro
(qui fait à chaque fois la même chose) montrent que d'une exécution à l'autre
il n'y a aucun lien dans l'évolution de MemoryUsed. La fonction SPLIT() n'est
donc pas spécialement en cause dans cette consommation de mémoire, ou plutôt,
il n'y a pas moyen de gérer (surveiller) finement la mémoire qu'utilise Excel
avec le peu d'outils disponibles.
Mais ça c'est un sujet qui a déjà fait couler beaucoup d'encre sur le forum.
Donc, sans être rassuré de n'être pas le seul concerné par ce problème, ça
n'en est pas moins énervant.

J'ai fait beaucoup de progrès depuis l'année dernière dans l'économie de
mémoire puisqu'auparavant la boucle s'interrompait après 24 onglets créés.
(Ancienne méthode : duplication d'un onglet 'Formulaire' bien formaté puis
collage en valeur. Nouvelle méthode : Ajout d'un nouvel onglet, puis collage
en valeur et formatage).

Encore merci de votre collaboration.

Cordialement.

Trirème