[OLE][Excel] : désallocation mémoire

PpPool Messages postés 15 Date d'inscription vendredi 22 mars 2002 Statut Membre Dernière intervention 18 mai 2005 - 18 mai 2005 à 14:57
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007 - 19 mai 2005 à 14:20
Bonjour à tous,

OS : Windows 98 OS/2
VB 6.0
MAPI 6.0
Library Microsoft Excel 8.0

je rencontre un pb qui commence sincérement à m'énerver. J'espère que la communauté va pouvoir me venir en aide.

Présentation de l'appli :
Depuis 2 ans, j'ai une appli qui tourne, qui me permet de récupérer des pièces jointes reçues par mail. Cette appli se regénére dans le temps comme un automate (lancement toutes les heures).
Ces pièces jointes sont en fait des fichiers excel pré-paramètrés que je reçois de nos clients.
L'appli doit procéder à un traitement de ces fichiers pour réaliser des récaps.

Voici le décor planté !


Probléme :
De manière complétement aléatoire, je dis bien aléatoire (des journées cela se passe bien, d'autres journées, c'est le basard), des process excel (1 à n) restent actifs dans le gestionnaire des tâches. Ces process quand je cherche à les 'killer' sont soit en fin de tâche, soit complétement mort (message de windows : process terminé anormalement);

Très rarement, mais cela est arrivé quand même j'ai carrément un message de mémoire insuffisante qui me plante l'appli.

Exemple de code :

Dim Feuil_Excel_Tampon As Object

Set Feuil_Excel_Tampon = CreateObject("Excel.application")

Feuil_Excel_Tampon.Application.Workbooks.Open (Dir.Path & "\Debug\thread n°" & I & ".xls")
Feuil_Excel_Tampon.Application.Visible = False

'Traitement

Feuil_Excel_Tampon.Application.ActiveWorkbook.SaveAs FileName:=Dir.Path & "\Debug\tampon - thread n°" & I & ".xls", _
FileFormat:=xlNormal

'Ferme l'objet en cours
Feuil_Excel_Tampon.Application.Quit
'Désallocation mémoire
Set Feuil_Excel_Tampon = Nothing


Je multiplie ce genre de procédures plusieurs fois.
J'ai vérifié toutes mes procédures, à chaque fois je ferme correctement mon objet excel.application, et je désalloue correctement la mémoire.

Alors MYSTERE, vraiment MYSTERE. j'ai essayé de réinstaller plusieurs fois office, et rien n'y fait. L'appli tourne sur un poste dédié qui ne fait rien d'autres. C'est une machine correcte (PIV, 512 Mo de mémoire).

Voyez vous une solution ????
Comment désallouer la mémoire de manière certaine ?
Est-il possible de faire des pointeurs d'objets en VB ?

Merci d'avance pour votre aide, car là franchement je nage

PpPool

1 réponse

aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
19 mai 2005 à 14:20
Bonjour,



Je vois que tu travailles sans référence sur la librairie Excel (Dim Feuil_Excel_Tampon As Object suivi d'un CreateObject()).
L'avantage est bien évidemment de n'avoir aucun impact sur la version
de l'application Excel. En revanche, tout objet intermédiaire sur un
appel donné doit clairement être nommé. En effet, il y a quelquefois
des "pertes de référence", notamment sur l'objet Application.

Crée autant de variables de type Object que d'objets Excel utilisés. Tu
ne dois pas "traverser" les différents objets pour faire appel à une
méthode du 3ème objet "traversé". Il vaut mieux ne pas dépasser un
objet après ta référence...

En VBA (interne à l'exécutable), tu peux écrire :

Dim o As Object

Set o = CreateObject("...")

o.obj1.obj2.obj3.f1(...)



Pour ton cas (externe car automation) :

Dim o As Object, o1 As Object, o2 As Object, o3 As Object

Set o = CreateObject("...")

Set o1 = o.obj1

Set o2 = o1.obj2

Set o3 = o2.obj3

o3.f1(...)



De plus, je pense qu'il y a une erreur car ta variable
Feuil_Excel_Tampon est déjà une référence sur l'objet automation
"Application".

Tu ne dois donc pas utiliser la propriété "Application", utilisée pour
le code VBA (interne à l'Exe). Toi tu te trouves à l'extérieur et tu
travailles par automation, ta référence pour l'objet "Application" est
ta variable.


Feuil_Excel_Tampon.Application.Workbooks.Open (Dir.Path &
"\Debug\thread n°" & I & ".xls")
Feuil_Excel_Tampon.Application.Visible = False

devient

Feuil_Excel_Tampon.Workbooks.Open (Dir.Path & "\Debug\thread n°" & I & ".xls")
Feuil_Excel_Tampon.Visible = False


-- AOGie --
0
Rejoignez-nous