Rrominet
Messages postés133Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention24 novembre 2014
-
16 déc. 2005 à 13:24
cs_eldim
Messages postés956Date d'inscriptionlundi 30 mai 2005StatutMembreDernière intervention21 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
Rrominet
Messages postés133Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention24 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 !
Rrominet
Messages postés133Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention24 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 :-)
Rrominet
Messages postés133Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention24 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 ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
pseudoOM
Messages postés173Date d'inscriptionjeudi 3 février 2005StatutMembreDernière intervention30 janvier 20091 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) !
cs_eldim
Messages postés956Date d'inscriptionlundi 30 mai 2005StatutMembreDernière intervention21 août 20141 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...
Rrominet
Messages postés133Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention24 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...
Rrominet
Messages postés133Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention24 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 ;-)