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

Rrominet 135 Messages postés lundi 26 janvier 2009Date d'inscription 24 novembre 2014 Dernière intervention - 16 déc. 2005 à 13:24 - Dernière réponse : cs_eldim 961 Messages postés lundi 30 mai 2005Date d'inscription 21 août 2014 Dernière intervention
- 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 :-)
Afficher la suite 

11 réponses

Meilleure réponse
Rrominet 135 Messages postés lundi 26 janvier 2009Date d'inscription 24 novembre 2014 Dernière intervention - 19 déc. 2005 à 13:41
3
Merci
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 :-)

Merci Rrominet 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

rooridge 28 Messages postés mardi 13 avril 2004Date d'inscription 14 juillet 2006 Dernière intervention - 16 déc. 2005 à 15:29
1
Merci
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.
Rrominet 135 Messages postés lundi 26 janvier 2009Date d'inscription 24 novembre 2014 Dernière intervention - 16 déc. 2005 à 13:26
0
Merci
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 :-)
Rrominet 135 Messages postés lundi 26 janvier 2009Date d'inscription 24 novembre 2014 Dernière intervention - 16 déc. 2005 à 13:49
0
Merci
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 ;-)
pseudoOM 174 Messages postés jeudi 3 février 2005Date d'inscription 30 janvier 2009 Dernière intervention - 16 déc. 2005 à 13:51
0
Merci
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
cs_eldim 961 Messages postés lundi 30 mai 2005Date d'inscription 21 août 2014 Dernière intervention - 16 déc. 2005 à 15:35
0
Merci
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...
Rrominet 135 Messages postés lundi 26 janvier 2009Date d'inscription 24 novembre 2014 Dernière intervention - 16 déc. 2005 à 16:10
0
Merci
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 ;-)
Rrominet 135 Messages postés lundi 26 janvier 2009Date d'inscription 24 novembre 2014 Dernière intervention - 16 déc. 2005 à 16:17
0
Merci
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 !!
cs_eldim 961 Messages postés lundi 30 mai 2005Date d'inscription 21 août 2014 Dernière intervention - 16 déc. 2005 à 16:24
0
Merci
Va voir ma réponse ici
ça fonctionne
http://www.vbfrance.com/code.aspx?ID=27541
pseudoOM 174 Messages postés jeudi 3 février 2005Date d'inscription 30 janvier 2009 Dernière intervention - 19 déc. 2005 à 12:14
0
Merci
Ok ! Moi j'ai testé la solution de rooridge et elle fonctionne ! Merci beaucoup !

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.