IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Application Excel - Tuer le processus EXCEL.EXE?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Par défaut Application Excel - Tuer le processus EXCEL.EXE?
    Bonjour, je me suis créer une formulaire qui permet d'exporter des rapports financiers vers Excel. Toute marche #1 hors cependant le processus Excel reste toujours actif même lorsque l'utilisateur ferme le fichier Excel, et à chaque fois qu'il produit le rapport cela lance un nouveau processus Excel qui ne se ferme jamais.

    Bref, s'il fait plusieurs fois le rapport en une journée, cela fait plusieurs processus EXCEL.EXE ouvert et cela bouffe de la mémoire.

    En gros mon code:

    Ouvre mon "modèle" de rapport en read-only.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     wbExcel = appExcel.Workbooks.Open(strCheminRapports & "\rapportjournalier.xls", , True)
    Ensuite tout mon code qui produit et inscrit mes nombres dans mon rapport.

    Et une fois terminé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    appExcel.Visible = True 'Afficher l'application Excel
     
    wsExcel = Nothing 'Purger la feuille Excel en mémoire
    wbExcel = Nothing 'Purger le classeur Excel en mémoire
    appExcel = Nothing 'Purger l'application Excel en mémoire
    Donc voila je croyais que mes 3 dernieres lignes de code aurait stoppé le processus EXCEL.EXE, mais non il reste toujours ouvert.

    Suggestions?

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Essaye de rajouté ceci à la fin de ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //
    // Double appel à Collect et WaitForPendingFinalizers
    // En effet, le référence mémoire vers Excel peut-être conservée après le 1er appel
    // On demande donc un deuxième passage du Garbage Collector
    //
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();

    (Attention, c'est du C#, faut convertir en VB.NET )

    Sinon, regarde si ton objet appExcel ne possède pas une méthode Quit ou CLose

    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Par défaut
    Cela semble fonctionner, merci énormément.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Par défaut
    En faite après test, ca fonctionne pas

    Et je peux pas faire un appExcel.Close() car il va me fermer Microsoft Excel et moi je veut qu'il reste ouvert le temps qu'il consulte
    /imprime les données. Cependant je veux que lorsque l'usager ferme le fichier Excel que le processus Excel.exe se kill.

  5. #5
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Essayes sur un evenement de fermeture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Process[]  excels; 
    excels = Process.GetProcessesByName("Excel") ;
    foreach (Process p in excels)
     {p.Kill();}

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Par défaut
    Merci encore une fois neguig, ca fonctionne #1. Je n'ai simplement qu'a appeler cette fonction lors de la fermeture de mon formulaire et les processus sont tous tués

    Merci énormément, cela va permettre a l'utilisateur d'économiser beaucoup de ressources.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    Merci depuis le temps que j'ai le même probleme j'avais abandonné l'idée même de pouvoir le résoudre un jour.

  8. #8
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    tu fais koi avec ton excel t'es en mode lecture seulement ou pas ??

    je m'explique javais le meme probleme jusqu'a que je procede comme il se doit et je nais pas besoin d'utiliser de rechercge de process pour les tuer (ca encore ca va) ou pire !!!!!! appeler le GC a nouveau .

  9. #9
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut !
    perso je fini par une méthode "Quit" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Public Sub Quit()
            If Not IsNothing(XLSSheet) Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(XLSSheet)
                XLSSheet = Nothing
            End If
            If Not IsNothing(XLSBook) Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(XLSBook)
                XLSBook = Nothing
            End If
            If Not IsNothing(XLSApp) Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(XLSApp)
                XLSApp = Nothing
            End If
        End Sub
    où bien sûr XLSApp correspond à l'appli, XLSSheet à la feuille et XLSBook au classeur

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut aidez moi
    voila je me permet de vous demander une petit aide comme j'ai vu que tu travail sur visual et excel! j'explique
    j'ai un fichir excel qui gére mes données, c-a-d; j'ai un magasin de meuble et j'ai deux depot, sur mon classeur excel j'ai des feuilles chaque feuille presente un fournisseur, et chaque feuille (fournisseur) affiche les données des articles, 1) ID articles
    2) NOM d'article
    3) Mag 1
    4) mag 2
    5) mag 3
    6) client.
    1) c'est le code que je donne a chaque article (texte)
    2) c'est le nom de chaque article (texte)
    3)+4)+5) le nombre present d'article a chaque magasin (numerique)

    ce qu'il me faut c'est que le classeur soit désactivé, et si on veux modifier quelque la quantité dans les colonne 3.4.5.6, faudras remplire un petit formulaire qui sera demander automatiquement en clic sur une des 4colonne,
    et si une quantité va vers le clients, je veux que le fichier exe demande un commentaire;
    ca serai vraiment genial de votre part,
    merci merci

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    hello,

    le problème du killprocess c'est qu'il tue le processus et peut-être qu'il tuera celui qui n'est pas bon.

    Je suis sur visual studio 2005 et code en vb.

    pour fermer excel, j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       objExcel.ActiveWorkbook.Close() 'Fermeture d'Excel
                objExcel.DisplayAlerts = True 'remet l'alerte  oui=True   non=False
                objExcel.Quit()
     
                objClasseur = Nothing
                objExcel = Nothing
     
                GC.Collect()
    la dernière ligne permet de mettre à jour les processus et de les fermer s'ils ne sont plus utiles.

    A+

  12. #12
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Par défaut
    Bonjour à tous,

    J'ai eu le même problème...
    Effectivement en utilisant le "kill du Process", cela risque de tuer tous les processus et même pire fermer (kill) des applications excel qui n'ont rien à voir avec l'application en cours. Cela peut être énervant pour l'utilisateur qui voit son fichier excel de personnel fermé automatiquement...entre autre

    Bref,

    En C#, j'ai ajouté ceci et ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*
            Microsoft.Office.Interop.Excel.Application oXL;
            Microsoft.Office.Interop.Excel._Workbook oWB;
            Microsoft.Office.Interop.Excel._Worksheet oSheet;
    */
                    oXL.Parent.Quit();
                    // ferme et tue le processus en cours uniquement.
                    oWB = null;
                    oXL = null;
                    GC.Collect();
    Personnellement, j'utilise ceci pour générer automatiquement un fichier Excel mais dès que les données ne sont pas disponibles, une erreur est lancée et les fichiers valides restent ouverts tandis que les mauvais (dans mon appli, je crée un fichier que je commence à remplir avant d'atteindre une éventuelle exception) fichiers sont supprimés.

    Mon souci maintenant est d'empêcher l'apparition de la fenêtre de notification de Windows "Voulez-vous enregistrer des modifications...". Personnellement, je voudrais que le kill du process générant l'erreur se fasse dans la transparence. Si quelqu'un aurait une idée, je suis preneur.

    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oXL.UserControl = false;
    mais ça ne change rien...

    Bien à vous.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut
    Bonjour

    Si ça peut aider, voici ce que j'utilise pour créer le processus Excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Public Sub NouveauXL()
        '
        'permet de créer un processus et de vérifier son ID
        '
     
        'très utile car un processus Excel® ne se quitte pas correctement donc obligé de le tuer
      Private ProcId% = 0
     
        ' Liste des processus avant la création Excel®
        Dim Process1() As Process = Process.GetProcesses()
     
        xlApp = New Excel.Application
     
        ' Liste des processus après Excel® : la différence donnera l'ID créé
        Dim Process2() As Process = Process.GetProcesses()
     
        Dim i%, j%
        Dim bMonProcessXL As Boolean
     
        For j = 0 To Process2.GetUpperBound(0)
            If Process2(j).ProcessName = "EXCEL" Then
                bMonProcessXL = True
     
                'Listing des processus avant la création Excel®
                For i = 0 To Process1.GetUpperBound(0)
                    If Process1(i).ProcessName = "EXCEL" Then
                        If Process2(j).Id = Process1(i).Id Then
     
                            ' S'il existait avant, ce n'est pas celui recherché
                            bMonProcessXL = False
                            Exit For
                        End If
                    End If
                Next i
     
                If bMonProcessXL = True Then
                    'Recopie de l’identifiant du processus créé
                    ProcId = Process2(j).Id
                    Exit For
                End If
            End If
        Next j
    End Sub
    Et ce que j'utilise pour le tuer (seule l'application ouverte sera tuée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub TuerObjetXL()
        '
        'Permet de tuer le processus Excel®
        '
     
        If ProcId = 0 Then Exit Sub
        Process.GetProcessById(ProcId).Kill()
        ProcId = 0
    End Sub

  14. #14
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Par défaut
    Citation Envoyé par Julien V Voir le message
    Bonjour

    Si ça peut aider, voici ce que j'utilise pour créer le processus Excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Public Sub NouveauXL()
        '
        'permet de créer un processus et de vérifier son ID
        '
     
        'très utile car un processus Excel® ne se quitte pas correctement donc obligé de le tuer
      Private ProcId% = 0
     
        ' Liste des processus avant la création Excel®
        Dim Process1() As Process = Process.GetProcesses()
     
        xlApp = New Excel.Application
     
        ' Liste des processus après Excel® : la différence donnera l'ID créé
        Dim Process2() As Process = Process.GetProcesses()
     
        Dim i%, j%
        Dim bMonProcessXL As Boolean
     
        For j = 0 To Process2.GetUpperBound(0)
            If Process2(j).ProcessName = "EXCEL" Then
                bMonProcessXL = True
     
                'Listing des processus avant la création Excel®
                For i = 0 To Process1.GetUpperBound(0)
                    If Process1(i).ProcessName = "EXCEL" Then
                        If Process2(j).Id = Process1(i).Id Then
     
                            ' S'il existait avant, ce n'est pas celui recherché
                            bMonProcessXL = False
                            Exit For
                        End If
                    End If
                Next i
     
                If bMonProcessXL = True Then
                    'Recopie de l’identifiant du processus créé
                    ProcId = Process2(j).Id
                    Exit For
                End If
            End If
        Next j
    End Sub
    Et ce que j'utilise pour le tuer (seule l'application ouverte sera tuée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub TuerObjetXL()
        '
        'Permet de tuer le processus Excel®
        '
     
        If ProcId = 0 Then Exit Sub
        Process.GetProcessById(ProcId).Kill()
        ProcId = 0
    End Sub


    Bonjour Julien,

    Apparemment ceci est du VB, je suis encore débutant en programmation...
    Je vais essayer de l'adapter, cela ne devrait pas pauser de contraintes...

    Merci pour cette méthode.

  15. #15
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Hello,
    pour ces solutions, ca faisais aussi un bout de temps que je bloquais la dessus... je retien particulièrement la solution de Julien V que je testerai dès demain au boulot.

    Pour mamamiya_ :
    Citation Envoyé par mamamiya_ Voir le message
    Mon souci maintenant est d'empêcher l'apparition de la fenêtre de notification de Windows "Voulez-vous enregistrer des modifications...". Personnellement, je voudrais que le kill du process générant l'erreur se fasse dans la transparence. Si quelqu'un aurait une idée, je suis preneur.

    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oXL.UserControl = false;
    mais ça ne change rien...

    Bien à vous.
    il y a surement plus beau mais si tu l'enregistre tu n'auras plus ce message, donc tu l'enregistre, tu ferme ton appli (sans message puisque enregistré) et tu effaces le fichier enregistré.

    encore à vous pour ces solutions et ce post fort instructif

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] tuer le processus Excel courant dans Access
    Par comme de bien entendu dans le forum VBA Access
    Réponses: 8
    Dernier message: 20/12/2012, 12h37
  2. Tuer un processus (Excel pour ne pas le citer)
    Par PsykotropyK dans le forum Access
    Réponses: 11
    Dernier message: 11/10/2006, 10h05
  3. Tuer un processus Excel dans Access
    Par Jordmund dans le forum Access
    Réponses: 4
    Dernier message: 29/08/2006, 08h59
  4. VB6: tuer le processus Excel
    Par Svart26 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/07/2006, 08h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo