[VB6 + EXCEL 97] Le processus Excel reste en mémoire

Résolu
Rrominet Messages postés 133 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 24 novembre 2014 - 16 déc. 2005 à 13:24
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 - 19 déc. 2005 à 15:30
Hello,

Je suis en train de faire une application d'affichage de statistiques via VB6 avec un affichage de graphique dans EXCEL97.

Je rencontre un problème lorsque j'exécute + d'une stat dans mon programme.
En fait le processus "Excel" reste en mémoire et me met une erreur à partir de la 2sde exécution de mes stats, donc obligé de passer par [Ctrl]+[Alt]+[Suppr] pour le fermer...

Quelqu'un aurait une idée du problème ? Peut-être que je ferme mal mon fichier ?

Voilà le code de ma procédure :

Private Sub GenererGraphExcel(NomGraph As String, cheminGraphExcel As String, Condition as String)
'Fonction qui va générer un fichier Excel contenant le graph demandé
Dim feuille As Worksheet '--> .Cells(Lig, Col)
Dim graphique As Chart, fso As New FileSystemObject
Dim rec As DAO.Recordset, i As Long, MonExcel As Object

On Error GoTo ErrGenererGraphExcel
Set MonExcel = CreateObject("Excel.Application")
MonExcel.Visible = False
MonExcel.UserControl = True
MonExcel.Workbooks.Open FileName:=App.Path & "\Reports" & NomGraph & ".xls"
Set feuille = MonExcel.Worksheets("Données") feuille.Cells(1, 1) "Nom du responsable": feuille.Cells(1, 2) "Nombre de devis"
Set rec = CreateSnapshot(Condition)
i = 3
While Not rec.EOF feuille.Cells(i, 1) rec("Champ1"): feuille.Cells(i, 2) rec("Champ2")
rec.MoveNext
i = i + 1
DoEvents
Wend
rec.Close

'Enregistrement du fichier et MAJ du graphique
If fso.FileExists(App.Path & "" & NomGraph & "_gen.xls") Then fso.DeleteFile App.Path & "" & NomGraph & "_gen.xls", True
'On va modifier la plage de valeurs sources du graphique
Set graphique = MonExcel.ActiveChart
graphique.SetSourceData Source:=Sheets("Données").Range("A3:B" & CStr(i - 1)), PlotBy:=xlRows
graphique.Refresh
MonExcel.Workbooks(1).SaveAs App.Path & "" & NomGraph & "_gen.xls"
MonExcel.Workbooks(1).Close
MonExcel.Workbooks.Open FileName:=App.Path & "" & NomGraph & "_gen.xls"
MonExcel.Visible = True
GoTo Fin


ErrGenererGraphExcel:
Select Case Err.Number
Case 1004: 'SetSourceData du graphique
Msgbox "Erreur, un processus Excel est déjà ouvert !", vbExclamation
Case 70: 'Permission refusée
If MsgBox("Impossible d'enregistrer l'état, le fichier " & App.Path & "\Reports" & NomGraph & "_gen.xls est déjà ouvert !" & vbCrLf & "Cliquez sur Recommencer dès que le fichier est fermé.", vbRetryCancel) = vbRetry Then
Resume
Else
GoTo Fin
End If
Case Else:
If MsgBox("Erreur inattendue, cliquez sur Recommencer pour tenter une nouvelle fois l'opération." & vbCrLf & "Erreur n°" & Err.Number & " : " & Err.Description, vbRetryCancel) = vbRetry Then
Resume
Else
GoTo Fin
End If
End Select


Fin:
End Sub

Merci d'avance pour votre aide :-)

11 réponses

Rrominet Messages postés 133 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 24 novembre 2014
19 déc. 2005 à 13:41
eldim : On était en VB6, et même en adaptant la source de ton lien, on obtient rien.

J'ai fait ce qu'il fallait dans une appli test pour récupérer les Id au début et à la fin de ma procédure, afin de savoir quel Id d'Excel j'utilisais, mais j'ai beau tuer le processus, VB me met toujours une erreur lorsque j'exécute une 2sde fois mon appli sans la quitter entre temps...
A croire qu'il y a un autre bug que celui dont parle la source donnée par Eldim...

