Kill "excel.exe"

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 187 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

Commenter la réponse de Greengold

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.