Problème de non-fermeture de Excel.exe

Birmania Messages postés 15 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 28 mars 2012 - 10 févr. 2011 à 19:51
Tanatlock Messages postés 8 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 24 août 2011 - 4 août 2011 à 10:59
Bonsoir,

Je viens vous voir car j'ai un problème quant à la fermeture d'une feuille Excel via VB6.

En effet, lorsque j'exécute mon code, le processus Excel.exe reste dans la table des processus...

Voila mon code :

Private Sub BP_Valider_Click()
    Dim fichierExcel
    Dim wbExcel
    Dim i As Integer

    
    chemin = App.Path + "\BDGesport.accdb"
    Set base = OpenDatabase(chemin)

    Set fichierExcel = New Excel.Application

    fichierExcel.Workbooks.Open ES_LienFichier.Text
    Set wbExcel = fichierExcel.ActiveWorkbook

    For i = 1 To 3
        'List1.AddItem wbExcel.Worksheets(1).Range("A1").Value
    Next i

    fichierExcel.Quit

    Set wbExcel = Nothing
    Set fichierExcel = Nothing
    
    base.Close
End Sub


Seulement cette erreur n'apparait que lorsque la ligne :
List1.AddItem wbExcel.Worksheets(1).Range("A1").Value

n'est plus en commentaire. Je me posais donc la question que cette ligne crée peut être une référence vers l'objet de type Excel Application ce qui ferait que le garbage collector ne supprime pas l'objet.

Auriez-vous une idée d'où pourrez venir le problème et/ou de comment le résoudre s'il vous plait ?

Merci beaucoup à vous d'avance et je vous souhaite de passer une excellente soirée !

12 réponses

Yous00 Messages postés 36 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 17 janvier 2017
16 févr. 2011 à 09:01
Bonjour,

Essaye avec Application.Quit et non fichierExcel.Quit

Cdlt

Jyb

Petit bidouilleur en excel (vba) ...
0
Tanatlock Messages postés 8 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 24 août 2011
1 août 2011 à 15:14
Bonjour,

J'ai un problème de fermeture d'Excel moi aussi, même si il est un peu différent.

J'utilise Excel dans une application VB6, le processus reste caché. Voilà comment j'initialise mon fichier ainsi que mes feuilles :

Dim XLS_APP As Excel.Application
Dim xls As Excel.Workbook
Dim referentiel As Excel.Worksheet

Set XLS_APP = New Excel.Application
XLS_APP.Application.ScreenUpdating = False
XLS_APP.DisplayAlerts = False
XLS_APP.Workbooks.Add

Set xls = XLS_APP.ActiveWorkbook
xls.Worksheets.Add
xls.Worksheets(1).Name = "referentiel"


Lors d'une exécution normale tout se passe bien et à la fin, il ne reste aucun processus Excel en exécution (je mets le code de fermeture si ça peut aider pour le problème précédent)

XLS_APP.Workbooks.Close
XLS_APP.Quit
Set xls = Nothing
Set XLS_APP = Nothing


Seulement, j'ai introduit dans mon code une gestion d'erreur qui redirige l'exécution vers un handler lorsqu'une erreure survient et lui est supposé se charger d'écrire un rapport d'erreur et de fermer toutes les applications ouvertes dont Excel :

errHnd:

    XLS_APP.Workbooks.Close
    XLS_APP.Quit
    Set xls = Nothing
    Set XLS_APP = Nothing
   
    log.WriteLine "ECHEC lors de l'opération suivante : " & positionCode
    log.WriteLine "Description : " & Err.description


C'est similaire à l'exécution normale et ça marche si on le laisse tel quel, cependant j'ai rencontré un problème, ce qui m'a obligé à supprimer les deux lignes de fermeture des workbooks et de Excel. En effet, si on va directement killer Excel à l'aide du gestionnaire des taches, cela provoque une erreur dans le programme ce qui redirige l'exécution vers errHnd. Or lui va vouloir fermer le contenu d'une application qui n'est plus ouverte et là ça plante.
Donc pour remédier à cela, je supprime les deux lignes posant problème, mais du coup je ne peux plus fermer Excel qui reste dans les processus actifs.

Y aurait-il donc un moyen de vérifier que mon XLS_APP existe bien et n'a pas été tué par l'utilisateur ou par autre chose ?
0
Yous00 Messages postés 36 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 17 janvier 2017
2 août 2011 à 05:34
Bj,

Je pense qu'il faut que tu fasse une vérification de tes appli ouvert en début de code et ensuite si il y en a tu anquil tes fermetures.
Ou sinon jvois pas, désolé.

