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 :

Gestion mémoire ?!?! [XL-2003]


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
    Avril 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Par défaut Gestion mémoire ?!?!
    Bonjour,

    J'ai un petit problème de gestion de mémoire, mon VBA Excel pétant litéralement les plombs au niveau de sa consommation de mémoire.

    Le fait est que, durant mon code VBA, je charge quelques 'gros' tableau (gros pour VBA, la dimension n'étant que de 2x~1500). J'ai beau essayer d'utiliser toujours le même nom de tableau d'une procédure à l'autre (à condition que cela soit le même tableau) j'ai l'impression qu'Excel ne fait que crée de nouvelle zones mémoire, sans libérer les anciennes. Mais prenons un exemple :

    Voila ma fonction :

    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
    Public Function Liquid_Liq_Check(Nerr As Long)
        Dim Old_Struc(), New_Struc() As Variant
     
        WLog "STRUCTURE LIQUID", True
     
        For lc = 0 To UBound(LiqC) 'Dimension de LiqC : (4) variable public
            WLog "   > " & LiqC(lc), False
            Old_Struc = Liquid_Structure(Sheets(ST)) 'Dimension de Old_Struc : (2,~1500)
            New_Struc = Liquid_Structure(Sheets(LiqC(lc) & "_L")) 'Dimension de New_Struc : (2,~1500)
     
            u = Struc_Check(New_Struc, Old_Struc) 'Fonction qui va comparer mes deux tableaux
        Next lc
     
        Liquid_Liq_Check = Nerr
    End Function
    Dans Struc_Check, les tableau conservent le même nom de variable (New_Struc, Old_Struc et la dimension de Old_Struc est petit à petit ramené de 2x1500 à 2x0) et dans Liquid_Structure ils s'appelent Struc. En début de boucle for, Excel consomme ~65mo. A la fin de la première boucle : ~280mo (à la limite pourquoi pas, il a créé au moins 3 tableau de 2x1500). A la deuxième : ~495mo puis ~710 pour finir en toute fin de boucle à 1140mo.

    Le plus étrange est que, si je ferme mon fichier Excel (juste le fichier, pas la session Excel) je libère environ 40mo de mémoire uniquement...

    Comment puis-je intégrer la gestion de mémoire à mes function?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Bonjour,
    quelques pistes :
    - essayer de typer les 2 tableaux pour ne pas les laisser en variant => integer, string etc...
    - Rajouter un End avant le End Function.

    Tu nous dis ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Par défaut
    Petite précision:

    Toutes mes variables sont déclarées, j'utilise 1 variable public et 3 constantes.

    De plus, dans la boucle qui surcharge ma mémoire (dans ma fonction Liquid_Structure) j'ai ajouté un log de mes conso de mémoire pour identifier quel variable faisait monter en charge ma mémoire. Or en utilisant Application.MemoryUsed // Application.MemoryFree // Application.MemoryTotal j'ai toujours la même chose : Used : 40mo Free : 1mo Total 41mo. Alors même qu'Excel utilise plus que ça en mémoire au début de ma fonction... Existe-t-il une autre syntaxe pour récupérer des valeurs d'utilisation de mémoire qui veuillent dire quelque chose?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Par défaut
    Quel est l'utilité de rajouter un End avant le End Function?
    Est-il possible d'avoir un string sur plusieurs dimensions? genre string(1, 1500)

    ** EDIT **

    - A oui on peut dimensionner une string, j'aurais appris quelque chose aujourd'hui

    - Pour le End on va oublier car ça termine ma fonction. Le bout de code que j'ai mis est inclu dans d'autres fonctions.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Par défaut
    Bon, en déclarant avec un type autre que Variant (et donc mieux adapté) ça a effectivement l'air de me libérer de la mémoire, à condition aussi de changer mes sous fonctions.

    Jusqu'ici je faisait :

    x = sous_fonction(liste_variable)

    Et je vais faire

    sous_fonction liste_variable, x

    avec un ByRef sur x dans ma sous fonction... Sinon je me prenais beaucoup de err 13 incompatibilité de type car je ne redimensionnais pas x (les dimension n'étant identifié que dans mes sous fonctions). Enfin il me semble que mes erreurs venaient de là

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Par défaut
    Effectivement je n'ai pas mit tout mon code. Loin de là.

    Le problème venait déjà en grande partie de mes variables déclaré en Variant. En changeant ça déjà, même si ma conso de mémoire augmente, je fait 60->100 au lieu de faire 60->1000. C'est mieux y'a pas à dire

    Toujours est-il que ça me semble encore beaucoup.

    Voila un update de mon 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
    Public Function Liquid_Liq_Check(ByRef Nerr As Long)
        Dim Old_Struc() As String, New_Struc() As String
        Dim lc As Long
     
        WLog "STRUCTURE LIQUID", True
     
        For lc = 0 To UBound(LiqC)
            WLog "   > " & LiqC(lc), False
            Liquid_Structure Sheets(ST), Old_Struc
            Liquid_Structure Sheets(LiqC(lc) & "_L"), New_Struc
            'u = Struc_Check(New_Struc, Old_Struc)
        Next lc
     
    End Function

    Cela m'étonnerais que la montée en charge vienne de WLog. En fait j'en suis même sûr, il y a énormément d'appel à cet fonction dans le reste de mon code, pour une montée en charge qui ne dépassait pas 100ko jusqu'aux appels à Liquid_Structure. De toute façon il s'agit simplement d'écrire un log de ce qui est fait dans une texte box

    Toujours est-il que mon problème est plus ou moins résolu en changeant la déclaration de mes Variant en quelque chose de plus approprié. Jusqu'à aujourd'hui j'ai toujours pensé qu'un tableau était forcément Variant... Apparement mes ~40mo de charge supplémentaire en utilisant ma fonction Liquid_Structure finissent par se libérer. Le seul truc étrange est qu'ils sont libéré bien après la fin de mon code (genre là après 10min sans touché à mon Excel, il est repassé de 100mo à 5mo, un peu comme une mise en veille, et remonte à ~50/60mo des que je commence à me resservir de lui)

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    Peut être avec des

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set Liquid_Structure=nothing
    avant le end function. mais il n'est même pas sûr qu'Excel libère immédiatement la mémoire qu'il s'est alloué pour l'opération.

    Sinon pour les tableaux il y a sur ce forum d'excellents tutos. Il peut être intéressant de les dimensionner dès le début.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim MonTableau(2 to 15) as string
    Dim Montableau2(2 to 15, 5 to 500) as integer
    Renseignez vous aussi sur ReDim, qui permet de maîtriser la dimension des tableaux à n dimensions dynamiques.

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    salut

    trop d'éléments inconnus pour répondre valablement.
    - Que sont et comment et ou ont été définies et déclarées les variables dont on ne voit pas la déclaration dans la fonction ?
    - Qu'est la fonction ou la routine Wlog ? quel est son code ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread POSIX et gestion mémoire
    Par pier* dans le forum POSIX
    Réponses: 1
    Dernier message: 07/07/2006, 21h36
  2. TAO, Value types et gestion mémoire
    Par TiChabin972 dans le forum CORBA
    Réponses: 1
    Dernier message: 25/04/2006, 20h55
  3. [D7] Tableau dynamique et Gestion mémoire
    Par Cl@udius dans le forum Langage
    Réponses: 7
    Dernier message: 13/03/2006, 15h16
  4. [Gestion mémoire] SetLength sur TDoubleDynArray
    Par MD Software dans le forum Langage
    Réponses: 14
    Dernier message: 24/04/2005, 21h11
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

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