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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    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 extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    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 037
    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
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    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 extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    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 037
    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
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    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 374
    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 374
    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
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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