Kill "excel.exe"

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 207 fois - Téléchargée 36 fois

Contenu du snippet

Bonjour a tous,

Récemment bloqué par 1 process "Excel.exe" qui ne souhaitait pas disparaître
même après un "Set oXl = Nothing"; des recherches approffondies s'imposaient...

Aussi, j'ai pu me rendre compte que la persistance dans le gestionnaire de tâches du process "Excel.exe" était bien souvent dû a du code peu rigoureux...

En synthèse, les erreurs types peuvent être:

(1) - la création d'une class Excel dans laquelle on implemente mal des
métodes Excel

(2) - faire un double appel de méthodes Excel
> d'une part propres a la class créées
et > d'autre part directements liées a Excel

(3) - Avoir de mauvaises procédures de construction et de destruction
d'objets


__(1)_____________________________________________________________________

Par exemple, je créé une class "clsXl" avec des variables membres :

Private WithEvents ocvXl As Excel.Application 'Appli XL mère /variable de class
Private WithEvents ocvWB As Excel.Workbook 'Classeur XL
Private WithEvents ocvSheet As Excel.Worksheet 'Feuille XL

Puis j'implémente une méthode, par exemple ''écrire'' dans une cellule :

'Ecriture dans cellule active
Public Sub Ecrire(Varpt1 As Variant)

ocvXl.ActiveCell.FormulaLocal = Varpt1

End Sub

Ici il faut bien faire attention a ne pas omettre la liaison de la méthode avec la variable membre de la class (ocvXl). Dans le cas contraire, VB créé par défaut 1 nouvel objet Xl qui ne sera pas détruit lors de "Set oXl = Nothing"

''Méthode liée à la variable " Méthode non liée à la
membre de la class" variable de la class"

ocvXl.ActiveCell.FormulaLocal = Varpt1 <> ActiveCell.FormulaLocal = Varpt1

__(2)_____________________________________________________________________

Où encore plus bête, j'appelle dans mon code une méthode Excel sans passer
par ma class...Et là, même scénario que précèdemment....VB créé en douce un deuxième objet Excel qui ne sera pas détruit a l'appel de
"Set oXl = Nothing".

Par exemple, dans mon code j'ai souvent besoin d'écrire dans une cellule Excel, j'ai donc implémenter la méthode écrire dans ma class :

'Ecriture dans cellule active
Public Sub Ecrire(Varpt1 As Variant)

ocvXl.ActiveCell.FormulaLocal = Varpt1

End Sub

Par contre, tout au long de mon code, je n'efface qu'une seule fois le contenu d'une cellule...donc pour ne pas surcharger ma class je pensais appeller qu'une seule fois et directement la fonction Excel corespondante (sans passer par ma class)

'Script Excel
Selection.ClearContents

A cet instant VB créé aussi un nouvel objet Excel qui ne sera pas détruit lors de "Set oXl = Nothing".

__(3)_____________________________________________________________________

Voici des exemples de construction et de destruction d'objet qui fonctionnent:

-----Dans 1 Form ---------------------------------------------------------------------

Option Explicit

Public oXl As clsXL 'Objet XL 'Instance de class

Private Sub Form_Load()

'Appel constructeur
Set oXl = New clsXL

'Appel destructeur
Set oXl = Nothing

End Sub


-----Dans 1 Class --------------------------------------------------------------------

Option Explicit

'Déclaration des variables de la class
'(WithEvents utilisé si renvoit d'évènements)
Private WithEvents ocvXl As Excel.Application 'Appli XL mère /variable de class
Private WithEvents ocvWB As Excel.Workbook 'Classeur XL
Private WithEvents ocvSheet As Excel.Worksheet 'Feuille XL

Private Sub Class_Initialize()

'XL:Création objet XL/Lancement aplli
Set ocvXl = New Excel.Application 'Appli

'XL:Création classeur XL
Set ocvWB = ocvXl.Workbooks.Add 'Classeur

'XL:Création feuille XL
Set ocvSheet = ocvWB.ActiveSheet 'Feuille

End Sub

---------------------

Private Sub Class_Terminate()
'(Toutes les variables instanciées de la class sont à détruire)

'ocvXl.ScreenUpdating = True 'Autorise MAJ modif

Set ocvSheet = Nothing 'Destruction Feuille

ocvWB.Close SaveChanges:=False 'Ferme classeur sans enregistrer chg
Set ocvWB = Nothing 'Destruction Classeur

ocvXl.Quit 'Quit appli XL
Set ocvXl = Nothing 'Destruction application

End Sub

Conclusion :


Pour tout renseignement complémentaire, n'hésitez pas a me laisser un
message sur ma boîte aux lettres "Vbfrance"

ou

directement sur "Daopossum@hotmail.com"

@+

A voir également

Ajouter un commentaire

Commentaires

cs_Axar
Messages postés
19
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
12 juillet 2012
-
serai-je t il le seul ou cela ne marche, j'ai bien esté le code mise à disposition, mais je retrouve les même problèmes, c'est a dire qu'une instance "Excel.exe" est toujours présente dans les process.
De plus, dans mon programme je suis amené à réouvrir Excel.
je tente d'entré la commande suivante :

With RapportCl.ActiveSheet.QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Data Source=192.168.59.37;Use Procedure for Prepare=1;Auto" _
, _
" Translate=True;Packet Size=4096;;Use Encryption for Data=False;Tag with column collation when possibl" _
, "e=False;Initial Catalog=ARCHIVES_TEST"), Destination:=Range("A1"))
.CommandType = xlCmdSql
.CommandText = Array(str_SQL)
.Name = "192.168.59.37 ARCHIVES_TEST ADHMVT"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
'.SourceConnectionFile = _
'"C:\travail\Mes sources de données\192.168.59.37 ARCHIVES_TEST ADHMVT.odc"
.Refresh BackgroundQuery:=False
End With

le programme s'arrete a la premiere ligne et affiche : "Erreur 1004, la méthode 'Range' de l'objet '_Global' a echoué"

pensant que c'etait a cause de l'instance Excel encore présente.
je la supprime et la j'ai le message qui me dit que le serveur distant n'est plus diponible.

je deviens fou avec Excel !!!!
Please Help me!!!!
Xiotos
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010
-
Salut. Felicitation pour l'explication. J'ai le problème et ne comprenait pas d'où ca pouvait venir. Mais maintenant grace à tes explications, c'est résolu. Merci encore.
rsbill
Messages postés
22
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
22 août 2007
-
Salut. Félicitations pour ton explication ça a l'air vraiment génial....sauf que j'ai rien compris! Je suis débutant.

Comme dirais un Michel célèbre: "désolé"
maxibesttof
Messages postés
3
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
3 novembre 2005
-
Pour ceux qui galerent toujours même après avoir lu ca:
http://www.vbfrance.com/code.aspx?ID=27541
jeromekj
Messages postés
9
Date d'inscription
mardi 8 janvier 2002
Statut
Membre
Dernière intervention
10 avril 2006
-
J'avais moi aussi quelques soucis avec ce $!@... de process 'EXCEL.EXE'. Ton petit cours m'a permi de résoudre définitivement le pbm. Merki bien.

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.