begin process at 2010 02 10 14:32:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VBA

 > KILL "EXCEL.EXE"

KILL "EXCEL.EXE"


 Information sur la source

Note :
6,89 / 10 - par 9 personnes
6,89 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :VBA Niveau :Débutant Date de création :04/08/2003 Date de mise à jour :04/08/2003 16:57:33 Vu :15 902

Auteur : Daop

Ecrire un message privé
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

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"

@+


 Sources de la même categorie

Source avec Zip Source avec une capture METTRE À JOUR MASSIVEMENT L’ACTIVE DIRECTORY par legranche
SUPPRESSION DES DOUBLONS DANS PLAGE EXCEL par ucfoutu
Source avec Zip Source avec une capture SIMULATEUR DE VITESSE. par artgile
Source avec Zip Source avec une capture EDITEUR DE COMANDE VB6 ET VBA EXCEL par artgile
Source avec Zip Source avec une capture VBA EXCEL AFFICHER UN NUANCIER DES COULEURS AFIN DE CHOISIR ... par BILLOTmi

Commentaires et avis

Commentaire de Greengold le 04/08/2003 18:32:31

Je voudrais réagir sur un point : Public oXl As clsXL 'Objet XL 'Instance de class.
Avec cette ligne de code tu ne fais que créer ton objet en mémoire, ensuite pour pouvoir l'utiliser il faut l'instancier, et là on utilise Set oXl = New clsXL pour faire une instanciation différée en fait.
Si tu veux instancier à la déclaration, il faut faire : Public oXl As New clsXL

C juste une question de vocabulaire. Merci d'avoir partagé ton expérience.

Commentaire de VBbigineure le 05/08/2003 09:55:41

Ah là, chapeau, et c'est vraiment du niveau 1... Si un jour un truc comme ça m'arrive je pense que je tirerais très fort sur le fil gris qui pendouille de mon UC, et je ne le remettrais pas avant le lendemain en priant très fort pour que saint bill ait fait kekchose dans la nuit.

Commentaire de Keneyda le 05/08/2003 23:41:09

Trés belle source bien détaillé, dommage que tu ne l'es pas ecrite plutot, j'en avais besoin, il y a 1 mois :)
Je vais la tester

Merci
Keneyda

Commentaire de Mooiz le 06/08/2003 15:03:29

Moi j'en ai besoin maintenant et vraiment MERCI BEAUCOUP
10/10

Commentaire de huuuuu21 le 06/11/2003 16:23:37

ouaih ça marche super bien, mais pas sous 98, seulement sous XP (et surement sous 2000, mais je n'ai pas essayé) J'ai fait un programme, et j'utilise cette methode pour fermer excel. Mais il marche pas sous 98. excel reste toujours en process. Y'a t il un develloppeur dans l'avion ????

MyNemIsU

Commentaire de real_satanique le 03/02/2004 21:45:09

En  VBS j'utilise simplement:

Set appXL = WScript.CreateObject("Excel.Application")

... bal bla bla ...

appXL.quit
set appXL = Nothing

et excel se ferme à tous coup même si des référence à des élément d'excel (sheet...) n'ont pas été détruit

Commentaire de Labuzz le 02/02/2005 12:33:26

Bah C pas le cas en VB6.
Franchement ca tombe trop bien.
Je viens juste de rendre compte de ce problem aujourd'hui, et je franchement, pour la  premiere fois que je un probleme en programmation qui trouve une reponse simple, claire et efficace, ca se fait en moins de 5h koi.

TouT ca pour dire, plus jamais je ne chercherais une reponse sur le net plus de 5h ^^ et encore merci !

(Reste plus qu'a savoir comment on utilise la proprieter selection en passant par l'objet EXCEL.Application "appXL", Chiiiii Chuuuu selection t ou ? )

Commentaire de Labuzz le 02/02/2005 12:39:39

LOooL !
MDrrrr, je viens juste de relire mon poste.

Salut, voila le post en mode debboguer:

"Je viens juste de me rendre compte de ce probleme aujourd'hui meme, et franchement, pour la  premiere fois que je suis confronter a un probleme en programmation qui trouve sa reponse simplement, clairement  et efficacement, ca se fait en moins de 5h (tout cours !)

Tout ca pour dire QUE plus jamais je ne chercherais une reponse sur le net plus de 5h ^^ et encore merci !"

Enfin le seul truc a retenir dans ce que je raconte C merci.

Tu t vu quand t'a bus ???  (0.o) ???

Commentaire de Labuzz le 02/02/2005 13:05:22

Au fait VBiginieur >>>> "

Haaaaaaaaaaaaaaaaaaaaaaaaaaaaaa hahahahahahaha.
Mouhahahhahaha
Trop MoRt De RiRe !!!!!

Pardon ?

Commentaire de admchocob74 le 04/02/2005 12:28:49

Concernant la création d'une nouvelle instance de tes objets,
tu auras le même problème en utilisant des block with

exemple:
With Feuille1.Range("A3", "E3").Font
    .Size = 12
    .Bold = True
    .Color = vbBlack
End With

dans ce cas précis il suffit de remplacer le code par :

Feuille1.Range("A3", "E3").Font.Size = 12
Feuille1.Range("A3", "E3").Font.Bold = True
Feuille1.Range("A3", "E3").Font.Color = vbBlack

arfff.... Avec des copier/coller c'est pas trop fatiguant lol

Commentaire de Corsair111 le 14/03/2005 19:34:51

Super. J'ai le même problème.
J'avais trouvé qu'une simple déclaration dans la procédure en cours avec un Set AppXl= nothing à la fin marchait.
Mais là je me heurte à nouveau au problème.
Par contre je passe par deux autres procédures auquelles je passe les paramètres MonClasseur et MaFeuille. J'ai bien le quit et le nothing.Et là Excel reste en instance.
Mais j'utilise des blocs with et en lisant tous les mails, j'ai vu que c'était pas bon.

Merci à tous de vos commentaires.

Commentaire de jeromekj le 23/04/2005 00:22:44

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.

Commentaire de maxibesttof le 03/11/2005 10:48:47

Pour ceux qui galerent toujours même après avoir lu ca:
http://www.vbfrance.com/code.aspx?ID=27541

Commentaire de rsbill le 18/05/2006 16:08:35

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é"

Commentaire de Xiotos le 17/08/2006 10:18:22

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.

Commentaire de Axar le 20/06/2007 15:06:58

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!!!!

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales