IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème libération mémoire sur lecture OnAction d'un shape


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut Problème libération mémoire sur lecture OnAction d'un shape
    Bonjour,

    J'ai une petite macro qui lie la propriété OnAction d'une forme. Elle tourne en boucle, et je me suis aperçu qu'Excel prenait de plus en plus de mémoire, sans la libérer.
    Voici comment reproduire le bug.
    Créer un classeur vierge. Créer quelques formes.
    Créer un module vba avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Option Explicit
     
    Public Sub testMem()
    Dim wsCurs As Worksheet
    Dim shCurs As Shape
    Dim strShapeOnAction As String
     
      While True
        For Each wsCurs In ThisWorkbook.Sheets
          For Each shCurs In wsCurs.Shapes
            strShapeOnAction = shCurs.OnAction
          Next shCurs
          strShapeOnAction = ""
          Set shCurs = Nothing
        Next wsCurs
        Set wsCurs = Nothing
        DoEvents
      Wend
    End Sub
    (Je sais que les réinitialisation après les boucles ne sont pas utiles, mais au cas où)

    Lancer le code et vérifier le processus Excel dans le gestionnaire de tache.
    On voit très bien sa taille mémoire augmenter...

    Cela ne se produit qu'à la lecture de OnAction.

    Système d’exploitation Microsoft Windows*7 Entreprise (idem sur un XP SP3)
    Version 6.1.7601 Service Pack 1 Build 7601
    Microsoft Excel 2010 (14.0.6126.5003) SP1 MSO (14.0.6129.5000) (32bits)

  2. #2
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonsoir,

    pas essayé ton code, mais ta façon d'accéder aux objets réquisitionne beacoup de mémoire
    une révision:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Option Explicit
     
    Public Sub testMem()
    Dim wsCurs As Integer
    Dim shCurs As integer
    Dim strShapeOnAction As String
     
      While True
        For wsCurs = 1 to ThisWorkbook.Sheets.Count
     
            For shCurs = 1 to Sheets(wsCurs).Shapes.Count
                  strShapeOnAction =Sheets(wsCurs).Shapes(shCurs)
                  Sheets(wsCurs).Shapes(shCurs).OnAction = ""
            Next shCurs
     
            strShapeOnAction = ""
     
        Next wsCurs
     
        DoEvents
      Wend
    End Sub

    A mon avis ça sera beaucoup plus léger.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci de ta réponse, mais je n'ai pas besoin de réponse non vérifiée.
    Ton code fait la même chose.
    De plus, les boucles for each sont à préférer lors de scrutation afin de ne pas oublier des objets (comme lorsque tu supprimes des objets lors de la boucle). Cela emploie certes plus de mémoire (quoique c'est juste un pointeur qui est crée avec un incrément pour la poubelle), mais elle est libérée en sortie de boucle.

    Si quelqu'un de plus "Pro" pouvait me répondre, merci.
    Sans rancune NVCfrm

  4. #4
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par DenisF Voir le message
    Bonjour,

    Merci de ta réponse, mais je n'ai pas besoin de réponse non vérifiée.
    Ton code fait la même chose.
    De plus, les boucles for each sont à préférer lors de scrutation afin de ne pas oublier des objets (comme lorsque tu supprimes des objets lors de la boucle). Cela emploie certes plus de mémoire (quoique c'est juste un pointeur qui est crée avec un incrément pour la poubelle), mais elle est libérée en sortie de boucle.

    Si quelqu'un de plus "Pro" pouvait me répondre, merci.
    Sans rancune NVCfrm
    Bonjour DenisF,

    ce passage: ....De plus, les boucles for each sont à préférer lors de scrutation afin ..., je n'ai pas lu de lignes de suppression d'objets dans ton code.
    Même dans ce cas la boucle For Each simpliste certainement pour accéder rapidement à un objet n'est pas indispensable, et est à éviter quand on a un type d'objet qui prend beaucoup de place mémoire dans une grande boucle.
    Je peux t'assurer que d'expérience dans un gros programme Excel, une boucle For Each sur les Shapes dans Excel, rien qu'une dizaine fera traîner un programme qui en déjà plein en mémoire.
    Dans Excel une parade consiste à affecter un variant tableau:
    nom types onaction ....
    pour les shapes stockés dans un range. Boucle sur les limites du tableau. un indice d'une colonne renvoi la propriété que tu as voulu y stocker. la supression d'un Shape exige la même chose pour la ligne correspondante dans la plage de même qu'une modification de propriété. Bien entendu les Sh.x.Count ou wb.sh.z.Count doivent être remplacées par des variables numériques initialisées aux bons emplacements.

    Ma réponse suggère la recherche de rapidité d’exécution et n'a rien à voir je m'en aperçois avec ton post.

    Pour revenir à l'objet de ton post, rien de plus normal que l'UC augmente et reste au même niveau dans ton code, il se trouve que tu as un DoEvents dans une boucle sans fin.
    Même avec une boucle vide comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      While True
        DoEvents
      Wend
    ou une boucle vide sur un milliard pour te rendre compte sans le DoEvents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For i = 1 To 1000000000
     
        Next
    tu devrais avoir la même impression. Cela n'a rien à voir avec la lecture de la propriété.
    Quel est le but de cette procédure? Que veux tu faire?


    Si quelqu'un de plus "Pro" pouvait me répondre, merci.
    Il semble que jusque là un pro sur la question n'a pas lu ton message ou le trouve sans objet.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Rebonjour,
    Désolé, si je t'ai offusqué.
    Ma question porte sur la consommation de mémoire et non sur le temps d'UC.

    D'après une autre personne, ce bug n'apparait pas sur Excel 2013.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour a tous
    le probleme a mon avis viens de "while true " tout simplement "

    en fait les boucle for se finissent mais pas la "while wend"

    a ta place j'utiliserais une boucle do loop avec la condition sur le dernier sheets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Sub testMem()
    Dim i As Long, sh As Shapes
      Do
       i = i + 1
          For Each sh In Sheets(i).Shapes
            strShapeOnAction = sh.OnAction
          Next sh
            Loop While i = Sheets.Count
    MsgBox "fini"
    set sh=nothing
    i=0'facultatif
    End sub
    tout simplement

    au plaisir

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Le problème n'est pas le temps d'UC mais la mémoire.
    Le while true est là justement pour avoir assez de cycle afin de voir la mémoire se remplir (par page de 4KiO).
    A chaque sortie de boucle for la mémoire devrait être nettoyée par la poubelle de VB.
    Ce n'est aucunement le fait des boucles qui emplissent la mémoire. Il suffit de remplacer .OnAction par .Name pour que cela se déroule normalement.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    si le problème est le .action cela implique que la variable prend non seulement le nom de l'action mais tout son contenu ce qui me semble bizarre

    dans ce cas la pour éviter l'utilisation abusive de mémoire avec mes shapes (tout model confondus) j'utilise le tag ou le tooltips pour mémoriser ce qu'il doit faire ou être

    quand le shapes est supprimé tout part avec

    mais ca n'est qu'une idée
    au plaisir

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Ce que je relève, c'est que dans le code interne à Excel (qui n'est pas open source...), la propriété OnAction (Property Get certainement) du shape doit mettre quelque chose en mémoire, mais ne le nettoie pas.
    Même si on met shCurs.OnAction = "Test", la mémoire n'augmente pas...

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui apparament comme je te l'ai dis plus haut la variable prend plus que le nom de l'action
    d'ou mon idée de mettre le titre de l'action dans le texte de remplacement par exemple

    au plaisir

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Pas tout à fait, car le type retourné doit être un string...

    Property OnAction As String
    Membre de Excel.Shape

    Il y a-t-il ici un dev M$, ou je dois poster ce bug sur un autre forum spécialisé?

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re

    le on action est dabors un string quand on construit le shapes par vba
    on met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with sheets(xxx).shapes(xxx)
    .on action="mamacro"
    end with
    mamacro est entre guillemets donc un string
    on peut donc aussi le metre en teant que text de remplacement par exemple

    et ainsi se servir du texte de remplacement dans une macro du genre de la tienne


    au plaisir

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Le problème, c'est que si je clique sur le shape, plus rien ne se fait...
    J'ai donc vraiment besoin d'utiliser cette propriété.

    La chose la plus importante en fait, c'est que je vérifie que tout les shape soient bien liés au bon classeur. Car lorsque tu recopie un shape d'un autre classeur, le OnAction garde le nom de l'ancien classeur. Et je peut avoir plusieur macro de liées à différents shape ainsi que des shapes non liés. Je suis donc obligé de lire cette propriété...

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut
    j'oubliais

    par vba le texte de remplacement

    c'est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for each sh in sheets(XXX).shapes
    sh.alternativetext=sh.onaction
    next
    après ca essaie ta macro par le alternativetext



    comme tu peux le voir ca n'est pas un bug seulement vba ne fait pas tout

    au plaisir

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    J'utilise déjà alternativetext pour les paramètres de la macro...
    Voir post précédent.

  16. #16
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    et pour le cas ou tu a plusieur classeur
    je pense que le ".parent " doit fonctionner aussi bien que je n'ai pas tester


    au plaisir

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Non, le truc est que si je recopie un shape du Classeur1 liée avec MaMacro dans le Classeur2, son OnAction="Classeur1!MaMacro".
    Et quand je clique dessus, Excel ouvrira Classeur1...

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    dans ce cas la
    voila un exemple qui pourrais te donner matière a réflection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for each sh in sheets(xxx).shapes
    sh.alternativetext=sh.alternativetext &"/"& sh.parent& "/" & sh.onaction
    next
    et pour le reste tu utilise la fonction split
    dans la macro qui est appelée tu pourrais faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element1=split (sh.alternativetext,"/")(0)
    pour le premier(la partie 0 étant celle d'origine (celle dont tu te sert )
    et ainsi de suite
    ca n'est qu'une idée parmi tant d'autre

    au plaisir

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Et comment ma macro peut être lancée???

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    pour simplifier les choses

    tu ajoute une condition par le element(1) etant le .parent )

    si le .parent = le nom du classeur que je veux faire ceci ou cela

    au plaisir

Discussions similaires

  1. problème libération mémoire dû aux user control
    Par grogui dans le forum Windows Forms
    Réponses: 25
    Dernier message: 30/03/2009, 09h29
  2. Problème espace mémoire sur module
    Par gege91 dans le forum AS/400
    Réponses: 4
    Dernier message: 26/11/2008, 17h15
  3. problème libération mémoire après une DLL
    Par salseropom dans le forum C
    Réponses: 22
    Dernier message: 03/09/2008, 12h51
  4. Problème d'incrémentation sur lecture wave
    Par Pedrozito dans le forum Interfaces Graphiques
    Réponses: 11
    Dernier message: 16/04/2008, 11h28
  5. Réponses: 2
    Dernier message: 05/05/2007, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo