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 :

Erreur exécution 7 Mémoire insuffisante


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut Erreur exécution 7 Mémoire insuffisante
    Bonjour,

    il y a déjà d'autres discussions mais pas exactement la même chose...

    En lancant VBA et en lui faisant faire environ 400 boucles avec un dim u() as string puis dans le code un u() = Split(chaine_data,...), un Workbooks.Add pour ouvrir puis fermer le classeur excel aprés calculs effectués...


    et bien aprés 280 boucles le message mémoire pleine s'affiche...
    Si découpage en 2 parties de 200 boucles je n'ai aucun problème...
    il me semble que je n'ai pas bien vidé la mémoire après chaque boucle, alors que chaque boucle est quasi indépendante l’une de l’autre, seule chaine_data et 2-3 autres paramètres du type Boolean, Date, Integer doivent être conservés

    Pour u() qui est indépendant pour chaque nouvelle boucle, par exemple j'ai essayé, Redim u(0) ( pas réussi u()= Unload, Set u()= Nothing) cela a permis semble t’il de gagner 80 boucles...u() est il bien vide dans la mémoire ?

    Il y a aussi pour chaque boucle ouverture puis fermeture d’un classeur excel indépendant pour chaque boucle de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Workbooks.Add
    ActiveWorkbook.SaveAs Filename:=flna, FileFormat:=xlExcel8, CreateBackup:=False 'sauvegarde sous le nom avec la bonne extension et le bon FileFormat ici sans macro
    Workbooks(2).Save 'sauvegarde le fichier avant de le fermer
    Workbooks(2).Close 'ferme le fichier
    Mais chaque nouveau classeur à l’ouverture s’appelle classeur(n+1) et non toujours classeur1...donc ici cela doit surement manger de la mémoire, comment vider ce classeur de la mémoire ?
    Je vais essayer avec un set W = Workbooks.Add et regarder ce qui mange de la mémoire...
    puis set W = nothing...
      0  0

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set NeWb=Workbooks.Add
    NeWb.SaveAs Filename:=flna, FileFormat:=xlExcel8, CreateBackup:=False 'sauvegarde sous le nom avec la bonne extension et le bon FileFormat ici sans macro
    NeWb.Save 'sauvegarde le fichier avant de le fermer
    NeWb.Close 'ferme le fichier
    Set NeWb=nothig
    DoEvents
      0  1

  3. #3
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Merci de ton aide mais cela ne change pas le nouveau classeur lors de son ouverture s’appelle classeur(n+1)...tout est identique comme avec set W en utilisant NeWb à la place:
    Pour définir NeWb mis en déclaration
    Dim NeWb As Workbook
    Après l’instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NeWb.Close 'ferme le fichier
    'aprés la fermeture du classeur l'espace mémoire semble déjà libéré:
    '  - : NeWb :  : Workbook/Workbook
    '      :  : <Aucune variable> :
    'donc le set NeWb = nothing inopérant semble t'il...
    Set NeWb = Nothing 'pour libérer de la mémoire en supprimant le Workbooks.Add de la mémoire
    '    : w : Nothing : Workbook
    DoEvents
    Par contre je n’arrive pas à utiliser Application.MemoryFree pour voir qui mange de la mémoire...

    PS: pour voir si cela marche je vais quand même lancer toutes les boucles pour être bien certain que rien ne change
      0  0

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    je suppose que tu utilises toujours le même mais bon, essaie en ajoutant :
    eric
      0  0

  5. #5
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Pas de chance NeWb n'a pas modifié le problème...
    et aprés vérification pas sur du tout non plus que le redim u(0) ne change quoique soit aussi...car bloquage au même niveau que si rien n'avait été fait...

    ok Eriic je vais essayer Erase.

    Existe il une formule type Application.MemoryFree pour voir l'évolution de la mémoire (Application.MemoryFree n'est pas reconnue)?
      0  0

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bah non. C'est à toi de vider les poubelles régulièrement.

    Edit : je viens de voir que j'avais mal lu ta question...
    Moi je regarde dans le gestionnaire de tâche / Processus
      0  0

  7. #7
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    oui dans le gestionnaire de tâches processus la mémoire utilisée par excel monte en fin de boucle puis redescend en début de boucle mais pas au même niveau que lors de la boucle précédente et donc à force de faire des boucles la mémoire fini par trop augmenter!!!
    mais surtout si je relance (ces boucles ou un autre classeur excel) alors la mémoire continue de monter...en fait le seul moyen de la faire redescendre c'est de fermer excel!!!
    en fait quelque soit la puissance de l'ordinateur utilisé il va finir par bloquer de cette façon...

    Comment peut on remettre excel à 0 ou à pas grand chose aprés chaque boucle car je dois quand même garder 2-3 paramètres?
    c'est mon code qui ne doit pas aller pourtant il n'a rien de compliqué une boucle for i=0 to ..., un u() =split(chaine_data...), un résultat sauvegardé dans un fichier excel qui est fermé à chaque fin de boucle et u() réinitialisé ici par un ReDim u(0)...bref que des choses basiques qui se répétent...
      0  0

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Quand tu ouvre un fichier tu le charge en mémoire.

    Quand tu traite le fichier tu occupe la mémoire et la cpu.

    Si ton traitement est relativement long tu monopolises le micro processeurs

    Hors la gestion de la mémoire ce fait par un microprocesseur annexe le DMA.

    Il est prioritaire sur le microprocesseur de l'ordinateur, mais ton traitement consomme tout le temps sens lui laisse la possibilité de s'exprimer et comme c'est le DMA qui gère la mémoire...

    Il est évident que ton code n'est pas bien ficelé! La difficulté réside à trouvé où.



    Toutes allocation mémoire doit commencer par un set variable =?? Et ce terminer par set variable =nothing.

    Notes également que la portée d'une variable dépend de l'endroit de ça déclaration.

    En entête de module pour tout le classeur dans une sub juste á l'intérieur de la sub


    Découpe ton programme en fonctionnalités et ne déclare dans ta sub que les variables utilisées dans ta sub et passes lui en paramètres les variables qui proviennent du niveau du dessus.

    Le doevnts a pour objet de rendre la main au DMA.
      1  0

  9. #9
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Merci de tes explications...je ne savais rien de tout cela...bien reste donc à faire des modifications dans le code pour que cela marche correctement.
    Pour info chaine_data fait 100-150Mo
      0  0

  10. #10
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Si tu nous expliquais un peu plus ce que tu souhaites faire.

    De plus peux-tu nous en dire plus et montrer le code correspondant à
    En lançant VBA et en lui faisant faire environ 400 boucles avec un dim u() as string puis dans le code un u() = Split(chaine_data,...), un Workbooks.Add pour ouvrir puis fermer le classeur excel après calculs effectués...
    c'est mon code qui ne doit pas aller pourtant il n'a rien de compliqué une boucle for i=0 to ..., un u() =split(chaine_data...), un résultat sauvegardé dans un fichier excel qui est fermé à chaque fin de boucle et u() réinitialisé ici par un ReDim u(0)...bref que des choses basiques qui se répètent...
    Attention avec Redim, à chaque fois au tu fais un redim Excel modifie la mémoire où est contenu le tableau. Mais au moment d'agrandir le tableau, les espaces mémoire "situés en dessous" de ceux déjà utilisés pour ton tableau contiennent d'autres données et Excel ne peut pas les utiliser. Il recherche donc un autre espace mémoire plus loin. Le résultat c'est que plus tu fais de redim et plus le tableau et éparpiller un peu partout en mémoire... et ça c'est pas bon car Excel doit aller chercher à droite à gauche dans les espaces mémoire pour trouver tes données.

    Affiche l'intégralité de ton code que l'on puisse voir s'il n'y a pas un autre façon de coder tout ça.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message
      1  0

  11. #11
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour Qwaz,

    Le ReDim est une idée venue plus tard pour justement essayer de remettre l’espace mémoire au niveau initial mais cela n’a rien changé non plus semble-t-il...
    Ok pour mettre le code en ligne d’ici peu si besoin, pour l’instant je modifie le code avec notamment l’endroit des diverses déclarations comme suggéré...
      0  0

  12. #12
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour,

    Actuellement pour chaque boucle la consommation moyenne est de 0.01 GB de mémoire virtuelle!!! je crois qu'en mémoire chaque boucle vient s'inscrire juste après la précédente...
    L'erreur vient bien du code où les paramètres sont tous mis en Dim général pour ne pas être perdus d'une boucle à l'autre et d'une sub (ou function) à l'autre, et pour le moment tentative de les placer différemment...
      0  0

  13. #13
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Il nous faut à minima le code pour pouvoir te répondre correctement.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message
      1  0

  14. #14
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Comme dit Qwazerty, savoir ce que tu fais pourrait être utile.
    Tu ne mets même pas ton code qui reproduit ton phénomème qu'on puisse tester d'éventuelles solutions.

    Tu ne peux pas créer ton classeur dans une autre session d'excel que tu fermerais à chaque fois ? (ou tous les 100 fichiers)
    Au moins tu seras sûr que cette partie ne viendra pas empiéter sur la mémoire de ta session principale.

    idée 2 : remplacer ton tableau dynamique par un taille fixe assez grand. Il n'y aura pas de réaffectation de mémoire en permanence qui fini peut-être par la fragmenter et devient inutilisable pour excel faute de blocs assez grands.
    En plus tu as Erase pour un tableau taille fixe si besoin.
    Il faudra te passer du Split et extraire les bouts de chaine un par un.
    eric
      0  0

  15. #15
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Pour le code aucun soucis (mais je voulais éviter dans un 1° temps cette étape car elle va me prendre du temps car je dois regarder en 1° comment le restructurer pour qu’il soit compréhensible et aussi ce que je peux mettre en ligne !!!)

    En attendant j’ai tenté une astuce qui n’a pas marché en utilisant par exemple à la centième boucle un Application.Wait aussi un DoEvents et même une MsgBox...la mémoire virtuelle monte toujours.

    Merci de votre aide
    A bientôt pour le code...
      0  0

  16. #16
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    j'y pensais aussi d'explorer la piste entre-ouverte par dysorthographie.
    Seulement il me semble que Application.Wait conserve la main.
    Regarde plutôt vers Ontime
    eric
      0  0

  17. #17
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Merci pour toutes tes infos Eriic :

    Reprise et étude du code en cours...mais avant d’aller plus loin voici les tentatives aux tests que tu as proposé :

    Application.Ontime pas réussi à appeler le classeur déjà ouvert (mais peut on appeler une procédure déjà ouverte ou un fichier peut il s’autoappeler?, en toute fin de programme VBA m’indique un échec...mais cela ne bloque pas le fonctionnement de VBA
    Les tentatives faites sont les suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.OnTime Now + 0.00002, "ThisWorkbook"  
    Application.OnTime Now + 0.00002, "ThisWorkbook.module1"
    Comment faire ?

    Pour utiliser Erase il semble que les 2 lignes de code suivantes fonctionnent donc dans le doute j’ai mis les 2 mais niveau mémoire rien ne semble changer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erase u ' pour effacer le tableau u() provenant du u() = split(chaine_data...)  donne  : u :  : String()
    Erase u() ' pour effacer le tableau u() provenant du u() = split(chaine_data...)  donne  : u :  : String()
    Es tu d’accord sur cette façon de faire ?

    Pour les tableaux il y en a partout, c’est peut être cela qui doit manger de la place!!! j’essaie de mettre un minimum d’ordre
    Le tableau u() est en dim général peut être tenter de le mettre juste dans la sub qui a besoin de lui (s’il n’y en a qu’une qui fait appelle à lui)
    et il y a aussi des graphiques (ca doit manger de la place aussi ça)

    Pour le moment étude du code et des tableaux pour avancer...mais je vais regarder cette histoire de graphique aussi...ils ont l'air trés lourds

    @+
      0  0

  18. #18
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Commençons par le plus simple, le tableau taille fixe.
    L'idée était de réserver la mémoire une fois pour toute, sans les multiples recherches de dispo pour l'allocation des tableaux dynamiques.
    Pour le Erase sur tableau fixe je devais avoir l'esprit embrumé puisqu'il ne sert à rien dans ce cas.
    Si un tableau fixe n'a rien changé, les tableaux dynamiques ne sont donc pas la cause (principale...) de la fuite.

    Pour le garbage collection le pb c'est que je n'ai aucune idée des conditions de mise en oeuvre.
    Après un temps de repos du proc de x secondes ? Sous un taux d'occupation de x% ?
    Finalement il y a plus simple pour tester.
    Tu lances pour 200 fichiers en t'arrangeant pour ne pas avoir d'autres applis qui tournent, tu notes la mémoire prise par le processus et tu vas te prendre un café.
    Si au bout de 5' l'occupation mémoire est toujours pareille on peut supposer qu'il n'y a plus rien à attendre.
    Si par contre elle a baissé il sera temps de réfléchir à une méthode pour qu'elle se mette en oeuvre.
    J'ai bien une idée mais un peu longue à exposer, sans doute pour rien.

    Sinon tu penses le dire un jour ce que tu leur fais à tes classeurs entre le .add et le .saveas ? Tu as testé si c'est faisable en les créant dans une autre session excel que tu détruis à chaque fois ?
    eric
      0  0

  19. #19
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour,

    En suivant ton idée je me concentre en 1° sur les tableaux...seulement attends ton idée du tableau fixe + Erase est à tester plus en détail:
    Dis moi si tu es d’accord sur la démarche suivante que j'ai testée ou si elle est fausse stp:
    Voici le point suivant : je ne connais pas à l’avance le nombre de ligne de u() mais il ne va pas dépasser 3500 lignes (jusqu’à présent c’était le u() =split(..) qui donnait l’information.
    Dans le code il y a plusieurs endroits où il y a des split (ca m’arrangeait beaucoup le split car très rapide et pratique)
    Certain split ne se déclenche qu’une fois pour toutes les boucles et d’autres se déclenchent pour chaque boucle.
    Donc si tu es d’accord travaillons pour le test pour le gros split qui a lieu pour chaque boucle :
    Il n’y a qu’un gros split celui sur u() et un petit split eu() sur toutes les lignes de u() soit donc un eu() pas gros mais qui se répète de trés nombreuses fois...
    NB : Pour tester je n’ai pas supprimé tous les autres split du code...donc il reste des tableaux dynamiques...il ne faut pas supprimer tous les tableaux dynamiques au moins ?
    Et ici pour tester je mets un grand tableau u() par exemple 3500, il a plein de lignes vides les 1150 dernières lignes sont vides par exemple, donc ici faut il faire un Redim(2350) si par exemple 2350 lignes ou plutôt transférer ces 2350 lignes non vides vers un nouveau tableau fixe v(2350) ? (pour le test mis ReDim u(2350) en shuntant donc simplement le u()=split(...) et la mémoire virtuelle augmente toujours de la même façon)
    J'ai laissé le split eu() avec eu() =split(u(i),chr(9))
    Pour info le fait de remplacer le u() = split(chaine_data...) par un do while... loop pour extraire tous les u() fait exploser le temps de l’ordinateur il met 10 fois plus de temps (là tu peux carrément aller dormir qu'il n'a pas fini quand tu te réveilles!!!)(cela ne sera pas possible à terme mais au moins ca permet de tester la mémoire virtuelle sur un tableau fixe u())
    Merci de ta réponse pour le tableau fixe, et finalement j’espère que ce n’est pas lui qui pose problème comme cela je peux préparer du code pour l’afficher en test dés qu'il sera au point...et garder les split...


    Pour la partie mémoire si j'ai bien compris, ce que tu m'indiques:
    Mémoire: toujours en hausse boucle aprés boucle...et historique d'utilisation de la mémoire physique monte lui aussi...

    Les classeurs excel : pour chaque boucle il y a un nouveau classeur. Chaque classeur est indépendant. Pour chaque classeur ouvert il prend un nom, il y a dans les cellules des feuilles excel collage des infos extraire des tableaux, réalisation d’un graphique et sauvegarde fermeture du classeur (Pour info excel incrémente le n° du classeur à chaque nouvelle boucle au lieu de toujours repartir de classeur1 c'est peut être là l'augmentation de la mémoire virtuelle)
    Qu'entends tu par autre session excel que tu détruis à chaque fois?

    Bon WE
      0  0

  20. #20
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    on va aller directement pour une autre session excel qui sera, je pense, le plus efficace.
    Une session excel (32 bits) dispose de 2-3 Go. Tout ce que tu feras dans une autre ne viendra pas encombrer la tienne (enfin j'espère ).
    Ex :
    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
    Sub session2()
        Dim Excel2 As Object, wb2 As Workbook, sh2 As Worksheet
        Set Excel2 = CreateObject("Excel.Application")
        Set wb2 = Excel2.Workbooks.Add
        Set sh2 = wb2.Sheets(1)
     
        'Excel2.Visible = True
        With sh2
            .[A1] = "test"
            Debug.Print .[A1]
        End With
        'wb2.SaveAs Filename:="D:\tmp\cla2.xls", FileFormat:=xlExcel8, CreateBackup:=False
        wb2.Close False
        Set Excel2 = Nothing ' pas sûr que ce soit suffisant mais la session se ferme bien
    End Sub
    C'est juste un exemple. Structure de façon à en créer une tous les 100-200 fichiers après avoir supprimé l'ancienne.
    Dis-nous ce qu'il en est.
    eric
      0  0

Discussions similaires

  1. [XL-2000] Erreur processus Excel:Mémoire insuffisante
    Par ninouchfis dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 07/05/2013, 17h00
  2. [XL-2007] Erreur exécution 7 : mémoire insuffisante sur un UserForm
    Par PaulG2B dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2011, 08h18
  3. erreur d'exécution '7' : mémoire insuffisante
    Par Popeye63 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/10/2010, 12h37
  4. Erreur mémoire insuffisante
    Par jpp81 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/01/2007, 07h31
  5. message d'erreur "Mémoire insuffisante"
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2005, 14h41

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