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"
@+
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.