Memoire insuffisante lecture fichier

Bonjour,

Mon code VBA se base sur la lecture et l’écriture de fichiers via des types définis par l'utilisateur (UDT). Ci-dessous le code permettant d'écrire puis de lire un fichier "*.thb" dans le type "Info" :

Public Type Info
    Version As Long
    Projet As ProjetThBat ' "ProjetThBat" est un autre UDT
End Type

'Ecriture du fichier .thb
Public Sub SauvegarderMaquette(Info As Info)
    Dim i As Long, Numfichier as Integer
    Dim nomFichier As Variant

    On Error GoTo ManageError
    Numfichier = FreeFile
    Info.Version = 5
    nomFichier = Application.GetSaveAsFilename(fileFilter:="Fichiers ThBât (*.thb), *.thb")
    If nomFichier <> False Then
        Close
        Open nomFichier For Binary As Numfichier
            Put Numfichier, , Info.Version
            Put Numfichier, , Info.Projet
        Close Numfichier
    End If
    Exit Sub
ManageError:
    MsgBox Err.Description
    Close
End Sub

'Lecture du fichier .thb
Function LireThb(chemin As String) As ProjetThBat
    Dim Version As Long
    Dim x As Integer

    On Error GoTo HandleError

    'Chargement du fichier .thb
    Close
    x = FreeFile
    Open chemin For Binary Access Read As #x
        Get #x, , Version
        Get #x, , LireThb
    Close #x
    Exit Function
HandleError:
    MsgBox Err.Description
    Close
    End
End Function

Le code de lecture va fonctionner un certain nombre de fois sur des fichiers d'environ 5Mo, puis va finir par m'afficher une erreur "Mémoire insuffisante" sur l'instruction :

Get #x, , LireThb

A partir de ce moment là, le code ne fonctionne plus et la même erreur apparaît, même si je ferme et relance tous les fichiers Excel.

J'ai fini par trouver une astuce pour refaire fonctionner la fonction de lecture :
1 - commenter une procédure du type "Worksheet_****" (par exemple Worksheet_Change) codée dans une feuille "Microsoft Excel Objects" quelconque de mon projet
2 - relancer la fonction de lecture, là comme par magie ça fonctionne
3 - décommenter la procédure précédemment commentée
4 - relancer la fonction, elle fonctionne toujours comme prévu

Ma question est la suivante : Savez-vous ce qu'il se passe en mémoire pour expliquer ce comportement et existe-t-il une commande pour "nettoyer" la mémoire et avoir un code qui fonctionne tout le temps sans avoir à passer par l'astuce précédente ?

Merci d'avance !

Bonjour CoultonJacks

Je connais Write et Line Input pour travailler sur des fichiers texte, mais pas Put et Get

@+

bonjour,

peut-on voir le code qui fait appel à cette fonction ? Je soupçonne que le problème de mémoire trouve son origine à ce niveau-là et au niveau des variables globales.

la modification du code ou le rechargement du classeur dans excel réinitialise les variables globales (et libère donc la mémoire, ce qui pourrait expliquer pourquoi ton "work-around" fonctionne).

Merci de vos réponses,

BrunoM45 : Le fichier n'est pas un fichier texte simple et est encodé (je ne sais pas comment) par VBA depuis le UDT via la commande Put. Je suis forcé d'utiliser cette commande à moins de comprendre la manière dont VBA encode le UDT en fichier binaire avec "Put" et de le reproduire manuellement. Le binaire étant lu par une autre application.

h2so4 : Je n'utilise pas de variables globales pour stocker les données. Le contenu du fichier est stocké dans la variable locale "Projet" de cette manière :

'Importation des donnees d'un fichier .thb dans le classeur
Sub ChargerMaquette(filePath As String)
    Dim Projet As ProjetThBat

    Projet = LireThb(filePath)

    'Code pour écrire les données dans le classeur
End Sub

Petite précision, peut-être que ça peut aider :
- Si j'isole le code de lecture dans un fichier excel plus léger ou vide l'erreur n'apparaît plus ou très rarement. Le fichier excel sur lequel l'erreur apparaît fait 2,5Mo et contient pas mal de liens, calculs, etc..

Rechercher des sujets similaires à "memoire insuffisante lecture fichier"