begin process at 2008 07 04 00:52:36
1 204 456 membres
3 nouveaux aujourd'hui
14 114 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

KILL "EXCEL.EXE"


Information sur la source

Catégorie :VBA Niveau : Débutant Date de création : 04/08/2003 Date de mise à jour : 04/08/2003 16:57:33 Vu : 14 535

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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"

@+
  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

  • signaler à un administrateur
    Commentaire de Mooiz le 06/08/2003 15:03:29

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

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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 ? )

  • signaler à un administrateur
    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) ???

  • signaler à un administrateur
    Commentaire de Labuzz le 02/02/2005 13:05:22

    Au fait VBiginieur >>>> "

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

    Pardon ?

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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é"

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Boutique

Boutique de goodies CodeS-SourceS