Li-bé-rez la mé-moire... utilisée par la fonction SPLIT
3 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <NoOne@EvryOuer.fr> a écrit dans le message de news: 8C2C877E-95A9-4769-A29F-C73615670834@microsoft.com...
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.
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
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+
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/
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+
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
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).
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).