Jyb

Petit bidouilleur en excel (vba) ...
0
Tanatlock Messages postés 8 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 24 août 2011
2 août 2011 à 11:01
Je viens de trouver une solution à mon problème:

If blnExcelRunning Then
    XLS_APP.Quit
End If


A priori ça marche, mais je n'ai peut-être pas testé tout les cas.
0

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

Posez votre question
Yous00 Messages postés 36 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 17 janvier 2017
2 août 2011 à 12:11
C'est ca ! tu ne devrais pas avoir de problème ...

Cdlt

Jyb

Petit bidouilleur en excel (vba) ...
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
3 août 2011 à 10:06
Salut,

Je suppose que blnExcelRunning est une fonction ?

qui y a t'il derrière blnExcelRunning ?

ne serait-ce pas cette fonction :

A+
0
Yous00 Messages postés 36 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 17 janvier 2017
3 août 2011 à 11:29
Salut,

Je suppose que c'est une fonction qui vérifie l'états de excel (ouvertur, hide, etc), pour le reste je ne puis t'aider (jsuis petit bidouilleur en excel (vba) ..., sorry.

Cdlt
Jyb

Petit bidouilleur en excel (vba) ...
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
3 août 2011 à 13:07
Salut,

j'ai pas de problème pour ma part

y a juste que si c'est bien une fonction, surement comme d'autre j'aurais aimer savoir à quoi elle ressemble.

Ont est sur un forum ici, dont l'objectif premier est le partage faudrait pas l'oublier.

A+
0
Tanatlock Messages postés 8 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 24 août 2011
3 août 2011 à 14:30
Désolé, il me manquait la moitié du code effetivement, c'est une fonction dont le contenu est le suivant:

Dim objExcel As Object
Dim test As Boolean

On Error Resume Next

objExcel = GetObject(, "Excel.Application")

If Err.Number = 0 Then
   test  = True
Else
   test = False
End If

blnExcelRunning = test
0
Tanatlock Messages postés 8 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 24 août 2011
3 août 2011 à 14:46
Désolé, je fais un double post et je sais que ce n'est pas bien, mais je voulais apporter une précision et je n'ai pas trouvé le bouton éditer

La petite précision, c'est qu'il faut que ce soit contenu dans une fonction parce que sinon, le On Error Resume Next n'est pas pris en considération.
Je ne suis pas expert en VB, je ne sais donc pas exactement à quoi c'est dû, peut-être au fait que je sois derrière un label.

Merci bien
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
3 août 2011 à 15:11
Ahhh !

voila qui est intéressant

pour commencer objExcel = GetObject(, "Excel.Application") sans le set devant... pas bon

en suite, que ce passera t'il si l'utilisateur avait une session déjà ouverte ?
Set objExcel = GetObject(, "Excel.Application")

attrapera sûrement l'excel déjà ouvert...

ce qui de fait ne résoudra pas ton probleme puisque XLS_APP pointera quand même sur une session tuée !

je te propose donc d'ajouter une comparaison du handle de ta session et de la session obtenue par la fonction GetObject:

Function blnExcelRunning(ByVal MyXlhWnd As Long) As Boolean
Dim objExcel As Object
Dim test As Boolean, GotXlhWnd As Long

   On Error Resume Next
   Set objExcel = GetObject(, "Excel.Application")
   GotXlhWnd = objExcel.hWnd 'hWnd étant une propriété de l'application excel
   If Err.Number 0 And MyXlhWnd GotXlhWnd Then
      test = True
   Else
      test = False
   End If
   blnExcelRunning = test
End Function


Dans ton code:
Dim XLS_APP As Excel.Application, MyXlhWnd As Long
Dim xls As Excel.Workbook
Dim referentiel As Excel.Worksheet

Set XLS_APP = New Excel.Application
MyXlhWnd = XLS_APP.hWnd
XLS_APP.Application.ScreenUpdating = False
XLS_APP.DisplayAlerts = False
XLS_APP.Workbooks.Add

...

If blnExcelRunning(MyXlhWnd) Then
    XLS_APP.Quit
End If



A+
0
Tanatlock Messages postés 8 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 24 août 2011
4 août 2011 à 10:59
Effectivement, sur le coup je n'avais pas pensé qu'il était possible d'avoir plusieurs Excel ouverts.

Merci pour la solution.

Tanatlock

PS: Pour le Set manquant, je ne m'en suis rendu compte qu'après coup, quand j'ai vu que j'avais toujours une erreur.
0
Rejoignez-nous