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 de gros fichier : Espace de chaine insuffisant avec fonction Space/Get/Replace/Split


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut Gestion de gros fichier : Espace de chaine insuffisant avec fonction Space/Get/Replace/Split
    Bonjour,

    Pour info je travaille sur Excel 2010.

    J'ai des soucis avec la gestion de la mémoire pour mettre un fichier texte en mémoire via VBA, ainsi que pour utiliser des fonctions telles que Space / Get / Replace / Split
    Je souhaite mettre en mémoire dans une variable string un fichier important (>50Mo) et le manipuler ensuite pour l'éclater en ligne puis en cellule
    J'utilise pour cela une fonction qui contient le code suivant :

    La variable filecontent est déclaré en global parce qu'utilisé dans plusieurs fonctions / procédures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    szFileName = LB_File_Path.Caption
    f = FreeFile
    Open szFileName For Binary Access Read As #f
    fileContent = Space(LOF(f))
    Get #f, , fileContent
    Or je plante avec l'erreur 14 "Espace de chaine insuffisant" sur la fonction "Space", ceci de manière aléatoire (en fonction de la mémoire dispo sur mon PC je suppose...)
    Je peux avoir également la même erreur sur la fonction "Get" / Replace / Split sachant que j'ai besoin de ces fonctions ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileContent = Replace(fileContent, vbLf, vbCrLf)
    Y'a t-il une autre manière de mettre un fichier en mémoire ? La fait de découper le fichier en plusieurs morceaux ne changeant rien ...

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Ça pourrait être dû à la mémoire dont dispose ton PC, je pense.
    Et peut-être la vitesse de ton disque dur pour le "swapping" (?)
    Combien de RAM a ton PC ?

  3. #3
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Bin certainement la mémoire du pc est en cause (4Go de ram), d'autant plus qu'elle est occupé par d'autres fichiers excel ouverts, d'autres applications etc ...

    Quand j'ouvre la première fois la macro, les fonctions marchent, mais il suffit que la fasse tourner plusieurs fois pour que le problème apparaisse, sur quand j'extrais les données du fichier et qu'elle sont stockée dans une feuille excel (~71000 lignes dans ce cas précis) cela a tendance à saturer la mémoire d'excel et le fichier passe l'étape du Space et du Get mais j'ai une erreur 7 "Mémoire insuffisante" avec la fonction Split ...

    Quand je catch l'erreur en mode débug je vois bien la mémoire disponible qui n'est pas à 0, ca veut dire qu'il lui en reste encore sous le capot, je pense à une limitation au niveau d'excel mais je sais pas ou ...

    Le truc c'est que la macro excel que je développe (dans le cadre professionnel) est utilisé par de multiples personnes avec des configurations différentes et certainement un nombre plus ou moins important de fichier excel / autres applications démarrée.

    Il me faut un moyen de ne plus avoir ce problème de mémoire peu importe les processes lancés en même temps, je ne peux pas demander aux utilisateurs de ma macro de fermer les applications en cours ou d'arrêter et redémarrer excel systématiquement ... :/

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Tu pourrais peut-être ouvrir (lire) le fichier en plusieurs parties ?
    Plutôt que d'utiliser LOF, il te faudrait utiliser un plus petit "buffer".

    Ou encore lire ligne par ligne, mais je ne sais pas trop le temps que ça pourrait prendre...
    Je n'ai pas vraiment de fichier aussi gros sous la main pour tester.

    Windows ne laissera jamais aller la mémoire à 0.
    Il va plutôt passer par du swapping sur le disque dur et ce dernier pourrait aussi être en cause s'il est trop lent pour le traitement...

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Bonjour, bonjour !

    J'utilise souvent l'import direct en mémoire mais vraiment direct comme par exemple dans cette discussion lignes n°4 & 5…


  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Merci pour ta suggestion Marc, mais l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileContent = Input(LOF(f), f)
    plante aussi avec de gros fichier.

    Ce que je fait fait, c'est que je charge un première fois le fichier , pas de problème:
    Chargement du fichier en mémoire
    Split dans un tableau (Par ligne vbLf ou VbCrLf)
    Séparation, pour chaque ligne, suivant des critères de position/longeur dans un autre tableau
    Recopie de ce tableau dans une feuille Excel (~28000 lignes)

    Je lance cette macro une deuxième fois, ca passe encore (au préalable les 28000 lignes sont supprimées de le feuille)
    mais genre au bout de la troisième, la macro plante sur l'instruction Input avec l'erreur 14
    Puis, j'attends un peu et la l'instruction Input passe mais c'est l'instruction Split qui plante erreur 7

    Le code du split est le suivant :
    Comme je ne sais pas de quel manière je vais recvoir les fichiers (Dos ou Unix) le caractère de retour chariot peut changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    T_File() = Split(fileContent, vbCrLf)
    If UBound(T_File()) = 0 Then                                        
        T_File() = Split(fileContent, vbLf)                              
    End If
    Le fichier que je test est en mode Unix (caractère VbLf) et le split plante quand j'essaie le split avec VbCrLf => Il met tout le contenu du fichier dans T_File(0) => Erreur 7

Discussions similaires

  1. [Python 2.X] gestion de gros fichier
    Par vincenlnx dans le forum Général Python
    Réponses: 10
    Dernier message: 22/11/2014, 15h42
  2. gestion de gros fichiers en C++
    Par buzzkaido dans le forum C++
    Réponses: 6
    Dernier message: 07/08/2012, 12h16
  3. Gestion de gros fichiers
    Par bpy1401 dans le forum Android
    Réponses: 10
    Dernier message: 03/07/2012, 13h40
  4. Gestion des (gros) fichiers
    Par schneed dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/02/2009, 20h05
  5. [Composants texte] Gestion de gros fichiers
    Par sozie9372 dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 22/05/2006, 11h03

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