Le meilleur moyen que j'ai trouvé pour le moment est de créer une application qui ne fera que générer le fichier Excel et qui s'auto-quittera une fois la génération terminée. Ca quitte ainsi tous les processus en cours et ne bloque pas les autres accès à Excel !

C'est pas top, mais ça fonctionne à coup sûr :-)
3
rooridge Messages postés 28 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 14 juillet 2006 1
16 déc. 2005 à 15:29
Salut,

il faut d'abord fermer le/les workbook(s) en faisant :
"monObjetExcel.workbooks(i).close 0"
"0" pour fermer sans sauvegarder.

Puis killer le processus en faisant :
"monObjetExcel.Application.Quit"

Sans oublier l'objet :
"set monObjetExcel = nothing"

Comme dirait jean claude convenant, "j'ai bon là, nan ?"

++,
rooridge.
1
Rrominet Messages postés 133 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 24 novembre 2014
16 déc. 2005 à 13:26
Oops, j'allais oublier, bizarrement mon programme me met une erreur "1004" ou "-2147417851" en me disant que "La méthode 'SetSourceData' de l'objet '_Chart' a échoué"...

Et ça me bloque que sur cette ligne. Malheureusement sans cette ligne mon graphe ne donne pas grand chose :-)
0
Rrominet Messages postés 133 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 24 novembre 2014
16 déc. 2005 à 13:49
En fait j'ai du nouveau, il semblerait que quand je fini ma procédure je ne ferme pas mon objet de type "Excel.Application", ce qui fait que tant que je n'ai pas quitté mon appli principale, l'objet reste en mémoire et pose problème...

Comment ferme-t'on cet objet ?

MonExcel.Close me jette...

Encore merci pour vos (futures) réponses ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pseudoOM Messages postés 173 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 30 janvier 2009 1
16 déc. 2005 à 13:51
Oui j'ai exactement le même problème mais avec Excel 2000 ! Je ne sais pas pourquoi, pourtant je met bien "nomObjetExcel.quit" quand j'ai fini mes opérations mais le processus reste quand même en mémoire. Bizar quand même! Désolé mais je ne sais pas t'aider plus ! Peut être que quelqu'un d'autre le pourra (et pas la même occasion, m'aider aussi) !

pseudoOM
0
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
16 déc. 2005 à 15:35
Bonjour,

Y a déja des tas de sujet la dessus...
Plusieurs solutions :
Kill du proces excel

ou plus simple
Encapsuler toutes les variables et les événement Excel dans une même class
Attention à ne pas mettre ta variable de class public
Et Excel se terminera proprement...
0
Rrominet Messages postés 133 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 24 novembre 2014
16 déc. 2005 à 16:10
Pour l'instant, pour me dépanner j'ai fait un exécutable séparé qui s'exécute pour chaque stat et qui se ferme automatiquement après l'avoir générée, Ca fonctionne sans problème !

Mais je vais tester la solution de rooridge, le Set monObjet = Nothing est pas bête :-)
Je n'y avais pas pensé !!

Pour ce qui est de killer le processus eldim, si jamais mon client a ouvert un Excel manuellement entre temps, je ne pourrais pas savoir lequel killer. Et si je kill les 2, ça lui ferme aussi le sien sans sauvegarder. C'est un peu trop "hard" comme solution, même si j'y avais songé en dernier recours...

Merci pour vos réponses ;-)
0
Rrominet Messages postés 133 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 24 novembre 2014
16 déc. 2005 à 16:17
Je viens de tester vos solutions.

Malheureusement aucune ne fonctionne...
Même le KillProcess me fait quand même une erreur sur la méthode "~" de l'objet "~" qui a été déchargée, alors que je recrée bien un objet de A à Z (comme la première fois quoi).

Je vais rester sur mon petit exécutable indépendant, ce sera moins pratique mais au moins ça tourne ;-)

Merci quand même pour vos réponses !!
0
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
16 déc. 2005 à 16:24
Va voir ma réponse ici
ça fonctionne
http://www.vbfrance.com/code.aspx?ID=27541
0
pseudoOM Messages postés 173 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 30 janvier 2009 1
19 déc. 2005 à 12:14
Ok ! Moi j'ai testé la solution de rooridge et elle fonctionne ! Merci beaucoup !

pseudoOM
0
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
19 déc. 2005 à 15:30
Ah ok
0
Rejoignez-nous